Skip to content

Commit fd8923a

Browse files
authored
Merge pull request #10 from YAPP-Github/develop
[Ci] develop 배포 워크플로우 테스트 및 main 배포 파이프라인 수정
2 parents 8958de1 + 9babd59 commit fd8923a

33 files changed

+457
-401
lines changed

.github/workflows/deploy-dev.yml

Lines changed: 84 additions & 117 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,20 @@ on:
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

1213
permissions:
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

1522
env:
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

Comments
 (0)