-
Notifications
You must be signed in to change notification settings - Fork 2
161 lines (132 loc) · 6.15 KB
/
deploy.yml
File metadata and controls
161 lines (132 loc) · 6.15 KB
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
name: gonghak98 WAS CI/CD
on: # 워크플로우가 언제 실행되는지 정의 (like 조건문)
push:
branches:
- main # main 브랜치로 PR 후 Merge 됐을 때 (Merge되면 Merge 커밋이 push 되므로 해당 조건을 만족)
env:
AWS_REGION_NAME: ap-northeast-2 # AWS 리전 이름
AWS_S3_BUCKET_NAME: ${{ secrets.AWS_S3_BUCKET_NAME }} # S3 버킷 이름
AWS_CODE_DEPLOY_NAME: gonghak98-server # CodeDeploy 애플리케이션 이름
AWS_CODE_DEPLOY_GROUP: Production # CodeDeploy 배포 그룹 이름
jobs: # 해당 워크플로우에서 어떤 일이 수행되어야 하는지 정의 (like 조건문의 본문)
test_and_build:
name: 스프링부트 프로젝트 테스트 자동화
runs-on: ubuntu-latest # 상세 작업에 필수적으로 들어가야 하는 항목 : 어느 환경에서 실행되어야 하는지 정의
steps:
- name: 깃허브 리포지토리 파일 불러오기
uses: actions/checkout@v4
with:
submodules: true
token: ${{ secrets.GITUB_TOKEN }}
- name: 러너에 JDK 설치
uses: actions/setup-java@v4
with:
distribution: 'corretto'
java-version: '17'
- name: Gradle 설치
uses: gradle/actions/setup-gradle@v3
# - name: 러너에 테스트용 MySQL을 설치
# uses: mirromutth/mysql-action@v1.1
# with:
# host port: 3306
# container port: 3306
# mysql database: 'jpa_prac'
# mysql root password: 1234
#
# - name: Test용 Properties 파일 추가
# run: |
# mkdir -p ./src/test/resources
# echo "${{ secrets.TEST_PROPERTIES }}" >> ./src/test/resources/application.properties
# - name: 배포용 Properties 파일 추가
# run: |
# mkdir -p ./src/main/resources
# echo "${{ secrets.MAIN_PROPERTIES }}" >> ./src/main/resources/application.properties
# echo "${{ secrets.PROD_PROPERTIES }}" >> ./src/main/resources/application-prod.properties
- name: 배포용 Properties 파일 추가
run: |
mkdir -p ./src/main/resources
echo "${{ secrets.MAIN_PROPERTIES }}" >> ./src/main/resources/application.properties
echo "${{ secrets.PROD_PROPERTIES }}" >> ./src/main/resources/application-prod.properties
- name: gradlew 권한 부여
run: chmod +x ./gradlew
shell: bash
# - name: 프로젝트 테스트
# run: ./gradlew test
- name: 프로젝트 빌드
run: ./gradlew clean bootJar --console=plain
- name: 빌드 산출물을 다른 job이 사용할 수 있도록 업로드
uses: actions/upload-artifact@v4
with:
name: build-artifact
path: build/libs/*.jar
build_and_push_image:
name: 도커 이미지 빌드 및 푸시
# 가장 최신 버전의 우분투를 러너(Github Actions 실행 환경)로 설정
runs-on: ubuntu-latest # 상세 작업에 필수적으로 들어가야 하는 항목 : 어느 환경에서 실행되어야 하는지 정의
needs: test_and_build # test_and_build 작업이 끝난 후에 실행될 수 있도록 설정
steps:
- name: 깃허브 리포지토리 파일 불러오기
uses: actions/checkout@v4 # 현재 리포지토리로 체크아웃
- name: Github Actions가 AWS 리소스(ECR)에 접근할 수 있도록 인증정보 설정, 이 때 리전은 us-east-1
uses: aws-actions/configure-aws-credentials@v4
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_PRIVATE_ACCESS_KEY }}
aws-region: us-east-1
- name: 멀티 플랫폼 빌드와 캐시 활용을 할 수 있는 도커 빌드X 설치
uses: docker/setup-buildx-action@v3
- name: AWS ECR에 로그인
uses: aws-actions/amazon-ecr-login@v2
with:
registry-type: public
- name: build/libs 폴더 생성
run: |
mkdir -p ./build/libs
- name: test_and_build 작업에서 업로드한 빌드 산출물 다운로드
uses: actions/download-artifact@v4
with:
name: build-artifact
path: ./build/libs/
- name: 빌드 산출물 확인
run: |
ls -l ./build/libs
- name: 이미지 빌드 후, ECR에 푸쉬
env:
REGISTRY: ${{ secrets.ECR_REGISTRY }}
REGISTRY_ALIAS: ${{ secrets.ECR_REGISTRY_ALIAS }}
REPOSITORY: ${{ secrets.ECR_REPOSITORY }}
IMAGE_TAG: latest
run: |
docker buildx build --platform=linux/amd64 \
-f ./docker/Dockerfile_Was_ECR \
-t $REGISTRY/$REGISTRY_ALIAS/$REPOSITORY:$IMAGE_TAG \
--push .
deploy:
name: 스프링부트 프로젝트 배포
runs-on: ubuntu-latest
needs: build_and_push_image
steps:
- name: 깃허브 리포지토리 파일 불러오기
uses: actions/checkout@v4
- name: Github Actions가 AWS 리소스(S3, CodeDeploy)에 접근할 수 있도록 인증정보 설정
uses: aws-actions/configure-aws-credentials@v4
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_PRIVATE_ACCESS_KEY }}
aws-region: ${{ env.AWS_REGION_NAME }}
- name: 배포 스크립트 폴더 및 파일 추가
run: |
mkdir -p scripts
echo "${{ secrets.START_SERVER_SH }}" >> ./scripts/start-server.sh
- name: 배포에 필요한 파일 압축하기
run: tar -czvf ${{ github.sha }}.tar.gz appspec.yml scripts
- name: S3로 배포 압축파일 업로드
run: |
aws s3 cp ./${{ github.sha }}.tar.gz s3://${{ env.AWS_S3_BUCKET_NAME }}/${{ github.sha }}.tar.gz
- name: CodeDeploy를 활용해 EC2에 프로젝트 코드 배포
run: |
aws deploy create-deployment \
--application-name ${{ env.AWS_CODE_DEPLOY_NAME }} \
--deployment-group-name ${{ env.AWS_CODE_DEPLOY_GROUP }} \
--deployment-config-name CodeDeployDefault.AllAtOnce \
--s3-location bucket=${{ env.AWS_S3_BUCKET_NAME }},key=${{ github.sha }}.tar.gz,bundleType=tgz