Blue-Green 배포를 사용하는 경우, 두 슬롯(blue/green)에 서로 다른 버전의 Docker 컨테이너가 동시에 떠 있는 상태에서 배포가 이루어집니다. 새 버전이 성공적으로 배포되고 안정성이 확인되면, 이전 버전은 삭제해주는 것이 좋습니다.
이 글에서는 GitHub Actions를 사용하여 확정된 버전만 남기고, 나머지 Docker 컨테이너를 자동으로 삭제(clean-up)하는 워크플로우를 소개합니다.
confirm_version)과 일치하지 않는 컨테이너를 삭제합니다.workflow_dispatch로 수동 실행버전 입력을 직접 받기 위해 workflow_dispatch 이벤트 사용:
on:
workflow_dispatch:
inputs:
confirm_version:
description: '확정할 배포 버전 (예: 1.0.3)'
required: true
gcloud CLI를 통해 MIG에 속한 모든 인스턴스의 내부 IP를 추출합니다:
INSTANCE_NAMES=$(gcloud compute instance-groups managed list-instances ...)
...
gcloud compute instances describe "$INSTANCE" --zone "$TRY_ZONE"
Jump Host와 실제 인스턴스에 접근할 수 있도록 SSH 키 및 ProxyCommand 세팅:
ssh -o ProxyCommand="ssh -i ~/.ssh/jump_key -W %h:%p ubuntu@$JUMP_HOST" \
-i ~/.ssh/dev_key ubuntu@$IP ...
다음 로직을 각 인스턴스에서 수행합니다:
ACTIVE_PORT=$(grep "proxy_pass" /etc/nginx/sites-enabled/backend | grep -oE '[0-9]+')
if [ "$ACTIVE_PORT" = "8080" ]; then
ACTIVE_SLOT=blue
else
ACTIVE_SLOT=green
fi
docker rm -f를 사용해 실행 중인 컨테이너도 안전하게 강제 제거 가능/etc/nginx/sites-enabled/backend)는 환경에 따라 다를 수 있으므로 프로젝트에 맞게 수정하세요.확정용 파일

도커 이미지 삭제


👉 전체 GitHub Actions workflow는 아래 Gist에서 확인할 수 있습니다:
(블로그에 올릴 때 Gist나 GitHub 링크 첨부하면 좋아요!)
필요하면 제목, 설명 부분 더 다듬어줄게.
마크다운 또는 Notion용 형식으로도 변환해줄 수 있어. 어떻게 보여줄까?