Repository navigation
151 lines (130 loc) · 5.56 KB
/
Copy pathci-cd.yml
File metadata and controls
151 lines (130 loc) · 5.56 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
# ⚠️ DEPRECATED: This workflow is disabled. Use ec2-deploy.yml instead.
# This workflow was used for ECS deployment and is kept for reference only.
name: CI-CD Pipeline (DEPRECATED - ECS + ECR)
on:
push:
branches: [ temp-disabled ] # Changed to never match
paths-ignore:
- '.github/workflows/**' # 워크플로우 수정만 있을 때는 빌드 스킵
- 'README.md'
jobs:
# 1. 빌드 + 이미지 빌드 & 푸시
build:
runs-on: ubuntu-latest
steps:
- name: Decode and export env vars
run: |
echo "${{ secrets.APP_ENV_B64 }}" | base64 --decode | tr -d '\r'> .env
# .env 내용을 GitHub Actions 환경변수로 export
while IFS='=' read -r key value; do
if [[ ! -z "$key" && ! "$key" =~ ^# ]]; then
echo "$key=$value" >> $GITHUB_ENV
fi
done < .env
- name: Check out code
uses: actions/checkout@v3
- name: Set up JDK 17
uses: actions/setup-java@v3
with:
distribution: 'temurin'
java-version: '17'
cache: 'gradle'
- name: Build (no Test)
run: ./gradlew clean bootJar --no-daemon
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v4
with:
aws-access-key-id: ${{ env.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ env.AWS_SECRET_ACCESS_KEY }}
aws-region: ${{ env.AWS_REGION }}
- name: Log in to Amazon ECR
id: login-ecr
uses: aws-actions/amazon-ecr-login@v2
- name: Build, tag, and push image to Amazon ECR
env:
ECR_REGISTRY: ${{ env.ECR_REGISTRY }}
ECR_REPOSITORY: ${{ env.ECR_REPOSITORY }}
IMAGE_TAG: ${{ github.sha }}
run: |
docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG .
docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG
# 태그관리: latest, github hash
docker tag $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG $ECR_REGISTRY/$ECR_REPOSITORY:latest
docker push $ECR_REGISTRY/$ECR_REPOSITORY:latest
# 2. ECS 서비스 업데이트 (무중단 배포)
deploy:
needs: build
runs-on: ubuntu-latest
# DISABLED: This workflow is deprecated. Use ec2-deploy.yml instead.
if: false # Always skip this job
steps:
- name: Decode and export env vars
run: |
echo "${{ secrets.APP_ENV_B64 }}" | base64 --decode | tr -d '\r'> .env
# .env 내용을 GitHub Actions 환경변수로 export
while IFS='=' read -r key value; do
if [[ ! -z "$key" && ! "$key" =~ ^# ]]; then
echo "$key=$value" >> $GITHUB_ENV
fi
done < .env
- name: Create ECS env json
run: |
# ① 공백 + # 로 시작하는 줄 삭제, ② 라인 끝 주석 삭제, ③ 빈줄 삭제
CLEAN=$(sed '/^[[:space:]]*#/d; s/[[:space:]]*#.*$//; /^[[:space:]]*$/d' .env)
# ④ KEY=VALUE 에서 VALUE 안에 '=' 가 있어도 안전하게 처리
ENV_VARS=$(printf "%s\n" "$CLEAN" | jq -Rn '
def kv: (split("=")) | {name: .[0], value: (.[1:] | join("="))};
[inputs | kv]
')
echo "$ENV_VARS" > env.json
cat env.json
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v4
with:
aws-access-key-id: ${{ env.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ env.AWS_SECRET_ACCESS_KEY }}
aws-region: ${{ env.AWS_REGION }}
- name: Update ECS Service
env:
CLUSTER: ${{ env.ECS_CLUSTER }}
SERVICE: ${{ env.ECS_SERVICE }}
TASK_FAMILY: ${{ env.ECS_TASK_FAMILY }}
ECR_REGISTRY: ${{ env.ECR_REGISTRY }}
ECR_REPOSITORY: ${{ env.ECR_REPOSITORY }}
IMAGE_TAG: ${{ github.sha }}
run: |
# 1) 현재 Task Definition의 "taskDefinition" 객체만 추출
TASK_DEF=$(aws ecs describe-task-definition \
--task-definition "$TASK_FAMILY" \
--query 'taskDefinition' \
--output json)
# 2) env.json 읽기
ENV_JSON=$(cat env.json)
# 3) 이미지/환경변수 패치 (모든 컨테이너 유지, 첫 컨테이너만 갱신하거나 이름 매칭)
NEW_TASK_DEF=$(echo "$TASK_DEF" | jq \
--arg IMAGE "$ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG" \
--argjson ENV "$ENV_JSON" '
.containerDefinitions |= (map(
# 단일 컨테이너면 첫 번째만 수정해도 됨. 여러 개면 이름으로 조건 걸기.
if (.name == .name) then
.image = $IMAGE
| .environment = $ENV
else . end
))
# register-task-definition에 필요한 필드만 남기기
| {
family, taskRoleArn, executionRoleArn, networkMode,
containerDefinitions, volumes, placementConstraints,
requiresCompatibilities, cpu, memory, runtimePlatform, ephemeralStorage
}
')
echo "$NEW_TASK_DEF" > new-task-def.json
cat new-task-def.json | jq '.'
# 4) 새 revision 등록
REG_OUT=$(aws ecs register-task-definition --cli-input-json file://new-task-def.json)
NEW_TD_ARN=$(echo "$REG_OUT" | jq -r '.taskDefinition.taskDefinitionArn')
# 5) 서비스에 새 revision 반영
aws ecs update-service \
--cluster "$CLUSTER" \
--service "$SERVICE" \
--task-definition "$NEW_TD_ARN"