1- name : Continuous Deployment for SOPT makers Authentication Development Server
1+ name : Deploy SOPT Makers Authentication Server to Lambda (DEV)
22
33on :
4- workflow_dispatch :
54 push :
6- branches : [ dev ]
5+ branches :
6+ - dev
7+ workflow_dispatch :
78
8- jobs :
9+ env :
10+ PROJECT_NAME : authentication
11+ SAM_PROFILE : dev
12+ AWS_REGION : ${{ secrets.AWS_REGION }}
13+ S3_BUCKET : ${{ secrets.AWS_S3_BUCKET }}
914
10- build-and-push-image :
15+ jobs :
16+ deploy :
1117 runs-on : ubuntu-latest
18+
1219 steps :
13- - name : Checkout
14- uses : actions/checkout@v3
20+ - name : Checkout source
21+ uses : actions/checkout@v4
1522
16- - name : ✅ Set up JDK 21
17- uses : actions/setup-java@v3
23+ - name : Set up Java 21
24+ uses : actions/setup-java@v4
1825 with :
26+ distribution : temurin
1927 java-version : 21
20- distribution : ' corretto'
21- cache : gradle
2228
23- - name : 🔒 Configure AWS credentials
29+ - name : Configure AWS credentials
2430 uses : aws-actions/configure-aws-credentials@v4
2531 with :
2632 aws-access-key-id : ${{ secrets.AWS_ACCESS_KEY }}
2733 aws-secret-access-key : ${{ secrets.AWS_SECRET_KEY }}
28- aws-region : ${{ secrets.AWS_REGION }}
34+ aws-region : ${{ env.AWS_REGION }}
35+
36+ - name : Install AWS SAM CLI
37+ uses : aws-actions/setup-sam@v2
2938
30- - name : ⚙️ Create Property File
39+ - name : Create .env file
40+ run : |
41+ set -e
42+ cat <<EOF > .env
43+ ${{ secrets.ENV_FILE_DEV }}
44+ EOF
45+
46+ - name : Create Property File
3147 run : |
3248 touch ./gradle.properties
3349 echo "${{ secrets.PROPERTY_GRADLE }}" >> ./gradle.properties
3450
35- - name : 📂 Download Keys and Env from S3
36- env :
37- REGION : ${{ secrets.AWS_REGION }}
38- S3_BUCKET : ${{ secrets.AWS_S3_BUCKET }}
39- JWT_PUBLIC_KEY_PATH : ${{ secrets.JWT_PUBLIC_KEY_PATH }}
40- JWT_PRIVATE_KEY_PATH : ${{ secrets.JWT_PRIVATE_KEY_PATH }}
41- TEST_ENV_PATH : ${{ secrets.ENV_FILE_PATH_TEST }}
42- run : |
43- mkdir -p ./src/main/resources
44- aws s3 cp s3://$S3_BUCKET/dev/static/$JWT_PUBLIC_KEY_PATH ./src/main/resources/jwt_public_key.pem --region $REGION
45- aws s3 cp s3://$S3_BUCKET/dev/static/$JWT_PRIVATE_KEY_PATH ./src/main/resources/jwt_private_key.pem --region $REGION
46- mkdir -p ./src/main/resources/env
47- aws s3 cp s3://$S3_BUCKET/dev/$TEST_ENV_PATH ./src/main/resources/env/test.env --region $REGION
48-
49- - name : 🧱 Build and Test with Gradle
50- run : ./gradlew build --no-daemon
51- shell : bash
52-
53- - name : 🧱 Build Image and Push to ECR Public
54- env :
55- AWS_ACCOUNT_ID : ${{ secrets.AWS_ACCOUNT_ID }}
56- AWS_ECR_REPO : ${{ secrets.AWS_ECR_REPO_DEV }}
57- GITHUB_SHA : ${{ github.sha }}
51+ - name : Validate env variables
5852 run : |
59- IMAGE_SHA_TAG=$(echo $GITHUB_SHA | cut -c1-8)
53+ set -e
54+ source .env
6055
61- aws ecr-public get-login-password --region us-east-1 | docker login --username AWS --password-stdin public.ecr.aws
62-
63- docker build --build-arg PROFILE=dev \
64- -t public.ecr.aws/$AWS_ACCOUNT_ID/$AWS_ECR_REPO:latest \
65- -t public.ecr.aws/$AWS_ACCOUNT_ID/$AWS_ECR_REPO:$IMAGE_SHA_TAG .
56+ REQUIRED_VARS=(
57+ SPRING_PROFILES_ACTIVE
6658
67- docker push public.ecr.aws/$AWS_ACCOUNT_ID/$AWS_ECR_REPO:latest
68- docker push public.ecr.aws/$AWS_ACCOUNT_ID/$AWS_ECR_REPO:$IMAGE_SHA_TAG
59+ DB_URL DB_USERNAME DB_PASSWORD DB_DRIVER_CLASS
60+ JPA_DATABASE_PLATFORM JPA_DATABASE
6961
70- - name : 🗑️ Prune old ECR Public images (keep 2 latest)
71- env :
72- ECR_APP_NAME : ${{ secrets.AWS_ECR_REPO_DEV }}
73- run : |
74- echo "Pruning old images, keeping only 2 most recent..."
75- IMAGES=$(aws ecr-public describe-images \
76- --region us-east-1 \
77- --repository-name $ECR_APP_NAME \
78- --query 'sort_by(imageDetails,& imagePushedAt)[*].imageDigest' \
79- --output json)
80-
81- COUNT=$(echo $IMAGES | jq length)
82-
83- if [ "$COUNT" -gt 2 ]; then
84- TO_DELETE=$(echo $IMAGES | jq -c ".[:$((COUNT-2))] | [{imageDigest: .[]}]")
85- if [ "$TO_DELETE" != "[]" ]; then
86- aws ecr-public batch-delete-image \
87- --region us-east-1 \
88- --repository-name $ECR_APP_NAME \
89- --image-ids "$TO_DELETE"
90- else
91- echo "No images to delete."
62+ REDIS_HOST REDIS_PORT REDIS_PASSWORD
63+
64+ KEY_ID ISSUER
65+ ACCESS_TOKEN_EXPIRATION_TIME REFRESH_TOKEN_EXPIRATION_TIME
66+
67+ GABIA_SMS_ID GABIA_SMS_KEY GABIA_SMS_URL GABIA_SMS_PHONE
68+
69+ APPLE_AUD_APP APPLE_AUD_WEB GOOGLE_CLIENT_ID
70+
71+ PLAYGROUND_X_API_KEY CREW_X_API_KEY APP_X_API_KEY
72+ ADMIN_X_API_KEY PLATFORM_X_API_KEY MONITORING_X_API_KEY
73+
74+ JWT_KEY_S3_BUCKET JWT_PUBLIC_KEY_S3_PATH JWT_PRIVATE_KEY_S3_PATH
75+
76+ ACTUATOR_PATH USER_PATH GET_PUBLIC_KEY
77+
78+ MAGIC_LOGIN_PHONE MAGIC_LOGIN_CODE MAGIC_LOGIN_NAME
79+ )
80+
81+ for VAR in "${REQUIRED_VARS[@]}"; do
82+ if [ -z "${!VAR}" ]; then
83+ echo "❌ Missing env: $VAR"
84+ exit 1
9285 fi
93- else
94- echo "Less than or equal to 2 images, skipping prune."
95- fi
86+ done
9687
97- deploy :
98- needs : build-and-push-image
99- runs-on : ubuntu-latest
100- steps :
101- - name : 📥 Checkout Source
102- uses : actions/checkout@v3
88+ echo "✅ All required env variables are present"
10389
104- - name : 🔒 Configure AWS Credentials
105- uses : aws-actions/configure-aws-credentials@v4
106- with :
107- aws-access-key-id : ${{ secrets.AWS_ACCESS_KEY }}
108- aws-secret-access-key : ${{ secrets.AWS_SECRET_KEY }}
109- aws-region : ${{ secrets.AWS_REGION }}
110-
111- - name : 📂 Download Keys and Env from S3
112- env :
113- REGION : ${{ secrets.AWS_REGION }}
114- S3_BUCKET : ${{ secrets.AWS_S3_BUCKET }}
115- JWT_PUBLIC_KEY_PATH : ${{ secrets.JWT_PUBLIC_KEY_PATH }}
116- JWT_PRIVATE_KEY_PATH : ${{ secrets.JWT_PRIVATE_KEY_PATH }}
117- DEV_ENV_FILE_PATH : ${{ secrets.ENV_FILE_PATH_DEV }}
90+ - name : Build Lambda JAR
11891 run : |
119- mkdir -p ./key
120- aws s3 cp s3://$S3_BUCKET/dev/static/$JWT_PUBLIC_KEY_PATH ./key/jwt_public_key.pem --region $REGION
121- aws s3 cp s3://$S3_BUCKET/dev/static/$JWT_PRIVATE_KEY_PATH ./key/jwt_private_key.pem --region $REGION
122- aws s3 cp s3://$S3_BUCKET/dev/$DEV_ENV_FILE_PATH .env --region $REGION
92+ set -e
93+ chmod +x gradlew
94+ source .env
95+ ./gradlew clean lambdaJar -x test -Pprofile=dev
12396
124- - name : 🔄 Transfer Deployment Files to EC2
125- uses : appleboy/scp-action@master
126- with :
127- host : ${{ secrets.HOST_DEV }}
128- username : ec2-user
129- key : ${{ secrets.PEM_KEY_DEV }}
130- port : 22
131- source : " .env,docker-compose.yml,scripts,key"
132- target : /home/ec2-user/authentication
133- overwrite : true
134-
135- - name : 🚀 Remote SSH Deployment
136- uses : appleboy/ssh-action@master
137- with :
138- host : ${{ secrets.HOST_DEV }}
139- username : ec2-user
140- key : ${{ secrets.PEM_KEY_DEV }}
141- port : 22
142- script : |
143- sudo chmod +x /home/ec2-user/authentication/scripts/*.sh
144- cd /home/ec2-user/authentication/scripts
145- ./deploy.sh
97+ - name : Upload Lambda artifact to S3
98+ run : |
99+ set -e
100+ ZIP_FILE=$(find build/distributions -name "*-lambda.zip" | head -1)
101+
102+ if [ -z "$ZIP_FILE" ]; then
103+ echo "❌ Lambda ZIP file not found"
104+ exit 1
105+ fi
106+
107+ TIMESTAMP=$(date +"%Y%m%d-%H%M%S")
108+ S3_KEY="${SAM_PROFILE}/lambda/${PROJECT_NAME}-${TIMESTAMP}.zip"
109+ aws s3 cp "$ZIP_FILE" "s3://${S3_BUCKET}/${S3_KEY}"
110+ echo "S3_KEY=$S3_KEY" >> $GITHUB_ENV
111+
112+ - name : Deploy with SAM
113+ run : |
114+ set -e
115+ source .env
116+ cd lambda
117+
118+ sam deploy \
119+ --config-env ${SAM_PROFILE} \
120+ --no-fail-on-empty-changeset \
121+ --parameter-overrides \
122+ S3Bucket="${S3_BUCKET}" \
123+ S3Key="${S3_KEY}" \
124+ Profile="${SAM_PROFILE}" \
125+ DbUrl="${DB_URL}" \
126+ DbUsername="${DB_USERNAME}" \
127+ DbPassword="${DB_PASSWORD}" \
128+ DbDriverClass="${DB_DRIVER_CLASS}" \
129+ JpaDatabasePlatform="${JPA_DATABASE_PLATFORM}" \
130+ JpaDatabase="${JPA_DATABASE}" \
131+ RedisHost="${REDIS_HOST}" \
132+ RedisPort="${REDIS_PORT}" \
133+ RedisPassword="${REDIS_PASSWORD}" \
134+ KeyId="${KEY_ID}" \
135+ AccessTokenExpirationTime="${ACCESS_TOKEN_EXPIRATION_TIME}" \
136+ RefreshTokenExpirationTime="${REFRESH_TOKEN_EXPIRATION_TIME}" \
137+ Issuer="${ISSUER}" \
138+ GabiaSmsId="${GABIA_SMS_ID}" \
139+ GabiaSmsKey="${GABIA_SMS_KEY}" \
140+ GabiaSmsUrl="${GABIA_SMS_URL}" \
141+ GabiaSmsPhone="${GABIA_SMS_PHONE}" \
142+ AppleAudApp="${APPLE_AUD_APP}" \
143+ AppleAudWeb="${APPLE_AUD_WEB}" \
144+ GoogleClientId="${GOOGLE_CLIENT_ID}" \
145+ PlaygroundXApiKey="${PLAYGROUND_X_API_KEY}" \
146+ CrewXApiKey="${CREW_X_API_KEY}" \
147+ AppXApiKey="${APP_X_API_KEY}" \
148+ AdminXApiKey="${ADMIN_X_API_KEY}" \
149+ PlatformXApiKey="${PLATFORM_X_API_KEY}" \
150+ MonitoringXApiKey="${MONITORING_X_API_KEY}" \
151+ JwtKeyS3Bucket="${JWT_KEY_S3_BUCKET}" \
152+ JwtPublicKeyS3Path="${JWT_PUBLIC_KEY_S3_PATH}" \
153+ JwtPrivateKeyS3Path="${JWT_PRIVATE_KEY_S3_PATH}" \
154+ ActuatorPath="${ACTUATOR_PATH}" \
155+ UserPath="${USER_PATH}" \
156+ GetPublicKey="${GET_PUBLIC_KEY}" \
157+ MagicLoginPhone="${MAGIC_LOGIN_PHONE}" \
158+ MagicLoginCode="${MAGIC_LOGIN_CODE}" \
159+ MagicLoginName="${MAGIC_LOGIN_NAME}"
160+
161+
162+ - name : Output API Endpoint
163+ run : |
164+ aws cloudformation describe-stacks \
165+ --stack-name "${PROJECT_NAME}-${SAM_PROFILE}" \
166+ --query "Stacks[0].Outputs[?OutputKey=='ApiEndpoint'].OutputValue" \
167+ --output text
0 commit comments