gitaction으로 ci/cd하기

스프링 프로젝트 Github action으로 CI 자동화하기 에서 CI자동화를 완성했는데, 이후 aws ec2로 배포하면서, 배포까지 자동화하였다.

aws 자동화에 매우 다양한 방법이 있었으나, 최소한 간소화 하기 위하여 아래 순서로 배포하였다.

  1. gradle test
  2. docker 빌드 후 docker hub에 push
  3. aws ssh 연결 후 docker hub에서 이미지 pull 이후 docker compose up -d

.github/workflows/ci-cd.yml

.env에 들어갈 정보에 대해서는 절대로 github에 공개되어선 안 된다.

github repository Settings > Security > Secrets and Variables > Actions 에서 각 키와 값을 작성해주면 된다.

name: Java CI with Gradle and Docker Deployment

on:
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout repository
        uses: actions/checkout@v3

      - name: Set up JDK 17
        uses: actions/setup-java@v3
        with:
          java-version: '17'
          distribution: 'temurin'

      - name: Grant execute permission for gradlew
        run: chmod +x gradlew

      - name: Build JAR File with Gradle
        run: ./gradlew clean build

      - name: Verify JAR File
        run: ls -l build/libs/

      - name: Log in to Docker Hub
        run: echo "${{ secrets.DOCKER_PASSWORD }}" | docker login -u "${{ secrets.DOCKER_USERNAME }}" --password-stdin

      - name: Build Docker Image
        run: |
          docker build -t ${{ secrets.DOCKER_USERNAME }}/web-library:latest .
          docker tag ${{ secrets.DOCKER_USERNAME }}/web-library:latest ${{ secrets.DOCKER_USERNAME }}/web-library:$(date +%Y%m%d%H%M)

      - name: Push Docker Image to Docker Hub
        run: |
          docker push ${{ secrets.DOCKER_USERNAME }}/web-library:latest
          docker push ${{ secrets.DOCKER_USERNAME }}/web-library:$(date +%Y%m%d%H%M)

  deploy:
    needs: build
    runs-on: ubuntu-latest

    steps:
      - name: Deploy to EC2
        uses: appleboy/ssh-action@master
        with:
          host: ${{ secrets.EC2_HOST }}
          username: ${{ secrets.EC2_USER }}
          key: ${{ secrets.EC2_SSH_KEY }}
          script: |
            docker login -u "${{ secrets.DOCKER_USERNAME }}" -p "${{ secrets.DOCKER_PASSWORD }}"
            docker pull ${{ secrets.DOCKER_USERNAME }}/web-library:latest
            docker compose down || true  # 기존 컨테이너 중지 (없어도 계속 진행)
            docker compose up -d --remove-orphans

댓글

개발자  김철준

백엔드 개발자 김철준의 블로그입니다.

주요 프로젝트