Continuous Deployment to Dev #56
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: Continuous Deployment to Dev | |
on: | |
workflow_dispatch: | |
inputs: | |
version: | |
description: 'Version to deploy (e.g., v1.2.3)' | |
required: true | |
type: string | |
default: 'latest' | |
env: | |
AWS_REGION: ap-northeast-2 | |
ECR_REPOSITORY: threedays-app | |
EB_APPLICATION_NAME: threedays-dev | |
EB_ENVIRONMENT_NAME: threedays-dev-env | |
DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK }} | |
jobs: | |
deploy: | |
runs-on: ubuntu-latest | |
environment: dev | |
steps: | |
- name: Checkout code | |
uses: actions/checkout@v4 | |
- name: Determine version to deploy | |
id: determine-version | |
env: | |
GITHUB_EVENT_NAME: ${{ github.event_name }} | |
REPOSITORY_DISPATCH_VERSION: ${{ github.event.client_payload.version }} | |
WORKFLOW_DISPATCH_VERSION: ${{ github.event.inputs.version }} | |
run: | | |
if [ "${GITHUB_EVENT_NAME}" = "repository_dispatch" ]; then | |
echo "VERSION=${REPOSITORY_DISPATCH_VERSION}" >> $GITHUB_OUTPUT | |
elif [ "${GITHUB_EVENT_NAME}" = "workflow_dispatch" ]; then | |
echo "VERSION=${WORKFLOW_DISPATCH_VERSION}" >> $GITHUB_OUTPUT | |
else | |
echo "Error: Unexpected event type" | |
exit 1 | |
fi | |
- name: Send Deployment Start Webhook | |
env: | |
WORKFLOW_URL: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }} | |
VERSION: ${{ steps.determine-version.outputs.VERSION }} | |
run: | | |
curl -H "Content-Type: application/json" -X POST -d '{ | |
"embeds": [{ | |
"title": "๋ฐฐํฌ ์์", | |
"color": 16776960, | |
"fields": [ | |
{ | |
"name": "๋ฒ์ ", | |
"value": "'"${VERSION}"'", | |
"inline": true | |
}, | |
{ | |
"name": "ํ๊ฒฝ", | |
"value": "'"${EB_ENVIRONMENT_NAME}"'", | |
"inline": true | |
}, | |
{ | |
"name": "๋ฐฐํฌ์", | |
"value": "'"${GITHUB_ACTOR}"'", | |
"inline": true | |
} | |
], | |
"url": "'"${WORKFLOW_URL}"'" | |
}] | |
}' ${{ env.DISCORD_WEBHOOK }} | |
- name: Configure AWS credentials | |
uses: aws-actions/configure-aws-credentials@v4 | |
with: | |
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} | |
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} | |
aws-region: ${{ env.AWS_REGION }} | |
- name: Login to Amazon ECR | |
id: login-ecr | |
uses: aws-actions/amazon-ecr-login@v2 | |
- name: Check if image exists in ECR | |
id: check-image | |
env: | |
ECR_REPOSITORY: ${{ env.ECR_REPOSITORY }} | |
VERSION: ${{ steps.determine-version.outputs.VERSION }} | |
run: | | |
set +e | |
aws ecr describe-images --repository-name $ECR_REPOSITORY --image-ids imageTag=$VERSION | |
EXIT_CODE=$? | |
set -e | |
if [ $EXIT_CODE -ne 0 ]; then | |
echo "::error::ECR ๋ฆฌํฌ์งํ ๋ฆฌ $ECR_REPOSITORY ์ ํ๊ทธ $VERSION ์ ์ด๋ฏธ์ง๊ฐ ์กด์ฌํ์ง ์์ต๋๋ค." | |
exit 1 | |
fi | |
echo "ECR์์ ์ด๋ฏธ์ง๋ฅผ ์ฐพ์์ต๋๋ค." | |
- name: Generate Dockerrun.aws.json with environment variables | |
env: | |
VERSION: ${{ steps.determine-version.outputs.VERSION }} | |
REGISTRY_URL: ${{ steps.login-ecr.outputs.registry }} | |
ECR_REPOSITORY: ${{ env.ECR_REPOSITORY }} | |
VARS_CONTEXT: ${{ toJson(vars) }} | |
SECRETS_CONTEXT: ${{ toJson(secrets) }} | |
run: | | |
cat > Dockerrun.aws.json << EOF | |
{ | |
"AWSEBDockerrunVersion": "1", | |
"Image": { | |
"Name": "${REGISTRY_URL}/${ECR_REPOSITORY}:${VERSION}", | |
"Update": "true" | |
}, | |
"Ports": [ | |
{ | |
"ContainerPort": 8080, | |
"HostPort": 80 | |
} | |
], | |
"Volumes": [], | |
"Logging": "/var/log/nginx" | |
} | |
EOF | |
echo '{}' | jq --argjson secrets "$SECRETS_CONTEXT" \ | |
--argjson vars "$VARS_CONTEXT" \ | |
'$secrets + $vars | to_entries | map(select(.key | test("^AWS_") | not) | {key: .key, value: .value})' \ | |
> env_vars.json | |
- name: Create .ebextensions directory | |
run: mkdir -p .ebextensions | |
- name: Create env.config file | |
run: | | |
cat > .ebextensions/env.config << EOF | |
option_settings: | |
aws:elasticbeanstalk:application:environment: | |
EOF | |
jq -r '.[] | " \(.key): \"\(.value)\""' env_vars.json >> .ebextensions/env.config | |
- name: Create deployment package | |
run: | | |
zip -r deploy.zip Dockerrun.aws.json .ebextensions | |
- name: Get current time | |
id: current-time | |
run: echo "::set-output name=time::$(date +'%Y%m%d%H%M%S')" | |
- name: Deploy to Elastic Beanstalk | |
id: deploy | |
uses: einaregilsson/beanstalk-deploy@v22 | |
with: | |
aws_access_key: ${{ secrets.AWS_ACCESS_KEY_ID }} | |
aws_secret_key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} | |
application_name: ${{ env.EB_APPLICATION_NAME }} | |
environment_name: ${{ env.EB_ENVIRONMENT_NAME }} | |
version_label: ${{ steps.determine-version.outputs.VERSION }}-${{ steps.current-time.outputs.time }} | |
region: ${{ env.AWS_REGION }} | |
deployment_package: deploy.zip | |
use_existing_version_if_available: false | |
- name: Send Deployment Success Webhook | |
if: success() | |
env: | |
VERSION: ${{ steps.determine-version.outputs.VERSION }} | |
WORKFLOW_URL: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }} | |
run: | | |
curl -H "Content-Type: application/json" -X POST -d '{ | |
"embeds": [{ | |
"title": "๋ฐฐํฌ ์ฑ๊ณต", | |
"color": 65280, | |
"fields": [ | |
{ | |
"name": "๋ฒ์ ", | |
"value": "'"${VERSION}"'", | |
"inline": true | |
}, | |
{ | |
"name": "ํ๊ฒฝ", | |
"value": "'"${EB_ENVIRONMENT_NAME}"'", | |
"inline": true | |
}, | |
{ | |
"name": "๋ฐฐํฌ์", | |
"value": "'"${GITHUB_ACTOR}"'", | |
"inline": true | |
} | |
], | |
"url": "'"${WORKFLOW_URL}"'" | |
}] | |
}' ${{ env.DISCORD_WEBHOOK }} | |
- name: Send Deployment Failure Webhook | |
if: failure() | |
env: | |
VERSION: ${{ steps.determine-version.outputs.VERSION }} | |
WORKFLOW_URL: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }} | |
run: | | |
curl -H "Content-Type: application/json" -X POST -d '{ | |
"embeds": [{ | |
"title": "๋ฐฐํฌ ์คํจ", | |
"color": 16711680, | |
"fields": [ | |
{ | |
"name": "๋ฒ์ ", | |
"value": "'"${VERSION}"'", | |
"inline": true | |
}, | |
{ | |
"name": "ํ๊ฒฝ", | |
"value": "'"${EB_ENVIRONMENT_NAME}"'", | |
"inline": true | |
}, | |
{ | |
"name": "๋ฐฐํฌ์", | |
"value": "'"${GITHUB_ACTOR}"'", | |
"inline": true | |
} | |
], | |
"url": "'"${WORKFLOW_URL}"'" | |
}] | |
}' ${{ env.DISCORD_WEBHOOK }} |