1+ name : backend - build & push (multi-arch) + deploy
2+
3+ on :
4+ push :
5+ branches : [ "main" ]
6+ tags : [ "v*" ]
7+
8+ jobs :
9+ build-push :
10+ runs-on : ubuntu-latest
11+ env :
12+ IMAGE : ${{ vars.DOCKERHUB_USERNAME }}/winear-backend
13+ steps :
14+ - name : Checkout
15+ uses : actions/checkout@v4
16+
17+ # 멀티아치 빌드를 위한 QEMU/Buildx 설정
18+ - name : QEMU 설치
19+ uses : docker/setup-qemu-action@v3
20+
21+ - name : Buildx 설치
22+ uses : docker/setup-buildx-action@v3
23+
24+ - name : Docker Hub 로그인
25+ uses : docker/login-action@v3
26+ with :
27+ username : ${{ vars.DOCKERHUB_USERNAME }}
28+ password : ${{ secrets.DOCKERHUB_TOKEN }}
29+
30+ - name : Compute tags
31+ id : meta
32+ run : |
33+ SHA=${GITHUB_SHA::7}
34+ echo "sha=${SHA}" >> $GITHUB_OUTPUT
35+ if [[ "$GITHUB_REF" == refs/tags/v* ]]; then
36+ echo "is_tag=true" >> $GITHUB_OUTPUT
37+ echo "version=${GITHUB_REF#refs/tags/v}" >> $GITHUB_OUTPUT
38+ else
39+ echo "is_tag=false" >> $GITHUB_OUTPUT
40+ fi
41+
42+ # 멀티아치 빌드 + 푸시 (amd64, arm64)
43+ - name : Build & Push (edge + sha; multi-arch)
44+ uses : docker/build-push-action@v6
45+ with :
46+ context : .
47+ file : ./Dockerfile
48+ push : true
49+ platforms : linux/amd64,linux/arm64
50+ tags : |
51+ ${{ env.IMAGE }}:${{ steps.meta.outputs.sha }}
52+ ${{ env.IMAGE }}:edge
53+ cache-from : type=registry,ref=${{ env.IMAGE }}:buildcache
54+ cache-to : type=registry,ref=${{ env.IMAGE }}:buildcache,mode=max
55+
56+ # 릴리스 태그(v*)면 version + latest로 멀티아치 매니페스트 승격
57+ - name : Promote for release (version + latest)
58+ if : steps.meta.outputs.is_tag == 'true'
59+ run : |
60+ docker buildx imagetools create \
61+ -t ${{ env.IMAGE }}:${{ steps.meta.outputs.version }} \
62+ -t ${{ env.IMAGE }}:latest \
63+ ${{ env.IMAGE }}:${{ steps.meta.outputs.sha }}
64+
65+ deploy :
66+ needs : build-push
67+ runs-on : ubuntu-latest
68+ if : github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/tags/v')
69+ steps :
70+ - name : SSH deploy (compose pull & up -d)
71+ uses : appleboy/ssh-action@v1.0.3
72+ with :
73+ host : ${{ vars.SSH_HOST }}
74+ username : ${{ vars.SSH_USER }}
75+ key : ${{ secrets.SSH_PRIVATE_KEY }}
76+ script : |
77+ set -e
78+ cd /home/ubuntu/stack
79+ docker compose pull
80+ docker compose up -d
81+ docker image prune -f
0 commit comments