GitHubActions CICD With SpringBoot - 3

GitHub Actions WorkFlow

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
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
name: cicd-V2
on:
push:
paths:
- 'springboot-CICD/**'
tags:
- 'v[0-9]+.[0-9]+.[0-9]+'
pull_request:
types: [opened, synchronize, closed]
branches: ["release-dev", "develop", "release-prod"]

paths:
- 'springboot-CICD/**'

jobs:

test:
if: github.event.action == 'opened' || github.event.action == 'synchronize'
runs-on: ubuntu-latest
steps:
- name: checkout
uses: actions/checkout@v4
- name: Set up JDK 17
uses: actions/setup-java@v4
with:
java-version: 17
distribution: 'temurin'

- name: Grant execute permission for gradlew
run: |
cd springboot-CICD
chmod +x gradlew
- name: Build with Gradle
run: |
cd springboot-CICD
./gradlew build

set-environment:
if: github.event.pull_request.merged == true || github.ref_type == 'tag'
runs-on: ubuntu-latest
outputs:
environment: ${{ steps.set-env.outputs.environment }}
steps:
- name: set env
id: set-env
run: |

if [[ ${{ github.ref_type }} == "tag" ]]; then
echo "environment=develop" >> $GITHUB_OUTPUT
exit 0
fi

if [[ ${{ github.ref_type }} == "branch" ]]; then
echo "environment=dev" >> $GITHUB_OUTPUT
if [[ ${{ github.base_ref }} == "release-prod" ]]; then
echo "environment=prod" >> $GITHUB_OUTPUT
elif [[ ${{ github.base_ref }} == "develop" ]]; then
echo "environment=develop" >> $GITHUB_OUTPUT
fi
fi
- name: check env
run: echo ${{ steps.set-env.outputs.environment }}

image-build:
if: needs.set-environment.outputs.environment != 'develop'
runs-on: ubuntu-latest
needs: [ set-environment ]
permissions:
id-token: write
contents: read
strategy:
matrix:
environment: [ "${{ needs.set-environment.outputs.environment }}" ]
environment: ${{ matrix.environment }}
steps:
- name: checkout the code
uses: actions/checkout@v4
- name: Configure AWS Credentials
id: credentials
uses: aws-actions/configure-aws-credentials@v4
with:
aws-region: ${{ vars.AWS_REGION }}
role-to-assume: ${{ secrets.AWS_ROLE_TO_ASSUME }}
- name: Login to Amazon ECR
id: login-ecr
uses: aws-actions/amazon-ecr-login@v2
with:
mask-password: 'true'
- name: docker build & push
run: |
docker build -f ./springboot-CICD/Dockerfile --tag ${{ secrets.REGISTRY }}/${{ vars.REPOSITORY }}:${{ github.sha }} ./springboot-CICD
docker push ${{ secrets.REGISTRY }}/${{ vars.REPOSITORY }}:${{ github.sha }}

deploy:
if: needs.set-environment.outputs.environment != 'prod'
runs-on: ubuntu-latest
needs: [ set-environment, image-build ]
permissions:
id-token: write
contents: read
strategy:
matrix:
environment: ["${{ needs.set-environment.outputs.environment }}"]
environment: ${{ matrix.environment }}
steps:
- name: checkout the code
uses: actions/checkout@v4
- name: Configure AWS Credentials
id: credentials
uses: aws-actions/configure-aws-credentials@v4
with:
aws-region: ${{ vars.AWS_REGION }}
role-to-assume: ${{ secrets.AWS_ROLE_TO_ASSUME }}
- name: setup kubectl
uses: azure/setup-kubectl@v3
with:
version: latest
- name: setup helm
uses: azure/setup-helm@v3
with:
version: v3.11.1
- name: access kubernetes
run: |
aws eks update-kubeconfig --name ${{ vars.CLUSTER_NAME }}
- name: deploy
id: status
run: |
helm upgrade --install spring-boot-app kubernetes/spring-boot-app --create-namespace --namespace spring-boot-${{ vars.SUFFIX }} \
--set image.tag=${{ github.sha }} \
--set image.repository=${{ secrets.REGISTRY }}/${{ vars.REPOSITORY }}
- name: notify
if: always()
uses: slackapi/slack-github-action@v1.24.0
with:
payload: |
{
"text": "message",
"blocks": [
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": "Environment : ${{ matrix.environment }}, Deploy Result : ${{ steps.status.outcome }}, Repository : ${{ github.repository }}."
}
}
]
}
env:
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
SLACK_WEBHOOK_TYPE: INCOMING_WEBHOOK

