55 types :
66 - published
77
8+ env :
9+ AWS_REGION : ap-northeast-2
10+ ECR_REGISTRY : 909176971481.dkr.ecr.ap-northeast-2.amazonaws.com
11+ ECR_REPOSITORY : linktrip
12+
813jobs :
9- build-and-push :
14+ build-and-deploy :
1015 runs-on : ubuntu-latest
1116
1217 steps :
@@ -29,37 +34,98 @@ jobs:
2934 restore-keys : |
3035 ${{ runner.os }}-gradle-
3136
37+ - name : JAR 빌드
38+ run : ./gradlew :linktrip-bootstrap:bootJar
39+
3240 - name : AWS 자격 증명 설정
3341 uses : aws-actions/configure-aws-credentials@v4
3442 with :
3543 aws-access-key-id : ${{ secrets.AWS_ACCESS_KEY_ID }}
3644 aws-secret-access-key : ${{ secrets.AWS_SECRET_ACCESS_KEY }}
37- aws-region : ap-northeast-2
45+ aws-region : ${{ env.AWS_REGION }}
3846
3947 - name : ECR 로그인
4048 id : ecr-login
4149 uses : aws-actions/amazon-ecr-login@v2
4250
43- - name : ECR 비밀번호 발급
44- id : ecr-password
45- run : echo "password=$(aws ecr get-login-password --region ap-northeast-2)" >> $GITHUB_OUTPUT
51+ - name : Docker 이미지 빌드 및 푸시
52+ run : |
53+ docker build -t ${{ env.ECR_REGISTRY }}/${{ env.ECR_REPOSITORY }}:latest .
54+ docker push ${{ env.ECR_REGISTRY }}/${{ env.ECR_REPOSITORY }}:latest
4655
47- - name : 이미지 빌드 및 푸쉬
56+ - name : GCP credentials 파일 생성
4857 env :
49- ECR_REGISTRY : ${{ steps.ecr-login.outputs.registry }}
50- ECR_REPOSITORY : linktrip
51- ECR_PASSWORD : ${{ steps.ecr-password.outputs.password }}
52- run : |
53- ./gradlew :linktrip-bootstrap:bootBuildImage
58+ GCP_CREDENTIALS_JSON : ${{ secrets.GCP_CREDENTIALS_JSON }}
59+ run : echo "$GCP_CREDENTIALS_JSON" > gcp-credentials.json
5460
55- - name : 서버 재시작 스크립트 실행
61+ - name : 배포 파일 EC2에 전송
62+ uses : appleboy/scp-action@master
63+ with :
64+ host : ${{ secrets.SERVER_HOST }}
65+ username : ec2-user
66+ key : ${{ secrets.SERVER_KEY }}
67+ source : " docker/docker-compose.prod.yml,gcp-credentials.json"
68+ target : " ~/linktrip/"
69+ strip_components : 0
70+ overwrite : true
71+
72+ - name : EC2 파일 정리 및 배포
5673 uses : appleboy/ssh-action@master
74+ env :
75+ JWT_SECRET_KEY : ${{ secrets.JWT_SECRET_KEY }}
76+ DISCORD_WEBHOOK_ERROR_URL : ${{ secrets.DISCORD_WEBHOOK_ERROR_URL }}
77+ DISCORD_MENTION_USER_ID : ${{ secrets.DISCORD_MENTION_USER_ID }}
78+ GCP_PROJECT_ID : ${{ secrets.GCP_PROJECT_ID }}
79+ YOUTUBE_API_KEY : ${{ secrets.YOUTUBE_API_KEY }}
5780 with :
5881 host : ${{ secrets.SERVER_HOST }}
59- username : ubuntu
82+ username : ec2-user
6083 key : ${{ secrets.SERVER_KEY }}
84+ envs : JWT_SECRET_KEY,DISCORD_WEBHOOK_ERROR_URL,DISCORD_MENTION_USER_ID,GCP_PROJECT_ID,YOUTUBE_API_KEY
6185 script : |
62- ./deploy.sh
86+ set -e
87+
88+ DEPLOY_DIR=~/linktrip
89+
90+ # Docker Compose 플러그인 설치 (없으면)
91+ if ! docker compose version > /dev/null 2>&1; then
92+ sudo mkdir -p /usr/local/lib/docker/cli-plugins
93+ sudo curl -SL https://github.com/docker/compose/releases/latest/download/docker-compose-linux-$(uname -m) -o /usr/local/lib/docker/cli-plugins/docker-compose
94+ sudo chmod +x /usr/local/lib/docker/cli-plugins/docker-compose
95+ fi
96+
97+ # ECR 로그인
98+ aws ecr get-login-password --region ap-northeast-2 | docker login --username AWS --password-stdin 909176971481.dkr.ecr.ap-northeast-2.amazonaws.com
99+
100+ # SCP로 전송된 파일 정리 (strip_components=0이라 docker/ 폴더 안에 들어감)
101+ mkdir -p $DEPLOY_DIR
102+ mv -f $DEPLOY_DIR/docker/docker-compose.prod.yml $DEPLOY_DIR/docker-compose.prod.yml 2>/dev/null || true
103+ rmdir $DEPLOY_DIR/docker 2>/dev/null || true
104+ chmod 600 $DEPLOY_DIR/gcp-credentials.json
105+
106+ # .env 파일 생성
107+ echo "JWT_SECRET_KEY=${JWT_SECRET_KEY}" > $DEPLOY_DIR/.env
108+ echo "DISCORD_WEBHOOK_ERROR_URL=${DISCORD_WEBHOOK_ERROR_URL}" >> $DEPLOY_DIR/.env
109+ echo "DISCORD_MENTION_USER_ID=${DISCORD_MENTION_USER_ID}" >> $DEPLOY_DIR/.env
110+ echo "GCP_PROJECT_ID=${GCP_PROJECT_ID}" >> $DEPLOY_DIR/.env
111+ echo "YOUTUBE_API_KEY=${YOUTUBE_API_KEY}" >> $DEPLOY_DIR/.env
112+ chmod 600 $DEPLOY_DIR/.env
113+
114+ # 네트워크 생성 (없으면)
115+ docker network create linktrip-network 2>/dev/null || true
116+
117+ # 기존 컨테이너 정리 (docker run으로 만든 잔여 컨테이너)
118+ docker stop linktrip-app 2>/dev/null || true
119+ docker rm linktrip-app 2>/dev/null || true
120+
121+ # docker-compose 배포
122+ cd $DEPLOY_DIR
123+ docker compose -f docker-compose.prod.yml pull app
124+ docker compose -f docker-compose.prod.yml up -d --force-recreate
125+ docker image prune -f
126+
127+ echo ">>> 배포 완료"
128+ docker compose -f docker-compose.prod.yml ps
63129
64130 - name : 디스코드 배포 알림
65131 if : success()
0 commit comments