|
| 1 | +#!/bin/bash -l |
| 2 | +set -e |
| 3 | +MAX_POLLING_ITERATIONS=60 |
| 4 | + |
| 5 | +# 1) Load our permissions in for aws-cli |
| 6 | +export AWS_ACCESS_KEY_ID=$INPUT_AWS_ACCESS_KEY |
| 7 | +export AWS_SECRET_ACCESS_KEY=$INPUT_AWS_SECRET_KEY |
| 8 | +export AWS_DEFAULT_REGION=$INPUT_AWS_REGION |
| 9 | + |
| 10 | +# 2) Zip up the package |
| 11 | +DIR_TO_ZIP="./$INPUT_DIRECTORY" |
| 12 | +if [ ! -f "$DIR_TO_ZIP/appspec.yml" ]; then |
| 13 | + echo "::error::appspec.yml was not located at: $DIR_TO_ZIP" |
| 14 | + exit 1; |
| 15 | +fi |
| 16 | + |
| 17 | +ZIP_FILENAME=$GITHUB_RUN_ID-$GITHUB_SHA.zip |
| 18 | +EXCLUDED_FILES_COMMAND=$(sed -En "s/ /-x/p") |
| 19 | + |
| 20 | +zip -r --quiet "$ZIP_FILENAME" "$DIR_TO_ZIP" -x "$EXCLUDED_FILES_COMMAND" -x \*.git\* |
| 21 | +if [ ! -f "$ZIP_FILENAME" ]; then |
| 22 | + echo "::error::$ZIP_FILENAME was not generated properly (zip generation failed)." |
| 23 | + exit 1; |
| 24 | +fi |
| 25 | + |
| 26 | +if [ "$(unzip -l "$ZIP_FILENAME" | grep -q appspec.yml)" = "0" ]; then |
| 27 | + echo "::error::$ZIP_FILENAME was not generated properly (missing appspec.yml)." |
| 28 | + exit 1; |
| 29 | +fi |
| 30 | + |
| 31 | +# 3) Upload the deployment to S3, drop old archive. |
| 32 | +function getArchiveETag() { |
| 33 | + aws s3api head-object --bucket "$INPUT_S3_BUCKET" \ |
| 34 | + --key "$INPUT_S3_FOLDER"/"$ZIP_FILENAME" \ |
| 35 | + --query ETag --output text |
| 36 | +} |
| 37 | + |
| 38 | +aws s3 cp "$ZIP_FILENAME" s3://"$INPUT_S3_BUCKET"/"$INPUT_S3_FOLDER"/"$ZIP_FILENAME" > /dev/null 2>&1 |
| 39 | +ZIP_ETAG=$(getArchiveETag) |
| 40 | + |
| 41 | +rm "$ZIP_FILENAME" |
| 42 | + |
| 43 | +# 4) Start the CodeDeploy |
| 44 | +function getActiveDeployments() { |
| 45 | + aws deploy list-deployments --application-name "$INPUT_CODEDEPLOY_NAME" \ |
| 46 | + --deployment-group-name "$INPUT_CODEDEPLOY_GROUP" \ |
| 47 | + --include-only-statuses "Queued" "InProgress" "Stopped" | jq -r '.deployments'; |
| 48 | +} |
| 49 | + |
| 50 | +function pollForActiveDeployments() { |
| 51 | + deadlockCounter=0; |
| 52 | + while [ "$(getActiveDeployments)" != "[]" ]; do |
| 53 | + echo "::warning::Deployment in progress. Sleeping 15 seconds. (Try $((++deadlockCounter)))"; |
| 54 | + |
| 55 | + if [ "$deadlockCounter" -gt "$MAX_POLLING_ITERATIONS" ]; then |
| 56 | + echo "::error:: Max polling iterations reached (15min)." |
| 57 | + exit 1; |
| 58 | + fi |
| 59 | + sleep 15s; |
| 60 | + done; |
| 61 | +} |
| 62 | +pollForActiveDeployments |
| 63 | + |
| 64 | +# 5) Poll / Complete |
| 65 | +function deployRevision() { |
| 66 | + aws deploy create-deployment \ |
| 67 | + --application-name "$INPUT_CODEDEPLOY_NAME" \ |
| 68 | + --deployment-group-name "$INPUT_CODEDEPLOY_GROUP" \ |
| 69 | + --description "$GITHUB_REF - $GITHUB_SHA" \ |
| 70 | + --s3-location bucket="$INPUT_S3_BUCKET",bundleType=zip,eTag="$ZIP_ETAG",key="$INPUT_S3_FOLDER"/"$ZIP_FILENAME" > /dev/null 2>&1 |
| 71 | +} |
| 72 | + |
| 73 | +echo "Deploying to $INPUT_CODEDEPLOY_GROUP."; |
| 74 | +deployRevision |
| 75 | + |
| 76 | +sleep 10; |
| 77 | +pollForActiveDeployments |
| 78 | +echo "Deployed to $INPUT_CODEDEPLOY_GROUP!"; |
| 79 | +exit 0; |
0 commit comments