create-pr-develop:
if: needs.set-environment.outputs.environment == 'develop' && github.ref_type == 'tag'
runs-on: ubuntu-latest
needs: [set-environment]
steps:
- name: checkout
uses: actions/checkout@v4
- name: gh auth login
run: |
echo ${{ secrets.PERSONAL_ACCESS_TOKEN }} | gh auth login --with-token
- name: create branch
run: |
git checkout -b release/${{ github.ref_name }}
git push origin release/${{ github.ref_name }}
- name: create pr
run: |
gh pr create --base develop --head release/${{ github.ref_name }} --title "release/${{ github.ref_name }} -> develop" --body "release pr"

create-pr-prod:
if: needs.set-environment.outputs.environment == 'develop' && github.event.pull_request.merged == true
runs-on: ubuntu-latest
needs: [set-environment]
steps:
- name: checkout
uses: actions/checkout@v4
- name: gh auth login
run: |
echo ${{ secrets.PERSONAL_ACCESS_TOKEN }} | gh auth login --with-token
- name: create pr
run: |
gh pr create --base release-prod --head ${{ github.ref_name }} --title "${{ github.head_ref }} -> ${{ github.ref_name }} -> release-prod" --body "release pr"

approve:
if: needs.set-environment.outputs.environment == 'prod'
runs-on: ubuntu-latest
environment: approve-process
needs: [set-environment, image-build]
steps:
- name: approve
run: |
echo "Approve Done"

prod-deploy:
runs-on: ubuntu-latest
needs: [ approve ]
permissions:
id-token: write
contents: read
strategy:
matrix:
environment: ["${{ needs.set-environment.outputs.environment }}"]
environment: ${{ matrix.environment }}
steps:
- name: checkout the code
uses: actions/checkout@v4
- name: Configure AWS Credentials
id: credentials
uses: aws-actions/configure-aws-credentials@v4
with:
aws-region: ${{ vars.AWS_REGION }}
role-to-assume: ${{ secrets.AWS_ROLE_TO_ASSUME }}
- name: setup kubectl
uses: azure/setup-kubectl@v3
with:
version: latest
- name: setup helm
uses: azure/setup-helm@v3
with:
version: v3.11.1
- name: access kubernetes
run: |
aws eks update-kubeconfig --name ${{ vars.CLUSTER_NAME }}
- name: deploy
id: status
run: |
helm upgrade --install spring-boot-app kubernetes/spring-boot-app --create-namespace --namespace spring-boot-${{ vars.SUFFIX }} \
--set image.tag=${{ github.sha }} \
--set image.repository=${{ secrets.REGISTRY }}/${{ vars.REPOSITORY }}
- name: notify
if: always()
uses: slackapi/slack-github-action@v1.24.0
with:
payload: |
{
"text": "message",
"blocks": [
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": "Environment : ${{ matrix.environment }}, Deploy Result : ${{ steps.status.outcome }}, Repository : ${{ github.repository }}."
}
}
]
}
env:
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
SLACK_WEBHOOK_TYPE: INCOMING_WEBHOOK

이번에 소개하고자 하는 WorkFlow 전체적인 코드 입니다.

하나씩 소개 하도록 하겠습니다.

트리거 구성

1
2
3
4
5
6
7
8
9
10
11
12
13
name: cicd-V2
on:
push:
paths:
- 'springboot-CICD/**'
tags:
- 'v[0-9]+.[0-9]+.[0-9]+'
pull_request:
types: [opened, synchronize, closed]
branches: ["release-dev", "develop", "release-prod"]

paths:
- 'springboot-CICD/**'

