1+ name : Deploy to GCP
2+
3+ on :
4+ pull_request :
5+ types : [closed]
6+ branches : [ main, dev ]
7+
8+ jobs :
9+ build :
10+ runs-on : ubuntu-latest
11+ outputs :
12+ image-digest : ${{ steps.build.outputs.digest }}
13+
14+ steps :
15+ - name : Checkout code
16+ uses : actions/checkout@v4
17+
18+ - name : Set up JDK 21
19+ uses : actions/setup-java@v4
20+ with :
21+ java-version : ' 21'
22+ distribution : ' temurin'
23+
24+ - name : Cache Gradle packages
25+ uses : actions/cache@v4
26+ with :
27+ path : |
28+ ~/.gradle/caches
29+ ~/.gradle/wrapper
30+ key : ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
31+ restore-keys : |
32+ ${{ runner.os }}-gradle-
33+
34+ - name : Grant execute permission for gradlew
35+ run : chmod +x gradlew
36+
37+ # 테스트 실행 (테스트 코드 완성 시 주석 해제)
38+ # - name: Run tests
39+ # run: ./gradlew test
40+
41+ - name : Build with Gradle
42+ run : |
43+ echo "Building commit: ${{ github.sha }}"
44+ echo "Building from repository: ${{ github.repository }}"
45+ ./gradlew clean bootjar -Pprofile=prod
46+
47+ - name : Set up Docker Buildx
48+ uses : docker/setup-buildx-action@v3
49+
50+ - name : Login to Docker Hub
51+ uses : docker/login-action@v3
52+ with :
53+ username : ${{ secrets.DOCKER_USERNAME }}
54+ password : ${{ secrets.DOCKER_PASSWORD }}
55+
56+ - name : Build and push Docker image
57+ id : build
58+ uses : docker/build-push-action@v5
59+ with :
60+ context : .
61+ file : ./Dockerfile
62+ push : true
63+ tags : |
64+ ${{ secrets.DOCKER_USERNAME }}/${{ secrets.DOCKER_IMAGE_NAME }}:latest
65+ ${{ secrets.DOCKER_USERNAME }}/${{ secrets.DOCKER_IMAGE_NAME }}:${{ github.sha }}
66+ ${{ secrets.DOCKER_USERNAME }}/${{ secrets.DOCKER_IMAGE_NAME }}:dev-${{ github.run_number }}
67+ cache-from : type=gha
68+ cache-to : type=gha,mode=max
69+
70+ - name : Verify build completion
71+ run : |
72+ echo "Build completed successfully!"
73+ echo "Image digest: ${{ steps.build.outputs.digest }}"
74+ echo "Pushed tags:"
75+ echo " - ${{ secrets.DOCKER_USERNAME }}/${{ secrets.DOCKER_IMAGE_NAME }}:latest"
76+ echo " - ${{ secrets.DOCKER_USERNAME }}/${{ secrets.DOCKER_IMAGE_NAME }}:${{ github.sha }}"
77+ echo " - ${{ secrets.DOCKER_USERNAME }}/${{ secrets.DOCKER_IMAGE_NAME }}:dev-${{ github.run_number }}"
78+
79+ deploy :
80+ needs : build
81+ runs-on : ubuntu-latest
82+
83+ steps :
84+
85+ - name : Deploy to GCP Instance
86+ uses : appleboy/ssh-action@v1.1.0
87+ with :
88+ host : ${{ secrets.GCP_HOST }}
89+ username : ${{ secrets.GCP_USERNAME }}
90+ key : ${{ secrets.GCP_SSH_PRIVATE_KEY }}
91+ port : 22
92+ script : |
93+ cd $HOME/project
94+
95+ sudo docker-compose down || true
96+
97+ sudo docker image prune -f
98+ sudo docker rmi ${{ secrets.DOCKER_USERNAME }}/ittaeok-gcp:latest || true
99+ sudo docker system prune -f || true
100+
101+ sudo docker pull ${{ secrets.DOCKER_USERNAME }}/ittaeok-gcp:latest --disable-content-trust
102+
103+ sudo docker-compose up -d
104+
105+ sudo docker-compose ps
106+
107+ sleep 10
108+ sudo docker-compose logs --tail=20
109+
110+ echo "=== Deployed Image Info ==="
111+ sudo docker images | grep ittaeok-gcp
112+
113+ echo "=== Container Info ==="
114+ sudo docker ps | grep ittaeok
115+
116+ - name : Deployment completed
117+ run : |
118+ echo "Deployment completed successfully"
119+ echo "Deployed commit: ${{ github.sha }}"
120+ echo "Repository: ${{ github.repository }}"
0 commit comments