-
Notifications
You must be signed in to change notification settings - Fork 0
141 lines (118 loc) · 5.34 KB
/
deploy.yml
File metadata and controls
141 lines (118 loc) · 5.34 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
name: Deploy to AWS ECS
on:
push:
branches:
- main #메이에 코드가 올라오면 작업시작한다 delvep 이면 디벨롭 - 리스트니까 메인브런치 작업시작!
#해당 워크 플로우에서 자주사용할 만한 값을 환경변수로 등록해 놓고 사용가능하다
env:
AWS_REGION: ${{ secrets.AWS_REGION }}
ECR_REPOSITORY: ${{ secrets.ECR_REPOSITORY }}
ECS_CLUSTER: ${{ secrets.ECS_CLUSTER }}
ECS_SERVICE: ${{ secrets.ECS_SERVICE }}
CONTAINER_NAME: spring-app
# 워크 플로우에서 실행될 S작업을 정의
jobs:
deploy:
name: Deploy
runs-on: ubuntu-22.04 #작업이 실행될 환경
steps:
# 1. 코드 체크아웃 (깃허브의 코드를 actions 작업 환경으로 가져오겠다.)
#uses: actions/checkout@v4 깃허브에 제공하는 미리완성된 액션을 사용하겠다 레퍼지토리코드를 워크플로우에 적용
- name: Checkout code
uses: actions/checkout@v4
#코드를 끌고왔으니 자바설치를 해야하지
- name: Set up JDK 17
uses: actions/setup-java@v4
with:
java-version: '17'
distribution: 'temurin'
# 3. Gradle 캐싱 (빌드 속도 향상)
#코드를 푸시할떄마다 이로직이 된다 그때마다
#지금 이 워크플로우가 매번 실행될때마다 매번 라이브러리를 새로 받으면 오래 걸린다
#저번에 썻던 게 있으면 그걸 그대로 써서 시간을 절약한다
- name: Cache Gradle packages
uses: actions/cache@v3
with:
path: |
~/.gradle/caches
~/.gradle/wrapper
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
restore-keys: |
${{ runner.os }}-gradle-
#4. gradle build 빌드하자
#빌드한다 | 이건리눅스문법이고 그래들권한주고 클린하고 빌드한다 테스트없이
- name: Build with Gradle
run: |
chmod +x gradlew
./gradlew clean build -x test
#5. AWS 자격증명 설정
#요기다 값을 넣는게아니야
#시크릿값 넣는 저장소가 따로있어 그걸불러오는 코드가 이거야 깃허브와라
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v4
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: ${{ secrets.AWS_REGION }}
#6. ECR 로그인 해야푸쉬가가능해서
- name: Login to Amazon ECR
id: login-ecr
uses: aws-actions/amazon-ecr-login@v2
#7. docker 이미지빌드 & ecr push 한다
- name: Build, tag, and push image to Amazon ECR
id: build-image
env:
ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }}
IMAGE_TAG: ${{ github.sha }} # Git commit hash << ?를 이미지 태그로 사용
run: |
# Docker 이미지 빌드
docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG .
docker tag $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG $ECR_REGISTRY/$ECR_REPOSITORY:latest
# ECR에 푸시
docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG
docker push $ECR_REGISTRY/$ECR_REPOSITORY:latest
# 다음 스텝에서 사용할 수 있도록 출력
echo "image=$ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG" >> $GITHUB_OUTPUT
#8. 현재 task definition 다운로드
#테스크받고 갈아끼운다
- name: Download current task definition
run: |
aws ecs describe-task-definition \
--task-definition my-spring-app \
--query taskDefinition > task-definition.json
sudo apt-get update && sudo apt-get install -y jq
jq 'del(
.taskDefinitionArn,
.revision,
.status,
.requiresAttributes,
.compatibilities,
.registeredAt,
.registeredBy,
.enableFaultInjection
)' task-definition.json > task-definition-clean.json
mv task-definition-clean.json task-definition.json
# 9. Task Definition에 새 이미지 반영
# echo "image=$ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG" >> $GITHUB_OUTPUT
- name: Fill in the new image ID in task definition
id: task-def
uses: aws-actions/amazon-ecs-render-task-definition@v1
with:
task-definition: task-definition.json
container-name: ${{ env.CONTAINER_NAME }}
image: ${{ steps.build-image.outputs.image }}
#10 ecs service 에 새 tsak definion 배포한다
- name: Deploy to Amazon ECS
uses: aws-actions/amazon-ecs-deploy-task-definition@v1
with:
task-definition: ${{ steps.task-def.outputs.task-definition }}
service: ${{ env.ECS_SERVICE }}
cluster: ${{ env.ECS_CLUSTER }}
wait-for-service-stability: true
# 11. 배포 완료 메시지
- name: Deployment result
run: |
echo "Deployment completed successfully!"
echo "Image: ${{ steps.build-image.outputs.image }}"
echo "Service: ${{ env.ECS_SERVICE }}"
echo "Cluster: ${{ env.ECS_CLUSTER }}"