Skip to content

Commit bec3c67

Browse files
authored
Merge pull request #9 from YAPP-Github/ci/terraform
[CI] 테라폼을 사용한 기본 인프라 작업 및 테스트
2 parents d22ae06 + 117b888 commit bec3c67

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

101 files changed

+3676
-0
lines changed

.github/workflows/deploy-dev.yml

Lines changed: 244 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,244 @@
1+
name: Deploy DEV & COMMON Infra, Service
2+
3+
on:
4+
push:
5+
branches: [ develop ]
6+
paths:
7+
- 'terraform/common/**'
8+
- 'terraform/dev/**'
9+
- '.github/workflows/deploy-dev.yml'
10+
workflow_dispatch:
11+
12+
permissions:
13+
contents: read
14+
15+
env:
16+
AWS_REGION: ap-northeast-2
17+
18+
jobs:
19+
terraform-apply-common:
20+
name: Terraform Apply COMMON
21+
runs-on: ubuntu-latest
22+
steps:
23+
- uses: actions/checkout@v4
24+
- uses: hashicorp/setup-terraform@v3
25+
- name: Terraform Init (common)
26+
run: terraform init
27+
working-directory: ./terraform/common
28+
- 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 }}
32+
run: terraform apply -auto-approve
33+
working-directory: ./terraform/common
34+
35+
terraform-apply-dev:
36+
name: Terraform Apply dev
37+
runs-on: ubuntu-latest
38+
needs: terraform-apply-common
39+
steps:
40+
- uses: actions/checkout@v4
41+
- 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
51+
52+
check-aws-resources:
53+
runs-on: ubuntu-latest
54+
needs: terraform-apply-dev
55+
steps:
56+
- name: Configure AWS credentials
57+
uses: aws-actions/configure-aws-credentials@v4
58+
with:
59+
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
60+
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
61+
aws-region: ${{ env.AWS_REGION }}
62+
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
87+
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
97+
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
107+
108+
deploy-service:
109+
name: Deploy to Amazon ECS
110+
runs-on: ubuntu-latest
111+
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+
120+
steps:
121+
- name: Configure AWS credentials
122+
uses: aws-actions/configure-aws-credentials@v4
123+
with:
124+
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
125+
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
126+
aws-region: ${{ env.AWS_REGION }}
127+
128+
- name: Set up Node.js
129+
uses: actions/setup-node@v4
130+
with:
131+
node-version: '22'
132+
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
162+
163+
- name: Semantic Release
164+
run: |
165+
OUTPUT=$(npx semantic-release --no-ci)
166+
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
172+
fi
173+
env:
174+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
175+
176+
- name: Set up JDK 21
177+
uses: actions/setup-java@v4
178+
with:
179+
distribution: 'temurin'
180+
java-version: 21
181+
java-package: jdk
182+
architecture: 'x64'
183+
cache: 'gradle'
184+
185+
- name: Build with Gradle
186+
run: |
187+
cd ${{ github.workspace }}
188+
chmod +x gradlew
189+
./gradlew clean build
190+
191+
- name: Login to Amazon ECR
192+
id: login-ecr
193+
uses: aws-actions/amazon-ecr-login@v2
194+
with:
195+
mask-password: 'true'
196+
197+
- name: Build, tag, and push image to Amazon ECR
198+
env:
199+
ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }}
200+
run: |
201+
docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:$SEMANTIC_VERSION .
202+
docker tag $ECR_REGISTRY/$ECR_REPOSITORY:$SEMANTIC_VERSION $ECR_REGISTRY/$ECR_REPOSITORY:latest
203+
docker push $ECR_REGISTRY/$ECR_REPOSITORY:$SEMANTIC_VERSION
204+
docker push $ECR_REGISTRY/$ECR_REPOSITORY:latest
205+
echo "image=$ECR_REGISTRY/$ECR_REPOSITORY:$SEMANTIC_VERSION" >> $GITHUB_ENV
206+
207+
- name: Get latest ECS task definition
208+
id: get-latest-task-def
209+
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
212+
213+
- name: Fill in the new image ID in the Amazon ECS task definition
214+
id: task-def
215+
uses: aws-actions/amazon-ecs-render-task-definition@v1
216+
with:
217+
task-definition: task-definition.json
218+
container-name: ${{ env.CONTAINER_NAME }}
219+
image: ${{ env.image }}
220+
221+
- name: Deploy Amazon ECS task definition
222+
uses: aws-actions/amazon-ecs-deploy-task-definition@v1
223+
with:
224+
task-definition: ${{ steps.task-def.outputs.task-definition }}
225+
service: ${{ env.ECS_SERVICE }}
226+
cluster: ${{ env.ECS_CLUSTER }}
227+
wait-for-service-stability: true
228+
229+
- name: Discord Notify (Success)
230+
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 }}
236+
237+
- name: Discord Notify (Failure)
238+
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+

0 commit comments

Comments
 (0)