44 push :
55 branches : [ develop ]
66 paths :
7+ - ' src/**'
78 - ' terraform/common/**'
89 - ' terraform/dev/**'
910 - ' .github/workflows/deploy-dev.yml'
1011 workflow_dispatch :
1112
1213permissions :
13- contents : read
14+ contents : write
15+ pull-requests : write
16+ issues : write
17+
18+ concurrency :
19+ group : terraform
20+ cancel-in-progress : false
1421
1522env :
1623 AWS_REGION : ap-northeast-2
@@ -22,102 +29,73 @@ jobs:
2229 steps :
2330 - uses : actions/checkout@v4
2431 - uses : hashicorp/setup-terraform@v3
32+
33+ - name : Configure AWS credentials
34+ uses : aws-actions/configure-aws-credentials@v4
35+ with :
36+ aws-access-key-id : ${{ secrets.AWS_ACCESS_KEY_ID }}
37+ aws-secret-access-key : ${{ secrets.AWS_SECRET_ACCESS_KEY }}
38+ aws-region : ${{ env.AWS_REGION }}
39+
2540 - name : Terraform Init (common)
2641 run : terraform init
2742 working-directory : ./terraform/common
43+
2844 - name : Terraform Apply COMMON
29- env :
30- AWS_ACCESS_KEY_ID : ${{ secrets.AWS_ACCESS_KEY_ID }}
31- AWS_SECRET_ACCESS_KEY : ${{ secrets.AWS_SECRET_ACCESS_KEY }}
3245 run : terraform apply -auto-approve
3346 working-directory : ./terraform/common
3447
3548 terraform-apply-dev :
3649 name : Terraform Apply dev
3750 runs-on : ubuntu-latest
3851 needs : terraform-apply-common
52+ outputs :
53+ tf_outputs_json : ${{ steps.get-outputs.outputs.data }}
3954 steps :
4055 - uses : actions/checkout@v4
4156 - uses : hashicorp/setup-terraform@v3
42- - name : Terraform Init (dev)
43- run : terraform init
44- working-directory : ./terraform/dev
45- - name : Terraform Apply dev
46- env :
47- AWS_ACCESS_KEY_ID : ${{ secrets.AWS_ACCESS_KEY_ID }}
48- AWS_SECRET_ACCESS_KEY : ${{ secrets.AWS_SECRET_ACCESS_KEY }}
49- run : terraform apply -auto-approve
50- working-directory : ./terraform/dev
57+ with :
58+ terraform_wrapper : false
5159
52- check-aws-resources :
53- runs-on : ubuntu-latest
54- needs : terraform-apply-dev
55- steps :
5660 - name : Configure AWS credentials
5761 uses : aws-actions/configure-aws-credentials@v4
5862 with :
5963 aws-access-key-id : ${{ secrets.AWS_ACCESS_KEY_ID }}
6064 aws-secret-access-key : ${{ secrets.AWS_SECRET_ACCESS_KEY }}
6165 aws-region : ${{ env.AWS_REGION }}
6266
63- - name : Get AWS Resource Names (dev)
64- id : get-aws-names
65- run : |
66- CLUSTER=$(aws ecs list-clusters --region $AWS_REGION --query "clusterArns[]" --output text | tr '\t' '\n' | grep 'dev' | head -n 1 | awk -F'/' '{print $2}')
67- if [ -z "$CLUSTER" ]; then
68- echo "Error: No ECS cluster name containing 'dev' found." >&2
69- exit 1
70- fi
71- echo "ECS_CLUSTER=$CLUSTER" >> $GITHUB_ENV
72-
73- SERVICE=$(aws ecs list-services --cluster $CLUSTER --region $AWS_REGION --query "serviceArns[]" --output text | tr '\t' '\n' | grep 'dev' | head -n 1 | awk -F'/' '{print $2}')
74- if [ -z "$SERVICE" ]; then
75- echo "Error: No ECS service name containing 'dev' found." >&2
76- exit 1
77- fi
78- echo "ECS_SERVICE=$SERVICE" >> $GITHUB_ENV
79-
80- TASK_DEF_ARN=$(aws ecs describe-services --cluster $CLUSTER --services $SERVICE --region $AWS_REGION --query "services[0].taskDefinition" --output text)
81- if [ -z "$TASK_DEF_ARN" ]; then
82- echo "Error: No ECS task definition ARN found." >&2
83- exit 1
84- fi
85- TASK_DEF_NAME=$(basename "$TASK_DEF_ARN" | cut -d':' -f1)
86- echo "ECS_TASK_DEFINITION=$TASK_DEF_NAME" >> $GITHUB_ENV
67+ - name : Terraform Init (dev)
68+ run : terraform init
69+ working-directory : ./terraform/dev
8770
88- CONTAINER_NAME=$(aws ecs describe-task-definition --task-definition $TASK_DEF_ARN --region $AWS_REGION --query "taskDefinition.containerDefinitions[].name" --output text | tr '\t' '\n' | grep 'dev' | head -n 1)
89- if [ -z "$CONTAINER_NAME" ]; then
90- CONTAINER_NAME=$(aws ecs describe-task-definition --task-definition $TASK_DEF_ARN --region $AWS_REGION --query "taskDefinition.containerDefinitions[0].name" --output text)
91- fi
92- if [ -z "$CONTAINER_NAME" ]; then
93- echo "Error: No ECS container name found." >&2
94- exit 1
95- fi
96- echo "CONTAINER_NAME=$CONTAINER_NAME" >> $GITHUB_ENV
71+ - name : Terraform Apply dev
72+ run : terraform apply -auto-approve
73+ working-directory : ./terraform/dev
9774
98- REPO=$(aws ecr describe-repositories --region $AWS_REGION --query "repositories[].repositoryName" --output text | tr '\t' '\n' | grep 'dev' | head -n 1)
99- if [ -z "$REPO" ]; then
100- REPO=$(aws ecr describe-repositories --region $AWS_REGION --query "repositories[0].repositoryName" --output text)
101- fi
102- if [ -z "$REPO" ]; then
103- echo "Error: No ECR repository found." >&2
104- exit 1
105- fi
106- echo "ECR_REPOSITORY=$REPO" >> $GITHUB_ENV
75+ - name : Get Terraform Outputs
76+ id : get-outputs
77+ run : |
78+ echo "data<<EOF" >> $GITHUB_OUTPUT
79+ terraform output -json >> $GITHUB_OUTPUT
80+ echo "EOF" >> $GITHUB_OUTPUT
81+ working-directory : ./terraform/dev
10782
10883 deploy-service :
10984 name : Deploy to Amazon ECS
11085 runs-on : ubuntu-latest
11186 environment : develop
112- needs : check-aws-resources
113- env :
114- ECR_REPOSITORY : ${{ env.ECR_REPOSITORY }}
115- ECS_CLUSTER : ${{ env.ECS_CLUSTER }}
116- ECS_SERVICE : ${{ env.ECS_SERVICE }}
117- ECS_TASK_DEFINITION : ${{ env.ECS_TASK_DEFINITION }}
118- CONTAINER_NAME : ${{ env.CONTAINER_NAME }}
119-
87+ needs : terraform-apply-dev
12088 steps :
89+ - uses : actions/checkout@v4
90+
91+ - name : Parse Terraform Outputs and Set Environment Variables
92+ run : |
93+ TF_OUTPUTS='${{ needs.terraform-apply-dev.outputs.tf_outputs_json }}'
94+ echo "ECR_REPOSITORY=$(echo "$TF_OUTPUTS" | jq -r '.ecr_repository_name.value')" >> $GITHUB_ENV
95+ echo "ECS_CLUSTER=$(echo "$TF_OUTPUTS" | jq -r '.ecs_cluster_name.value')" >> $GITHUB_ENV
96+ echo "ECS_SERVICE=$(echo "$TF_OUTPUTS" | jq -r '.ecs_api_service_name.value')" >> $GITHUB_ENV
97+ echo "CONTAINER_NAME=$(echo "$TF_OUTPUTS" | jq -r '.ecs_api_container_name.value')" >> $GITHUB_ENV
98+
12199 - name : Configure AWS credentials
122100 uses : aws-actions/configure-aws-credentials@v4
123101 with :
@@ -130,46 +108,20 @@ jobs:
130108 with :
131109 node-version : ' 22'
132110
133- - name : Prepare semantic-release config (release all types)
134- run : |
135- cat <<EOF > release.config.js
136- module.exports = {
137- branches: ['develop'],
138- plugins: [
139- [
140- '@semantic-release/commit-analyzer',
141- {
142- preset: 'conventionalcommits',
143- releaseRules: [
144- { type: 'feat', release: 'minor' },
145- { type: 'fix', release: 'patch' },
146- { type: 'perf', release: 'patch' },
147- { type: 'refactor', release: 'patch' },
148- { type: 'test', release: 'patch' },
149- { type: 'chore', release: 'patch' },
150- { type: 'ci', release: 'patch' },
151- { type: 'revert', release: 'patch' }
152- ]
153- }
154- ],
155- [
156- '@semantic-release/release-notes-generator',
157- { preset: 'conventionalcommits' }
158- ]
159- ]
160- };
161- EOF
111+ - name : Install Semantic Release dependencies
112+ run : npm install semantic-release @semantic-release/commit-analyzer @semantic-release/release-notes-generator conventional-changelog-conventionalcommits
162113
163114 - name : Semantic Release
115+ id : get_version
164116 run : |
165- OUTPUT=$(npx semantic-release --no-ci)
117+ OUTPUT=$(./node_modules/.bin/ semantic-release --no-ci)
166118 echo "$OUTPUT"
167- VERSION=$(echo "$OUTPUT" | grep -oP 'Published release \K[0-9.]+')
168- if [ ! -z "$VERSION" ]; then
169- echo "SEMANTIC_VERSION=$VERSION" >> $GITHUB_ENV
170- else
171- echo "Error: SEMANTIC_VERSION not extracted" && exit 1
119+ VERSION=$(echo "$OUTPUT" | grep -oP 'Published (?:pre)?release \K[0-9.a-z-]+')
120+ if [ -z "$VERSION" ]; then
121+ echo "릴리즈할 새로운 버전이 없습니다. 배포를 건너뜁니다."
122+ exit 0
172123 fi
124+ echo "SEMANTIC_VERSION=$VERSION" >> $GITHUB_ENV
173125 env :
174126 GITHUB_TOKEN : ${{ secrets.GITHUB_TOKEN }}
175127
@@ -199,16 +151,14 @@ jobs:
199151 ECR_REGISTRY : ${{ steps.login-ecr.outputs.registry }}
200152 run : |
201153 docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:$SEMANTIC_VERSION .
202- docker tag $ECR_REGISTRY/$ECR_REPOSITORY:$SEMANTIC_VERSION $ECR_REGISTRY/$ECR_REPOSITORY:latest
203154 docker push $ECR_REGISTRY/$ECR_REPOSITORY:$SEMANTIC_VERSION
204- docker push $ECR_REGISTRY/$ECR_REPOSITORY:latest
205155 echo "image=$ECR_REGISTRY/$ECR_REPOSITORY:$SEMANTIC_VERSION" >> $GITHUB_ENV
206156
207157 - name : Get latest ECS task definition
208158 id : get-latest-task-def
209159 run : |
210- TASK_DEF =$(aws ecs describe-services --cluster ${ ECS_CLUSTER} --services ${ ECS_SERVICE} --region ${ AWS_REGION} --query "services[0].taskDefinition" --output text)
211- aws ecs describe-task-definition --task-definition $TASK_DEF --region ${ AWS_REGION} --query "taskDefinition" --output json > task-definition.json
160+ TASK_DEF_ARN =$(aws ecs describe-services --cluster "${{ env. ECS_CLUSTER }}" --services "${{ env. ECS_SERVICE }}" --region "${{ env. AWS_REGION }}" --query "services[0].taskDefinition" --output text)
161+ aws ecs describe-task-definition --task-definition "$TASK_DEF_ARN" --region "${{ env. AWS_REGION }}" --query "taskDefinition" --output json > task-definition.json
212162
213163 - name : Fill in the new image ID in the Amazon ECS task definition
214164 id : task-def
@@ -226,19 +176,36 @@ jobs:
226176 cluster : ${{ env.ECS_CLUSTER }}
227177 wait-for-service-stability : true
228178
179+ - name : Prepare Notification Info
180+ id : vars
181+ run : echo "sha_short=$(git rev-parse --short HEAD)" >> $GITHUB_OUTPUT
182+
229183 - name : Discord Notify (Success)
230184 if : success()
231- run : |
232- curl -H "Content-Type: application/json" \
233- -X POST \
234- -d "{\"content\": \"✅ (개발 서버) 새로운 버전이 배포 되었어요!\n레포: ${GITHUB_REPOSITORY}\n브랜치: ${GITHUB_REF}\n버전: ${SEMANTIC_VERSION}\"}" \
235- ${{ secrets.DISCORD_WEBHOOK_URL }}
185+ uses : tsickert/discord-webhook@v7.0.0
186+ with :
187+ webhook-url : ${{ secrets.DISCORD_WEBHOOK }}
188+ embed-title : " ✅ 개발 서버 배포 성공!"
189+ embed-color : 65280
190+ embed-description : |
191+ 새로운 버전이 성공적으로 배포되었습니다.
192+
193+ **버전**: [v${{ env.SEMANTIC_VERSION }}](${{ github.server_url }}/${{ github.repository }}/releases/tag/v${{ env.SEMANTIC_VERSION }})
194+ **커밋**: [${{ steps.vars.outputs.sha_short }}](${{ github.server_url }}/${{ github.repository }}/commit/${{ github.sha }})
195+ **배포자**: ${{ github.actor }}
196+ embed-url : " ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}"
236197
237198 - name : Discord Notify (Failure)
238199 if : failure()
239- run : |
240- curl -H "Content-Type: application/json" \
241- -X POST \
242- -d "{\"content\": \"❌ (개발 서버) 배포 실패!\n레포: ${GITHUB_REPOSITORY}\n브랜치: ${GITHUB_REF}\n버전: ${SEMANTIC_VERSION}\"}" \
243- ${{ secrets.DISCORD_WEBHOOK_URL }}
244-
200+ uses : tsickert/discord-webhook@v7.0.0
201+ with :
202+ webhook-url : ${{ secrets.DISCORD_WEBHOOK }}
203+ embed-title : " ❌ 개발 서버 배포 실패!"
204+ embed-color : 16711680
205+ embed-description : |
206+ 배포 과정 중 오류가 발생했습니다. 아래 링크에서 로그를 확인하세요.
207+
208+ **시도 버전**: ${{ env.SEMANTIC_VERSION }}
209+ **커밋**: [${{ steps.vars.outputs.sha_short }}](${{ github.server_url }}/${{ github.repository }}/commit/${{ github.sha }})
210+ **요청자**: ${{ github.actor }}
211+ embed-url : " ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}"
0 commit comments