Repository navigation
146 lines (127 loc) · 5.45 KB
/
Copy pathcd-prod.yml
File metadata and controls
146 lines (127 loc) · 5.45 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
name: Continuous Deployment for SOPT makers Authentication Production Server
on:
workflow_dispatch:
push:
branches: [ prod ]
jobs:
build-and-push-image:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v3
- name: ✅ Set up JDK 21
uses: actions/setup-java@v3
with:
java-version: 21
distribution: 'corretto'
cache: gradle
- name: 🔒 Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v4
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_KEY }}
aws-region: ${{ secrets.AWS_REGION }}
- name: ⚙️ Create Property File
run: |
touch ./gradle.properties
echo "${{ secrets.PROPERTY_GRADLE }}" >> ./gradle.properties
- name: 📂 Download Keys and Env from S3
env:
REGION: ${{ secrets.AWS_REGION }}
S3_BUCKET: ${{ secrets.AWS_S3_BUCKET }}
JWT_PUBLIC_KEY_PATH: ${{ secrets.JWT_PUBLIC_KEY_PATH }}
JWT_PRIVATE_KEY_PATH: ${{ secrets.JWT_PRIVATE_KEY_PATH }}
TEST_ENV_PATH: ${{ secrets.ENV_FILE_PATH_TEST }}
run: |
mkdir -p ./src/main/resources
aws s3 cp s3://$S3_BUCKET/prod/static/$JWT_PUBLIC_KEY_PATH ./src/main/resources/jwt_public_key.pem --region $REGION
aws s3 cp s3://$S3_BUCKET/prod/static/$JWT_PRIVATE_KEY_PATH ./src/main/resources/jwt_private_key.pem --region $REGION
mkdir -p ./src/main/resources/env
aws s3 cp s3://$S3_BUCKET/prod/$TEST_ENV_PATH ./src/main/resources/env/test.env --region $REGION
- name: 🧱 Build and Test with Gradle
run: ./gradlew build --no-daemon -Pprofile=prod
shell: bash
- name: 🧱 Build Image and Push to ECR Public
env:
AWS_ACCOUNT_ID: ${{ secrets.AWS_ACCOUNT_ID }}
AWS_ECR_REPO: ${{ secrets.AWS_ECR_REPO_PROD }}
GITHUB_SHA: ${{ github.sha }}
run: |
IMAGE_SHA_TAG=$(echo $GITHUB_SHA | cut -c1-8)
aws ecr-public get-login-password --region us-east-1 | docker login --username AWS --password-stdin public.ecr.aws
# build & tag directly with full repo path
docker build --build-arg PROFILE=prod \
-t public.ecr.aws/$AWS_ACCOUNT_ID/$AWS_ECR_REPO:latest \
-t public.ecr.aws/$AWS_ACCOUNT_ID/$AWS_ECR_REPO:$IMAGE_SHA_TAG .
# push both tags
docker push public.ecr.aws/$AWS_ACCOUNT_ID/$AWS_ECR_REPO:latest
docker push public.ecr.aws/$AWS_ACCOUNT_ID/$AWS_ECR_REPO:$IMAGE_SHA_TAG
- name: 🗑️ Prune old ECR Public images (keep 5 latest)
env:
ECR_APP_NAME: ${{ secrets.AWS_ECR_REPO_PROD }}
run: |
echo "Pruning old images, keeping only 5 most recent..."
IMAGES=$(aws ecr-public describe-images \
--region us-east-1 \
--repository-name $ECR_APP_NAME \
--query 'sort_by(imageDetails,& imagePushedAt)[*].imageDigest' \
--output json)
COUNT=$(echo $IMAGES | jq length)
if [ "$COUNT" -gt 5 ]; then
TO_DELETE=$(echo $IMAGES | jq -c ".[:$((COUNT-5))] | [{imageDigest: .[]}]")
if [ "$TO_DELETE" != "[]" ]; then
aws ecr-public batch-delete-image \
--region us-east-1 \
--repository-name $ECR_APP_NAME \
--image-ids "$TO_DELETE"
else
echo "No images to delete."
fi
else
echo "Less than or equal to 5 images, skipping prune."
fi
deploy:
needs: build-and-push-image
runs-on: ubuntu-latest
steps:
- name: 📥 Checkout Source
uses: actions/checkout@v3
- name: 🔒 Configure AWS Credentials
uses: aws-actions/configure-aws-credentials@v4
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_KEY }}
aws-region: ${{ secrets.AWS_REGION }}
- name: 📂 Download Keys and Env from S3
env:
REGION: ${{ secrets.AWS_REGION }}
S3_BUCKET: ${{ secrets.AWS_S3_BUCKET }}
JWT_PUBLIC_KEY_PATH: ${{ secrets.JWT_PUBLIC_KEY_PATH }}
JWT_PRIVATE_KEY_PATH: ${{ secrets.JWT_PRIVATE_KEY_PATH }}
PROD_ENV_FILE_PATH: ${{ secrets.ENV_FILE_PATH_PROD }}
run: |
mkdir -p ./key
aws s3 cp s3://$S3_BUCKET/prod/static/$JWT_PUBLIC_KEY_PATH ./key/jwt_public_key.pem --region $REGION
aws s3 cp s3://$S3_BUCKET/prod/static/$JWT_PRIVATE_KEY_PATH ./key/jwt_private_key.pem --region $REGION
aws s3 cp s3://$S3_BUCKET/prod/$PROD_ENV_FILE_PATH .env --region $REGION
- name: 🔄 Transfer Deployment Files to EC2
uses: appleboy/scp-action@master
with:
host: ${{ secrets.HOST_PROD }}
username: ubuntu
key: ${{ secrets.PEM_KEY_PROD }}
port: 22
source: ".env,docker-compose.yml,scripts,key"
target: /home/ubuntu/authentication
overwrite: true
- name: 🚀 Remote SSH Deployment
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.HOST_PROD }}
username: ubuntu
key: ${{ secrets.PEM_KEY_PROD }}
port: 22
script: |
sudo chmod +x /home/ubuntu/authentication/scripts/*.sh
cd /home/ubuntu/authentication/scripts
./deploy.sh