diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 65a4a99..ed89c7b 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -2,9 +2,15 @@ name: CI/CD Pipeline on: push: - branches: [ "main", "develop" ] # main과 develop 브랜치에 push될 때 작동 + branches: [ "main" ] # main에 push될 때 작동 workflow_dispatch: +# 같은 서버(humix-prod)에 배포가 동시에 실행되면 컨테이너 교체 중 이름 충돌이 나므로 한 번에 하나만 실행한다. +# 진행 중인 배포는 도중에 끊지 않고, 대기 중이던 이전 실행은 최신 실행으로 대체된다 (마지막 커밋이 항상 반영됨). +concurrency: + group: deploy-prod + cancel-in-progress: false + jobs: deploy: runs-on: ubuntu-latest @@ -65,13 +71,19 @@ jobs: username: ${{ secrets.EC2_USERNAME }} key: ${{ secrets.EC2_SSH_KEY }} script: | + set -e cd /home/${{ secrets.EC2_USERNAME }}/humix-${{ env.ENV_NAME }} # 기존 컨테이너를 내리고, 새 이미지를 빌드하여 백그라운드에서 실행 + # 실패해도 아래 정리는 실행해야 하므로 종료 코드를 저장해 두었다가 마지막에 반환한다. + # (그렇지 않으면 마지막 prune 명령의 성공이 단계 전체를 성공으로 만들어 배포 실패가 가려진다) + deploy_status=0 if docker compose version >/dev/null 2>&1; then - docker compose --project-name humix-${{ env.ENV_NAME }} --env-file .env up --build -d + docker compose --project-name humix-${{ env.ENV_NAME }} --env-file .env up --build -d || deploy_status=$? else - docker-compose --project-name humix-${{ env.ENV_NAME }} --env-file .env up --build -d + docker-compose --project-name humix-${{ env.ENV_NAME }} --env-file .env up --build -d || deploy_status=$? fi # 사용하지 않는 이전 도커 이미지 및 빌드 캐시 전면 정리 (8GB 용량 부족 대비) - docker image prune -a -f - docker builder prune -a -f \ No newline at end of file + # 정리 실패는 배포 결과에 영향을 주지 않도록 한다 + docker image prune -a -f || true + docker builder prune -a -f || true + exit $deploy_status \ No newline at end of file