Skip to content

Commit d21de10

Browse files
authored
Merge pull request #246 from prgrms-web-devcourse-final-project/lsj/deploy
✨ feat: GitHub Actions 자동 배포 워크플로우 구현
2 parents 531ce4b + 11b54ac commit d21de10

File tree

2 files changed

+121
-1
lines changed

2 files changed

+121
-1
lines changed

.github/workflows/deploy.yml

Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
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 }}"

docker-compose.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ services:
4040
start_period: 30s
4141

4242
ittaeok-container:
43-
image: # <도커 계정명/이미지 이름>/ittaeok-gcp:latest
43+
image: ${DOCKER_IMAGES_NAME} # ex: leeseojun/ittaeok:latest
4444
container_name: ittaeok
4545
restart: always
4646
depends_on:

0 commit comments

Comments
 (0)