기존 CD - 지속적 제공

기존 코드는 Docker Image를 변경 후 push해 반영하는 것까지만 구축되어 있었고

위 과정은 프로덕션 환경에 바로 반영하는 지속적 배포까지의 CD가 아닌

Docker Image등만 최신으로 맞추는 지속적 제공까지의 CD라고 볼 수 있었다.

때문에 프로덕션 환경에 배포하기 위해

항상 도커 이미지를 pull 받은 후 컨테이너를 멈추고 삭제하고 새로 돌려야 했었다.

때문에 위 과정을 CD에 포함했다.

name: CD

on:
  push:
    branches: [ main ]

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - name: Check Out The Repository
        uses: actions/checkout@v3

      - name: Set up Java
        uses: actions/setup-java@v2
        with:
          java-version: '17'
          distribution: 'zulu'

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

      - name: Build with Gradle
        run: ./gradlew build

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

      - name: Docker Build
        run: docker build -t ${{ secrets.DOCKER_IMAGE }} .

      - name: Push on Dockerhub
        run: docker push ${{ secrets.DOCKER_IMAGE }}

새로운 CD - 지속적 배포

- name: Deploy to Server
        uses: appleboy/ssh-action@master
        with:
          host: ${{ secrets.SERVER_HOST }}
          username: ${{ secrets.SERVER_USERNAME }}
          key: ${{ secrets.PRIVATE_KEY }}
          port: ${{ secrets.SERVER_PORT }}
          script: |
            docker login --username ${{ secrets.DOCKER_USERNAME }} --password-stdin < ~/password.txt
            docker pull ${{ secrets.DOCKER_IMAGE }}
            docker stop ${{ secrets.SERVER_NAME }}
            docker rm ${{ secrets.SERVER_NAME }}
            docker run -d --name ${{ secrets.SERVER_NAME }} -p 80:8080 --env-file .env ${{ secrets.DOCKER_IMAGE }}

위 action을 사용해서 EC2 서버에 접속한 후

**Docker image를 pull받고, 컨테이너를 멈추고 지우고 새로 돌리는 과정까지 포함**했다.

host → ec2 퍼블릭 엔드포인트

username → ubuntu (linux면 ec2-user)

key : pem key 넣으면 됨 (cat해서 확인 가능)

port : 기본 22인데 2222였기 때문에 2222 넣었음

docker login 명령어 → 기존에 문제 없어야 하는데 왜인지 모르게 로그인을 한 번 더 해줘야 했음