2 분 소요

배경

필자는 palgona 프로젝트에서 배포를 담당하고 있다. 이전까지는 기능을 개발하고 develop 브랜치에 merge한 후 수동으로 서버에 들어가서 재배포를 수행했었다. 매번 수동으로 Docker image를 생성해서 다시 실행시켰었는데 서버 성능도 좋지 않아서 빌드 중에 멈추거나 시간이 오래 걸리는 일이 다반사였다. 그래서 이를 자동화하면 좋겠다고 생각했고 사용하기 간편한 github Action를 통해 CI/CD를 구축했다. CI/CD에 대해서 잘 모른다면 CI/CD & 무중단 배포를 참고하자.

이번 포스팅에서는 필자가 CI/CD를 구축한 과정에 대해서 설명하겠다.


Github Action

먼저 Github Action에 대해서 간단하게 알아보자.

Workflow

하나의 자동화된 프로세스로 여러 Job으로 구성되고 특정 Event가 발생했을 때 실행된다. Workflow 파일은 yml 파일로 작성되며 .github/workflows/ 경로에 저장된다.

Event

Workflow가 실행되도록 하는 특정한 활동이나 규칙을 의미한다.

ex) 특정 브랜치에 push가 발생하거나 pull-request가 발생하거나 하는 일련의 과정 등등.

Job

여러 Step으로 구성되며, 가상 환경의 인스턴스(Runner)에서 실행된다.

다른 Job과 의존 관계를 가질 수도 있고, 독립적으로 병렬 실행될 수도 있다.

Step

Task들의 집합으로, 커맨드를 실행하거나 Action을 실행할 수 있다.

Action

가장 작은 단위로 Job을 만들기 위해 step들을 연결한다.

Runner

Workflow가 실행되는 인스턴스를 말한다. 간단하게 github에서 빌려주는 작은 서버라고 생각하면 된다.
위의 개념을 기반으로 palgona 프로젝트에 적용한 workflow 파일을 보자.

Workflows/dev.yml

img1img1

전체 코드는 위와 같다. 하나씩 살펴보자.

실행 조건 (Event)

img1

위에서 설명한 Event 개념을 생각하면 된다. develop 브랜치에 push나 pull-request가 발생하면 해당 workflow 파일이 실행된다는 뜻이다.

실행 환경 (Runner)

img1

runs-on은 runner가 어떤 환경으로 실행될지 지정하는 부분이다. 필자는 ubuntu 환경을 설정했다.

step

img1

Job을 구성하는 step들에 대해서 살펴보자. step은 name을 통해 이름을 어떤 작업인지 이름을 지어줄 수 있다. 그리고 uses와 run이 있는데 uses는 이미 있는 것을 쓰는 것이고 run은 직접 실행한 명령어를 지정하는 것이다.

actions/checkout@v4 부분은 chekout을 하는 부분인데 레포지토리의 코드를 runner로 옮기는 부분이다. actions/setup-java@v4에서는 jdk를 설정하는데 이 프로젝트는 jdk-17을 사용하고 있기 때문에 17로 설정했다.

application.yml 생성

img1

이 부분은 application.yml 파일을 생성해서 넣는 부분이다. github에는 일반적으로 민감한 정보가 들어있는 application.yml 파일을 올리면 안 된다. 하지만 빌드를 하기 위해서는 여러 설정 정보가 들어있는 apllication.yml 파일이 있어야 한다.

github은 이러한 민감한 설정 정보를 저장하고 불러올 수 있는 기능을 제공한다.

github repostiroy -> settings -> Secrets and variables에서 이러한 값들을 저장해둘 수 있다.

img1

이렇게 설정한 변수는 workflow 파일에서 $ 으로 접근할 수 있다.

애플리케이션 빌드

img1

여기서는 gradlew에 실행 권한을 주고 테스트 없이 빌드를 진행하게 된다.

도커 build 및 push

img1

다음으로 docker를 빌드하고 docker hub에 푸시하는 부분이다. 마찬가지로 docker username과 password는 민감한 정보이기 때문에 github에 저장해둔 값을 사용했다.
당연히 도커를 빌드하기 위해서는 Dockerfile이 있어야 한다. (commit 방식은 잘 사용 X)

Dockerfile

img1


배포

img1

마지막으로 서버에 배포하는 부분이다. 기존에 ec2 t3 micro를 사용하고 있었는데 Docker build할 때 ec2 멈춤 현상이 자주 발생해서 아직 학교를 다니고 있는 팀원의 학교 서버를 사용해서 배포를 진행했다. 👍

ssh-action은 ssh로 접근할 때 많이 사용되는 프로젝트이다. 사용법은 간단한데 host에 public IPv4 주소를 넣어주고 username에 접속 대상 Id, password에 private Key를 넣어주면 된다. 물론 이 정보들은 외부에 공개되면 안 되기 때문에 github에 세팅해뒀다.

그리고 ssh로 서버에 접속한 이후에 이전에 실행하던 컨테이너, 이미지를 삭제한 후 docker hub에서 새로 생성한 이미지를 pull 받아서 실행시켜줬다.
이로써 CI/CD 파이프라인 구축을 완료했다.

참고