-
Notifications
You must be signed in to change notification settings - Fork 1
144 lines (135 loc) · 5.61 KB
/
work.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
name: 'work'
on:
pull_request:
types:
- closed
jobs:
update:
name: 프로젝트 버전 업데이트
runs-on: ubuntu-latest
if: github.event.pull_request.merged == true && github.base_ref == 'main'
steps:
- name: Checkout code
uses: actions/checkout@v2
- name: Set up JDK 17
uses: actions/setup-java@v2
with:
java-version: '17'
distribution: 'adopt'
- name: Save PR labels to file
run: echo '${{ toJson(github.event.pull_request.labels) }}' > pr_labels.json
- name: Determine Version Increment
id: vars
run: |
LABELS=$(jq -r '.[].name' pr_labels.json | tr '\n' ' ')
echo "Detected Labels: $LABELS"
if echo $LABELS | grep -q "major"; then
echo "Detected major label"
echo "::set-output name=INCREMENT::major"
elif echo $LABELS | grep -q "minor"; then
echo "Detected minor label"
echo "::set-output name=INCREMENT::minor"
elif echo $LABELS | grep -q "patch"; then
echo "Detected patch label"
echo "::set-output name=INCREMENT::patch"
else
echo "No version label detected"
echo "::set-output name=INCREMENT::"
fi
- name: Grant execute permissions for gradlew
run: chmod +x ./gradlew
- name: Update Project Version with Gradle
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
if: steps.vars.outputs.INCREMENT
run: |
./gradlew updateVersion -Pincrement=${{ steps.vars.outputs.INCREMENT }}
git config --global user.name 'github-actions[bot]'
git config --global user.email 'github-actions[bot]@users.noreply.github.com'
git add .
git commit -m "chore: update project version based on PR label"
git push
build:
name: 이미지 빌드 및 도커허브 푸시
runs-on: ubuntu-latest
if: github.event.pull_request.merged == true && github.base_ref == 'main'
needs: update
steps:
- uses: actions/checkout@v3
with:
ref: refs/heads/main
- name: application-secret.yml 생성
env:
ACTIONS_STEP_DEBUG: true
APPLICATION_SECRET: ${{ secrets.APPLICATION_SECRET_YML }}
run: echo "$APPLICATION_SECRET" > src/main/resources/application-secret.yml
- name: Set up JDK 17
uses: actions/setup-java@v3
with:
java-version: '17'
distribution: 'temurin'
cache: 'gradle'
- name: gradlew 실행 권한 부여
run: chmod +x gradlew
- name: gradle 빌드
run: ./gradlew build --no-daemon
- name: 빌드 버전 저장
id: get_version
run: echo "::set-output name=VERSION::$(./gradlew properties --no-daemon | grep "version:" | awk '{print $2}' | sed 's/-SNAPSHOT//')"
- name: build 폴더를 캐시에 저장
uses: actions/upload-artifact@v3
with:
name: build-artifact
path: build
retention-days: 1
- name: 도커 이미지 빌드 및 푸시
run: |
docker login -u ${{ secrets.DOCKER_HUB_USERNAME }} -p ${{ secrets.DOCKER_HUB_PASSWORD }}
docker build -t ${{ secrets.DOCKER_REPO }}/withfestival:${{ steps.get_version.outputs.VERSION }} .
docker push ${{ secrets.DOCKER_REPO }}/withfestival:${{ steps.get_version.outputs.VERSION }}
deploy:
name: 원격 서버에 배포
runs-on: ubuntu-latest
if: github.event.pull_request.merged == true && github.base_ref == 'main'
needs: build
permissions:
contents: read
actions: read
steps:
- name: 원격 서버에 배포하기
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.SSH_HOST }}
username: ${{ secrets.SSH_USER }}
password: ${{ secrets.SSH_PASSWORD }}
script: |
echo ${{ secrets.DOCKER_HUB_PASSWORD }} | sudo docker login -u ${{ secrets.DOCKER_HUB_USERNAME }} --password-stdin
sudo docker stop withfestival_app || true
sudo docker rm withfestival_app || true
# Get the image ID of the currently running container
PREVIOUS_IMAGE_ID=$(sudo docker inspect withfestival_app --format '{{.Image}}')
# Search Latest Image Version
VERSION=$(curl -s "https://registry.hub.docker.com/v2/repositories/${{ secrets.DOCKER_REPO }}/withfestival/tags/" | \
jq -r '.results[].name' | sort -V | tail -n 1)
# Docker Image Run
sudo docker pull ${{ secrets.DOCKER_REPO }}/withfestival:${VERSION}
if ! sudo docker run --name=withfestival_app --network docker-net --restart unless-stopped \
-p 8080:8080 -e TZ=Asia/Seoul -d ${{ secrets.DOCKER_REPO }}/withfestival:${VERSION}; then
echo "Docker run failed, rolling back to previous image..."
sudo docker run --name=withfestival_app --network docker-net --restart unless-stopped \
-p 8080:8080 -e TZ=Asia/Seoul -d $PREVIOUS_IMAGE_ID
else
# Remove old images if docker run succeeds
sudo docker image prune -f
fi
- name: 배포 알림 발송
uses: 8398a7/action-slack@v3
with:
status: ${{ job.status }}
author_name: 배포 ${{ job.status == 'success' && '성공' || '실패' }}
fields: repo, commit, message, author
mention: here
if_mention: failure,cancelled
env:
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
if: always()