집잇다 프로젝트를 어느정도 마무리해가며 이제 CI/CD를 해야겠다는 마음을 먹었다.
CI/CD가 뭔가요?
- CI: 코드를 Github에 올리면 자동으로 Build해서 확인해주는 것 - CD: 빌드된 걸 자동으로 배포까지 해주는 것이번엔 일단 CI까지 해보고 AWS로 서버 구축 후 CD도 도전해보도록 하자!
이전 회사에서 진행했던 프로젝트들은 Jenkins를 이용해서 배포를 할 수 있도록 되어있었는데 내가 직접 파이프라인을 설계한 것은 아니었기 때문에 사용할줄만 알지 직접 구축해본적은 없었다.
Github Actions를 이용하면 CI 자동화를 쉽게 할 수 있다고 해서 한 번 도전해보았다.
Github에 코드를 push하면
→ 자동으로 JAR을 빌드하고
→ Docker 이미지로 만들고
→ DockerHub에 자동 업로드까지
👉 자동화된 CI 파이프라인을 구축하는 것이 목표!
내가 만든 프로젝트는 zipitda라는 이름의 Spring Boot 기반 웹 애플리케이션이었다.
→ https://github.com/abcdana/zipitda
원본 레포지토리에서할지 아니면 fork해온 내 계정의 레포지토리에서 할지 고민을 했는데 원본 레포지토리에선 설정권한이 없기 때문에 안될 수 있다.
→ 꼭 내 계정의 리포지토리에서 해야 한다는 것이 중요하다.
→ 내가 원본 레포지토리의 Collaborator로 등록되어 있고, Write 권한 이상이 있다면 원본 리포지토리에서도 가능함

https://hub.docker.com 에서 계정을 만들고, zipitda라는 이름으로 Repository도 만들어줬다. 처음엔 public으로 해두면 관리가 편하다.

name: CI - Build and Push Docker Image
on:
push:
branches: [ main ] # main 브랜치에 push 될 때만 동작
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: 코드 받아오기
uses: actions/checkout@v2
- name: JDK 17 설치
uses: actions/setup-java@v2
with:
java-version: '17'
distribution: 'temurin'
- name: Gradle 빌드 실행
run: ./gradlew build
- name: DockerHub 로그인
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Docker 이미지 빌드
run: docker build -t yourdockerid/zipitda:latest
- name: DockerHub에 업로드
run: docker push yourdockerid/zipitda:latest
각자 상황에 맞게 yml파일을 작성하면 된다.

Github에 내 DockerHub 계정 비밀번호를 직접 코드에 넣을 수는 없으니까
Github의 Secrets 기능을 사용한다.

코드에 살짝 수정하고 Github에 push해보면 Github → Actions 탭에서 실행되는 것을 확인할 수 있다. 오예

DockerHub에서 내가 올려놓은 docker image 확인이 가능하다.
초기에는 ./gradlew build로 빌드했지만, 통합 테스트가 Redis와 MySQL을 필요로 해서 CI 환경에서는 실패가 발생했다. 그래서 테스트는 제외하고 build하도록 수정했다.
./gradlew build -x test
또한 집잇다는 develop브랜치에 feature브랜치들을 merge하는 방식으로 작업했고, 아직 master(main) 브랜치로 병합은 하지 않았기 때문에 CI테스트를 하기위해 develop브랜치에 push될 때 마다 실행되도록 설정하였다.
on:
push:
branches: [ develop ]
처음엔 잘 몰라서 어렵다고 생각했던 CI 자동화인데 막상 해보니 별거 없었다..
다음엔 이 CI에 CD(자동 배포)까지 붙여서 서버에 자동으로 배포되게 만드는 것도 도전해볼 예정이다.