CD 파이프라인 구성 및 도메인 구입

서론

서버에 배포를 완료하고 나자 생각보다 플로우가 간단해서 충분히 자동화할 수 있겠다는 생각이 들었고, Github action을 통해 시도하게 되었다.
이전의 프로젝트에서 scp로 jar파일을 ec2 인스턴스에 보내던 방식보다 훨씬 빠르고 간편하게 구성할 수 있었다. 도커가 깊이 들어가면 러닝커브가 높지만 이렇게 간단하게 쓸 때에는 엄청 편리한 것 같다.

CD 파이프라인

name: Deploy to Production

on:
  push:
    branches: [ main ]

jobs:
  build-and-deploy:
    runs-on: ubuntu-latest
    defaults:
      run:
        working-directory: final/Backend

    steps:
      - name: Checkout code
        uses: actions/checkout@v4

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

      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3

      - name: Login to Docker Hub
        uses: docker/login-action@v3
        with:
          username: ${ { secrets.DOCKER_USERNAME } }
          password: ${ { secrets.DOCKER_PASSWORD } }

      - name: Build and push Backend Docker image
        uses: docker/build-push-action@v6
        with:
          context: ./final/Backend
          push: true
          tags: rabent0207/final-penet-backend:latest
          build-args: |
            API_KEY=${ { secrets.API_KEY } }
            JWT_KEY=${ { secrets.JWT_KEY } }
 
      - name: Build and push Frontend Docker image
        uses: docker/build-push-action@v6
        with:
          context: ./final/Frontend/final-front
          push: true
          tags: rabent0207/final-penet-frontend:latest

      - name: Deploy to EC2
        uses: appleboy/ssh-action@v1
        with:
          host: ${ { secrets.EC2_HOST_IP } }
          username: ${ { secrets.EC2_USERNAME } }
          key: ${ { secrets.EC2_SSH_KEY } }
          script: |
            cd /home/ubuntu/Hamgaja
            docker compose -f docker-compose.server.yml pull
            docker compose -f docker-compose.server.yml up -d

민감한 정보들은 Github secret을 통해 관리했다. 과정은 다음과 같다.

backend, front를 각각 빌드 -> docker hub에 이미지를 업로드 -> runner가 ssh로 ec2 인스턴스에 연결 후 서버 내부의 docker compose 파일로 이미지를 내려받아 컨테이너를 실행

기존의 코드에 추가하다보니 build를 두번 하는 문제가 발견되어 수정했다. main에 push하는걸 트리거로 작동하니 당분간 배포는 이걸로 하면 될 것 같다.
또 하나의 장점은 github secret을 이용하는 것이 가능하기 때문에 ssl 키, ssh 키 등 어디 올릴 수도 없고 로컬로 주고받기도 번거로운 민감한 정보들을 손쉽게 관리할 수 있다.
다만 이런 기능을 사용하려면 배포가 github action에 종속되게 되니 이 부분은 유의해야 할 것 같다.

도메인 구입

duckdns

추후 ssl 키를 발급받기 위해 등록한 무료 도메인인 Duck DNS가 다운됐다. 검색해보면 꽤 자주 이러는 모양인데 상당 시간 기다려도 복구될 기미가 보이지 않아 그냥 싸게 도메인을 하나 사기로 했다.
친구가 route53에서 .click으로 발급받으면 1년에 3달러로 사용할 수 있다고 해서 매번 이렇게 속썩느니 1년에 3달러면 싸게먹히겠다 싶어 진행했다.

route

무사히 도메인을 등록하고 EC2 인스턴스와 연결까지 끝마쳤고, 이제 안정적인 도메인이 생겼으니 SSL 키를 let’s encrypt에서 발급받아서 적용하고, 테스트를 진행하면 될 것 같다.