기존 코드는 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 }}
- 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 명령어 → 기존에 문제 없어야 하는데 왜인지 모르게 로그인을 한 번 더 해줘야 했음