Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
121 changes: 121 additions & 0 deletions .github/workflows/cd-prod.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,121 @@
name: CD-PROD

on:
workflow_run:
workflows: ["CI-PROD"]
types: [completed]
workflow_dispatch:

concurrency:
group: cd-prod
cancel-in-progress: false

permissions:
contents: read
id-token: write

env:
AWS_REGION: ${{ vars.AWS_REGION }}
ECR_REGISTRY: ${{ vars.ECR_REGISTRY }}
ECR_REPOSITORY: ${{ vars.ECR_REPOSITORY }}
ECS_CLUSTER: ${{ vars.ECS_CLUSTER }}
ECS_SERVICE: ${{ vars.ECS_SERVICE }}
TASK_FAMILY: ${{ vars.TASK_FAMILY }}
CONTAINER_NAME: ${{ vars.CONTAINER_NAME }}

jobs:
deploy:
if: >
github.event_name == 'workflow_dispatch' ||
(github.event_name == 'workflow_run' && github.event.workflow_run.conclusion == 'success')
runs-on: ubuntu-latest
timeout-minutes: 20

steps:
- name: Configure AWS credentials (OIDC)
uses: aws-actions/configure-aws-credentials@v4
with:
role-to-assume: ${{ secrets.AWS_ROLE_ARN }}
aws-region: ${{ env.AWS_REGION }}

- name: Resolve image tag
id: tag
run: |
if [ "${{ github.event_name }}" = "workflow_run" ]; then
IMAGE_TAG="${{ github.event.workflow_run.head_sha }}"
else
IMAGE_TAG="${{ github.sha }}"
fi
IMAGE_TAG="${IMAGE_TAG:0:7}"
echo "image_tag=${IMAGE_TAG}" >> "$GITHUB_OUTPUT"

- name: Verify image exists in ECR
run: |
aws ecr describe-images \
--repository-name "${ECR_REPOSITORY}" \
--image-ids imageTag="${{ steps.tag.outputs.image_tag }}" \
> /dev/null

- name: Get current task definition
run: |
aws ecs describe-task-definition \
--task-definition "${TASK_FAMILY}" \
--query 'taskDefinition' > taskdef.json

- name: Render new task definition
env:
IMAGE_URI: ${{ env.ECR_REGISTRY }}/${{ env.ECR_REPOSITORY }}:${{ steps.tag.outputs.image_tag }}
run: |
jq \
--arg CN "${CONTAINER_NAME}" \
--arg IMG "${IMAGE_URI}" \
--arg SPRING_PROFILES_ACTIVE "prod" \
--arg SERVER_PORT "19000" \
--arg EUREKA_ENABLED "${{ vars.EUREKA_ENABLED }}" \
--arg EUREKA_HOST "${{ vars.EUREKA_HOST }}" \
--arg EUREKA_PORT "${{ vars.EUREKA_PORT }}" \
--arg JWT_SECRET "${{ secrets.JWT_SECRET }}" \
'
.containerDefinitions |= map(
if .name == $CN then
.image = $IMG
| .environment = [
{"name":"SPRING_PROFILES_ACTIVE","value":$SPRING_PROFILES_ACTIVE},
{"name":"SERVER_PORT","value":$SERVER_PORT},
{"name":"EUREKA_ENABLED","value":$EUREKA_ENABLED},
{"name":"EUREKA_HOST","value":$EUREKA_HOST},
{"name":"EUREKA_PORT","value":$EUREKA_PORT},
{"name":"JWT_SECRET","value":$JWT_SECRET}
]
else .
end
)
| del(
.taskDefinitionArn, .revision, .status,
.requiresAttributes, .compatibilities,
.registeredAt, .registeredBy
)
' taskdef.json > taskdef.new.json

- name: Register new task definition revision
id: register
run: |
ARN=$(aws ecs register-task-definition \
--cli-input-json file://taskdef.new.json \
--query 'taskDefinition.taskDefinitionArn' \
--output text)
echo "task_def_arn=${ARN}" >> "$GITHUB_OUTPUT"

- name: Deploy to ECS service
run: |
aws ecs update-service \
--cluster "${ECS_CLUSTER}" \
--service "${ECS_SERVICE}" \
--task-definition "${{ steps.register.outputs.task_def_arn }}" \
--force-new-deployment

- name: Wait for stable
run: |
aws ecs wait services-stable \
--cluster "${ECS_CLUSTER}" \
--services "${ECS_SERVICE}"
2 changes: 1 addition & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ name: Java CI with Gradle

on:
pull_request:
branches: [ "dev", "main" ]
branches: [ "dev"]

jobs:
build:
Expand Down
Loading