Github Actions(CI/CD 구축) - 일반 프로젝트에서 많이 쓰는 CI/CD

2025. 10. 15. 17:09CI\CD/CI\CD 종합

반응형

이전에는 서버를 실행하는 EC2에서 직접 git pull을 받고 빌드과정을 진행한 후에 서버를 실행했었다.

이번에는 빌드작업은 Github Actions의 runner 내부에서 진행하고 이 빌드된 파일만 서버로 전달하여 서버 내에서 실행만 진행하는 과정으로 CI/CD를 구축해보도록 하자.

초기 서비스는 단순하게 시작하고 실제 사용량과 문제가 드러날 때 필요한 만큼만 확장한다. 처음부터 대규모 아키텍처를 꾸리면 개발·운영이 복잡해져 속도와 비용이 증가하므로 확장 필요성이 확인될 때 고도화하는 것이 효율적이다

그렇기에 해당 방식은 초기 서비스에 적절한 방법이라고 할 수 있겠다.

 

1. 기존 서비스 제거

먼저 EC2에 돌아가고 있는 서비스와 프로젝트는 제거해주자.

lsof -i :8080 => 서비스 구동 확인

만약 실행중이지 않다면 그냥 넘어가고 실행중이라고 한다면

sudo fuser -k -n tcp 8080

을 통해서 서비스를 종료해주자.

 

그리고 프로젝트 디렉터리를 제거해주자.

 rm -rf simple_ci_cd_practice

 

 

이제 workflow를 작성해주자.

 

2. Workflow 작성

이전에 사용하던 workflow에서 SSH를  하는 step의 위쪽에서 github의 repo에서 소스를 runner로 내려받을 수 있도록 하기 위해서 Github Actions의 Checkout action을 사용하자.

이러면 이제 runner에 레포의 소스를 내려받은 상태이다.

 

그리고 이제 자바소스를 컴파일 할 수 있는 jdk를 설치해줘야한다

jdk는 action중 setup java jdk를 사용해야한다.

https://github.com/marketplace/actions/setup-java-jdk

 

Setup Java JDK - GitHub Marketplace

Set up a specific version of the Java JDK and add the command-line tools to the PATH

github.com

사용법은 위에 있으나 잠깐 보자면

이렇게 특정 JDK를 설정해서 setpu해주면 runner의 내부에 JDK를 설치해준다.

이를 추가해보자면 우린 그냥 간단하게 zulu의 17버전을 설치해주자.

그리고 application.properties를 만들어서 checkout받은 소스의 resources에 위치시켜주자.

 

이제 테스트 및 빌드하는걸 step으로 따로 빼줄건데 windows에서 커밋하면 빌드 하는 gradlew가 executable하지않게 실행되는 경우가 있어서

이렇게 execute 권한을 추가해준 후에 빌드 작업을 추가해주자.(깃으로 처음 올릴때 execute권한이 없으면 해당 권한은 리눅스에 가서도 동일하게 계속 없는 상태로 유지된다는 듯으로 보임, windows의 경우는 이런 권한 같은것 없이 올리기에 그런걸로 보인다고함)

 

그리고 나중에 이렇게 빌드된 파일을 동일한 명칭으로 찾아 전송하기 쉽게 설정하기 위해서 jar파일의 명칭을 쉽게 바꿔주자.

이렇게 이름을 바꿔서 프로젝트의 루트 위치에 옮겨 놓자.

 

그리고 이제 이렇게 빌드된 파일을 EC2로 전달하기 위해서는 SCP라는 것을 사용해서 전달할 것이다.

SCP는 https://github.com/marketplace/actions/scp-files

 

SCP Files - GitHub Marketplace

Copy files and artifacts via SSH

github.com

 

해당 action을 사용해서 SCP를 쉽게 할 수 있는 라이브러리를 사용할 것이다 

사용방법은 위 홈페이지에 있는데 아래와 같다.

 

우리의 경우는 기존에 host, usename, password의 경우는 그대로 사용하고 source는 외부로 꺼내놓은 project.jar파일을 사용하고 해당 파일은 우리가 기존에 구분 될 수 있게 EC2에 생성했던 디렉터리에 새로운 jar파일만 들어가 있을 new 로 지정해주자

 

이렇게 전송이 됐다면 EC2에 SSH로 접속해서 

먼저 now라는 디렉터리가 기존에 존재할 것이라는 가정하에 제거해주고 

now 디렉터리를 다시 만들어주고 

project.jar을 new에서 now로 이동시켜주자.

그리고 now로 이동해준 다음에

서버를 키기 전에 서버가 실행중일 가능성이 있기에 서버를 종료하는 명령어를 추가해준다 

❘❘ true는 서버가 없다면 에러가 나는걸 방지하기 위해서 넣은것

이제 jar파일을 실행시켜주자.

> output.log 2>&1 & 는 서버의 에러 및 정상로그를 output.log로 쏘게 하겠다는 의미고 마지막 &은 백그라운드에서 실행하겠다는 기능을 한다.

그리고 이제 new에 있는 디렉터리는 제거해주자.

 

이제 이렇게 한 후에 commit & push를 해보자.

보면 빌드랑 SSH로 정상적으로 잘 붙은걸 볼 수 있다.

내부에 서버가 켜져잇는지를 보면

잘 켜진걸 볼 수 있다.

파일은

이거만 존재하는 걸 볼 수 있다.

반응형