트리거 구성 코드 입니다. 여기서 name 은 ‘cicd-V2’ 로 임의로 지정 했습니다.
여기서 트리거가 발생되는 조건은 ‘push’ 하고 ‘pull_request’ 입니다. ‘push’ 일 경우에는 ‘springboot-CICD/**’ 안에 있는 경로에 수정 사항이 발생 되었을때 트리거를 발동 하도록 조건을 추가 합니다.
그리고 만약 ‘tag’ 로 ‘push’ 로 하는 경우는 ‘v[0-9]+.[0-9]+.[0-9]+’ 조건에 해당되면 트리거가 발생 됩니다. 예를들어 v1.0.0 경우는 트리거가 발생 되고
v1.0 이거나 v1.0.A 일 경우에는 트리거가 발생 되지 않습니다.

‘pull_request’ 경우에는 발생될때 트리거가 발동 되지만 ‘opened’, ‘synchronize’, ‘closed’ 한에서만 발동 됩니다. 그리고 브랜치 경우 “release-dev”, “develop”, “release-prod” 한에서만 발동 됩니다.

Job ‘test’ 구성

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
test:
if: github.event.action == 'opened' || github.event.action == 'synchronize'
runs-on: ubuntu-latest
steps:
- name: checkout
uses: actions/checkout@v4
- name: Set up JDK 17
uses: actions/setup-java@v4
with:
java-version: 17
distribution: 'temurin'

- name: Grant execute permission for gradlew
run: |
cd springboot-CICD
chmod +x gradlew
- name: Build with Gradle
run: |
cd springboot-CICD
./gradlew build

Job 에서 ‘test’ 구성 입니다. 앞서 말씀드렸던 CI 역활을 하고 있다고 보시면 됩니다. 여기서 if 조건을 확인 할 수 있는데 PR 을 오픈되거나 PR 동기화 할때
‘test’ Job 이 실행 되도록 조건 추가 했습니다.
‘runs-on: ubuntu-latest’ 구문이 있는데 runs-on 경우는 해당 github actions 을 어떤 환경에서 실행 할지에 대한 값을 입력하는 인자 값 입니다.
우리는 여기서 ubuntu 로 설정 하도록 하겠습니다.

다음에 steps 입니다. 임의로 지정한 ‘checkout’ 이라는 name 보면 uses key 로 설정한 checkout 볼수 있는데 github repository 를 가져오는 역활을 합니다.
그 다음은 JDK 17 설치하는 명령어 입니다.

그 다음은 해당 어플리케이션을 build 통해 test 코드가 문제가 없는지 체크를 합니다.

Job ‘set-environment’ 구성

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
set-environment:
if: github.event.pull_request.merged == true || github.ref_type == 'tag'
runs-on: ubuntu-latest
outputs:
environment: ${{ steps.set-env.outputs.environment }}
steps:
- name: set env
id: set-env
run: |

if [[ ${{ github.ref_type }} == "tag" ]]; then
echo "environment=develop" >> $GITHUB_OUTPUT
exit 0
fi

if [[ ${{ github.ref_type }} == "branch" ]]; then
echo "environment=dev" >> $GITHUB_OUTPUT
if [[ ${{ github.base_ref }} == "release-prod" ]]; then
echo "environment=prod" >> $GITHUB_OUTPUT
elif [[ ${{ github.base_ref }} == "develop" ]]; then
echo "environment=develop" >> $GITHUB_OUTPUT
fi
fi
- name: check env
run: echo ${{ steps.set-env.outputs.environment }}

Job ‘set-environment’ 경우는 CD 작업일 경우 배포전 배포 할 환경을 판단하는 Job 입니다.
if 조건을 보면 생성한 PR 이 merged 할 경우 그리고 tag 통해 푸쉬일 경우 발동 하도록 했습니다.
여기서 outputs 기능을 활용 해보았는데요. 현재 배포 할 환경을 판단 한뒤 다른 Job 에서도 이를 활용 하기 위해 outputs 기능을 추가 했습니다.

Job ‘image-build’ 구성

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
image-build:
if: needs.set-environment.outputs.environment != 'develop'
runs-on: ubuntu-latest
needs: [ set-environment ]
permissions:
id-token: write
contents: read
strategy:
matrix:
environment: [ "${{ needs.set-environment.outputs.environment }}" ]
environment: ${{ matrix.environment }}
steps:
- name: checkout the code
uses: actions/checkout@v4
- name: Configure AWS Credentials
id: credentials
uses: aws-actions/configure-aws-credentials@v4
with:
aws-region: ${{ vars.AWS_REGION }}
role-to-assume: ${{ secrets.AWS_ROLE_TO_ASSUME }}
- name: Login to Amazon ECR
id: login-ecr
uses: aws-actions/amazon-ecr-login@v2
with:
mask-password: 'true'
- name: docker build & push
run: |
docker build -f ./springboot-CICD/Dockerfile --tag ${{ secrets.REGISTRY }}/${{ vars.REPOSITORY }}:${{ github.sha }} ./springboot-CICD
docker push ${{ secrets.REGISTRY }}/${{ vars.REPOSITORY }}:${{ github.sha }}

그 다음은 Job 조건에서 ‘image-build’ 입니다. CD 진행 할때 진행되는 Job 입니다. if 조건에 앞써 Job 실행 중 ‘set-environment’ 과정에서 배포 환경 값이 ‘develop’ 값이
아닐 경우에만 실행되도록 했습니다. 왜냐하면 ‘develop’ 브랜치 경우는 연결되는 서버가 없기 때문입니다. 단순히 ‘release-dev’ 브랜치에서 ‘release-prod’ 브랜치로 이동하는 중간 단계 역활을 한다고 보면 됩니다.

needs 조건이 보이는데 여기서 Job 과정 중 ‘set-environment’ Job 이 실행이 완료된 후에만 ‘image-build’ 실행 하도록 구성 하는 역활 입니다.
왜냐하면 환경 설정 값이 존재해야지 ‘image-build’ Job 을 실행 가능 하기 때문 입니다.

그 다음에는 ‘matrix’ 기능이 있습니다. 이 기능은 GitHub Actions 페이지에서 더 편한 시각화를 하기 위한 기능입니다. 여기서 ‘set-environment’ 통해 배포 환경
값을 이용해 시각화 하도록 했습니다.

그 다음 Step 영역을 보시면 checkout 기능을 통해 현재 실행되는 브랜치 repository 를 가져오고 AWS Credentials 로그인 할수 있도록 미리
github setting 에서 설정한 AWS Credentials 값을 가져와서 AWS 인증 처리 하도록 합니다.

AWS 인증이 완료 된 이후 AWS ECR 로그인을 진행하게 되고 해당 애플리케이션 루트 경로에 미리 준비한 DockerFile 통해 Docker build 진행하고 빌드가 완료 된 이후
생성된 docker image 를 AWS ECR 에 push 할 수 있도록 합니다.

여기서 환경 변수 값을 통해 build 및 push 를 진행 하는데 이러한 변수 설정 값은 이후 방법은 안내 하도록 하겠습니다.

Job ‘deploy’ 구성

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
deploy:
runs-on: ubuntu-latest
needs: [ set-environment, image-build ]
permissions:
id-token: write
contents: read
strategy:
matrix:
environment: ["${{ needs.set-environment.outputs.environment }}"]
environment: ${{ matrix.environment }}
steps:
- name: checkout the code
uses: actions/checkout@v4
- name: Configure AWS Credentials
id: credentials
uses: aws-actions/configure-aws-credentials@v4
with:
aws-region: ${{ vars.AWS_REGION }}
role-to-assume: ${{ secrets.AWS_ROLE_TO_ASSUME }}
- name: setup kubectl
uses: azure/setup-kubectl@v3
with:
version: latest
- name: setup helm
uses: azure/setup-helm@v3
with:
version: v3.11.1
- name: access kubernetes
run: |
aws eks update-kubeconfig --name ${{ vars.CLUSTER_NAME }}
- name: deploy
id: status
run: |
helm upgrade --install spring-boot-app kubernetes/spring-boot-app --create-namespace --namespace spring-boot-${{ vars.SUFFIX }} \
--set image.tag=${{ github.sha }} \
--set image.repository=${{ secrets.REGISTRY }}/${{ vars.REPOSITORY }}
- name: notify
if: always()
uses: slackapi/slack-github-action@v1.24.0
with:
payload: |
{
"text": "message",
"blocks": [
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": "Environment : ${{ matrix.environment }}, Deploy Result : ${{ steps.status.outcome }}, Repository : ${{ github.repository }}."
}
}
]
}
env:
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
SLACK_WEBHOOK_TYPE: INCOMING_WEBHOOK

그 다음은 Job 조건에서 ‘deploy’ 입니다. CD 진행 할때 진행되는 Job 입니다. 앞써 실행된 ‘image-build’ 에서 최종적으로 만들어진 docker image
를 이용해 AWS EKS 에 배포하는 역활을 합니다. 그리고 성공 여부를 slack 으로 전송 하는 역활도 합니다. 이를 위해 needs 조건에서 ‘set-environment’, ‘image-build’ 을 설정 하도록 합니다.

동일하게 checkout 진행 하고 인증을 위해 AWS Credentials 실행 하도록 합니다. 그 다음은 ‘kubectl’ 하고 ‘helm’ 액션을 이용하는데 kubernetes 하고 helm
커맨드를 사용하기 위함 입니다.

kubernetes 접근 하기 위해

1
aws eks update-kubeconfig --name ${{ vars.CLUSTER_NAME }}

명령어를 사용 합니다. 완료되면 지정된 cluster 에 접근이 가능해집니다. 그 다음 ‘deploy’ Step 에서는 helm 커멘드를 이용해서 접근한 kubernetes Cluster 에 배포 하도록 합니다.

그 다음 ‘notify’ step 일 경우 if 조건을 always() 사용 한다는 것을 볼수 있습니다. ‘deploy’ 작업이 성공은 물론 실패 하더라도 slack 에 메시지를
전송 할 수 있도록 하기 위한 기능 입니다.

Job ‘create-pr-develop’ 구성

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
create-pr-develop:
if: needs.set-environment.outputs.environment == 'develop' && github.ref_type == 'tag'
runs-on: ubuntu-latest
needs: [set-environment]
steps:
- name: checkout
uses: actions/checkout@v4
- name: gh auth login
run: |
echo ${{ secrets.PERSONAL_ACCESS_TOKEN }} | gh auth login --with-token
- name: create branch
run: |
git checkout -b release/${{ github.ref_name }}
git push origin release/${{ github.ref_name }}
- name: create pr
run: |
gh pr create --base develop --head release/${{ github.ref_name }} --title "release/${{ github.ref_name }} -> develop" --body "release pr"

if 조건을 보면 ‘set-environment’ Job 통해 설정한 배포 환경 값이 ‘develop’ 이고 push 조건인 ‘tag’ 일 경우에만 발동 하도록 되어 있습니다.
이는 ‘release-dev’ 브랜치에 merge 이후 dev 서버에 배포가 완료 된 이후 작업한 feature 브랜치에서 develop 에 tag 통해 push 하면 발생 됩니다.
최종적으로 ‘release-prod’ 에 배포전 ‘release/${tag name}’ 브랜치를 생성 후 ‘develop’ 브랜치로 merge 위한 PR 생성 하는 역활을 합니다.

needs 경우 ‘set-environment’ job 이 완료해야 실행 가능하도록 되어 있습니다.

1
2
3
- name: gh auth login
run: |
echo ${{ secrets.PERSONAL_ACCESS_TOKEN }} | gh auth login --with-token

step 에서 github auth login 하기 위한 명령어 입니다. github 홈페이지에서 생성한 PERSONAL_ACCESS_TOKEN 을 이용해서 인증 처리 하게 됩니다.
이는 github 에서 브랜치 생성 및 PR 생성 하기 위함 입니다.

Job ‘create-pr-prod’ 구성

1
2
3
4
5
6
7
8
9
10
11
12
13
create-pr-prod:
if: needs.set-environment.outputs.environment == 'develop' && github.event.pull_request.merged == true
runs-on: ubuntu-latest
needs: [set-environment]
steps:
- name: checkout
uses: actions/checkout@v4
- name: gh auth login
run: |
echo ${{ secrets.PERSONAL_ACCESS_TOKEN }} | gh auth login --with-token
- name: create pr
run: |
gh pr create --base release-prod --head ${{ github.ref_name }} --title "${{ github.head_ref }} -> ${{ github.ref_name }} -> release-prod" --body "release pr"

이전 Job ‘create-pr-develop’ 에서 생성한 ‘release/${tag name}’ 브랜치에서 ‘develop’ 브랜치로 merge 실행시 작동 하게 됩니다.
이 job 의 역활은 ‘develop’ 브랜치에서 ‘release-prod’ 브랜치로 merge 하기 위한 PR 를 생성 합니다.

Job ‘approve’ 구성

1
2
3
4
5
6
7
8
9
approve:
if: needs.set-environment.outputs.environment == 'prod'
runs-on: ubuntu-latest
environment: approve-process
needs: [set-environment, image-build]
steps:
- name: approve
run: |
echo "Approve Done"

브랜치 ‘release-prod’ CD 작업 중 일때
key 값 중 ‘environment’ 에서 approve process 이라는 값을 사용하게 됩니다. 이 부분은 배포 하는 과정에서 승인 프로세스를 위해 사용 하는 환경 입니다.
github 에서 environment 에 ‘Protection Rule’ 을 설정 할수 있는데 GitHub Actions Job 에서 사용하는 Environment 에 Protection Rule 설정이
반영되면 Job 이 실행되는 시점에 대기상태가 됩니다. 이 대기 상태일때 권한 있는 유저가 승인 해주면 비로써 실행 할 수 있는 기능 입니다.

그래서 Approve Process 라는 환경을 구성하고 Protection Rule 을 설정을 한 다음 GitHub Actions Job 에서 Environment 값으로 Approve Process 를
사용하면 승인을 받아야만 Approve Job 이 실행이 됩니다.

Job ‘prod-deploy’ 구성

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
prod-deploy:
runs-on: ubuntu-latest
needs: [ approve ]
permissions:
id-token: write
contents: read
strategy:
matrix:
environment: ["prod"]
environment: ${{ matrix.environment }}
steps:
- name: checkout the code
uses: actions/checkout@v4
- name: Configure AWS Credentials
id: credentials
uses: aws-actions/configure-aws-credentials@v4
with:
aws-region: ${{ vars.AWS_REGION }}
role-to-assume: ${{ secrets.AWS_ROLE_TO_ASSUME }}
- name: setup kubectl
uses: azure/setup-kubectl@v3
with:
version: latest
- name: setup helm
uses: azure/setup-helm@v3
with:
version: v3.11.1
- name: access kubernetes
run: |
aws eks update-kubeconfig --name ${{ vars.CLUSTER_NAME }}
- name: deploy
id: status
run: |
helm upgrade --install spring-boot-app kubernetes/spring-boot-app --create-namespace --namespace spring-boot-${{ vars.SUFFIX }} \
--set image.tag=${{ github.sha }} \
--set image.repository=${{ secrets.REGISTRY }}/${{ vars.REPOSITORY }}
- name: notify
if: always()
uses: slackapi/slack-github-action@v1.24.0
with:
payload: |
{
"text": "message",
"blocks": [
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": "Environment : ${{ matrix.environment }}, Deploy Result : ${{ steps.status.outcome }}, Repository : ${{ github.repository }}."
}
}
]
}
env:
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
SLACK_WEBHOOK_TYPE: INCOMING_WEBHOOK

Job ‘approve’ 최종 승인을 받고 실행되는 deploy Job 입니다. 기존 ‘deploy’ Job 을 재활용 하기가 어려워서 동일한 ‘deploy’ Job 인
‘prod-deploy’ Job 을 만들어 보았습니다. 내용은 needs 조건에 ‘approve’ 완료 된 이후 실행 할 수 있도록 되어 있고 그외에 ‘deploy’ Job 과 동일 합니다.


Copyright 201- syh8088. 무단 전재 및 재배포 금지. 출처 표기 시 인용 가능.

💰

×

Help us with donation