도커 이미지를 지속적으로 만드는 번거로움을 해결하기 위해, GitHub Actions을 사용하여 도커 이미지를 자동으로 빌드하는 CI(Continuous Integration) 코드를 구현했다.
빌드에 필요한 환경 변수는 github에 등록해주어야 한다. 각 시크릿 변수와 환경 변수는
Setting -> Secrets and variables -> Actions로 가서 추가할 수 있다.
Secrets : 민감한 정보 저장Variables : 시크릿이 필요하지 않은 일반 환경 설정 정보 저장Repository: 해당 리포지토리에서만 사용할 값 저장Organization : 모든 리포지토리에서 사용할 값을 저장. 
GitHub Actions를 설정하기 위해 먼저 루트 폴더에 .github/workflows/notice-deploy.yaml 파일을 만들어준다. 이 파일이 생성되면 GitHub Actions가 자동으로 동작한다.
name: Build and Push Docker Image
on:
push:
branches:
- main
pull_request:
branches:
- main
jobs:
build-and-push-image:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Set up JDK 17
uses: actions/setup-java@v2
with:
distribution: 'temurin'
java-version: '17'
- name: Build with Gradle
run: |
cd msa-notice
chmod +x ./gradlew
./gradlew build
env:
DATABASE_URL: ${{ secrets.DATABASE_URL }}
DATABASE_USERNAME: ${{ secrets.DATABASE_USERNAME }}
DATABASE_PASSWORD: ${{ secrets.DATABASE_PASSWORD }}
RABBITMQ_URL: ${{ env.RABBITMQ_URL }}
RABBITMQ_PORT: ${{ env.RABBITMQ_PORT }}
RABBITMQ_USERNAME: ${{ secrets.RABBITMQ_USERNAME }}
RABBITMQ_PASSWORD: ${{ secrets.RABBITMQ_PASSWORD }}
UNIV_RECOMMENDATION_URL: ${{ env.UNIV_RECOMMENDATION_URL }}
EXTERNAL_RECOMMENDATION_URL: ${{ env.EXTERNAL_RECOMMENDATION_URL }}
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
- name: Login to DockerHub
uses: docker/login-action@v1
with:
username: ${{ secrets.DOCKERHUB_NAME }}
password: ${{ secrets.DOCKERHUB_PASSWORD }}
- name: Build and push Docker image
run: |
cd msa-notice
docker build -t ${{ secrets.DOCKERHUB_NAME }}/msa-notice:latest .
docker push ${{ secrets.DOCKERHUB_NAME }}/msa-notice:latest
워크플로우의 이름. 여기서는 "Build and Push Docker Image"이 이름이다.
워크플로우를 트리거하는 이벤트. main 브랜치로의 푸시나 풀 리퀘스트가 발생할 때 워크플로우가 실행된다.
워크플로우 내에서 수행할 작업을 정의한다. 여기서는 하나의 작업인 build-and-push-image가 있다.
name : "Checkout"
uses : actions/checkout 액션을 사용하여 현재 저장소를 체크아웃한다.
name: "Set up JDK 17"
uses: actions/setup-java 액션을 사용하여 JDK 17을 설정
with: JDK의 배포판과 버전을 지정한다. 여기서는 Temurin 배포판의 JDK 17을 사용합니다.
name: "Build with Gradle"
run: 셸 명령어를 실행합니다.
- cd msa-notice: msa-notice 디렉토리로 이동
- chmod +x ./gradlew: Gradle 래퍼 스크립트에 실행 권한을 부여
- ./gradlew build: Gradle을 사용하여 프로젝트를 빌드
env: 빌드 과정에서 사용할 환경 변수를 설정한다. GitHub에 환경 변수를 커밋할 수는 없기에, 빌드 시 필요한 민감한 정보는 github 환경변수 등록한 후 시크릿은secrets.으로 환경변수는env.으로 가져와 사용한다.
name: "Login to DockerHub"
uses: docker/login-action 액션을 사용하여 DockerHub에 로그인한다.
with: DockerHub 로그인 정보로 사용할 시크릿 변수를 지정한다.
name: "Build and push Docker image"
run: 셸 명령어를 실행합니다.
- cd msa-notice: msa-notice 디렉토리로 이동합니다.
- docker build -t ${{ secrets.DOCKERHUB_NAME }}/msa-notice:latest .: 도커 이미지를 빌드한다.
- docker push ${{ secrets.DOCKERHUB_NAME }}/msa-notice:latest: 빌드한 도커 이미지를 DockerHub에 푸시한다.

성공 메시지가 표시된 후, Docker Hub에 가보면 이미지가 잘 생성된 것을 확인할 수 있다.
