-
Notifications
You must be signed in to change notification settings - Fork 429
feat(layer): publish SAR v2 via Github actions #1585
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Merged
Changes from all commits
Commits
Show all changes
45 commits
Select commit
Hold shift + click to select a range
567939b
feat(sar): add support for publishing SAR via Github Actions
rubenfonseca 447f51a
chore: generate hashes for all deps
rubenfonseca 558e333
chore: use git version to build layer
rubenfonseca 320f47f
chore: fix action
rubenfonseca 958e61c
chore: rely on RELEASE_TAG_VERSION
rubenfonseca 1ddedf2
fix: typo
rubenfonseca 2132216
fix: require version input
rubenfonseca 470a097
chore: fix
rubenfonseca 75a7a7c
fix: rename stack names so it doesn't clash with v1
rubenfonseca c9f64b9
fix: change stack names
rubenfonseca 6c9c066
fix: use new SAR role
rubenfonseca 17b6f3d
fix: assume role after assuming OIDC role
rubenfonseca 09b984d
fix: typo
rubenfonseca 498c6c3
fix: assume sar
rubenfonseca 7f1fe80
fix: role duration session
rubenfonseca a3eecbf
fix: env
rubenfonseca 91bc1e1
fix: sed escape
rubenfonseca d50d531
fix: sam version
rubenfonseca c467ee0
fix: remove cdk
rubenfonseca ede9983
fix: debug
rubenfonseca 99b88a3
fix: readme and license path
rubenfonseca ae235bd
fix: path
rubenfonseca 477545d
fix: change SAR region
rubenfonseca 45e8c27
fix: force version
rubenfonseca 66ca24a
chore: now remove the test SAR
rubenfonseca 46435de
fix: artifact path
rubenfonseca 90c175b
feat: add SAR canary
rubenfonseca 25dd302
fix: typo
rubenfonseca 4a66642
fix: aws output
rubenfonseca e0774a7
fix: debug
rubenfonseca 46425ea
fix: it will work now
rubenfonseca e7fa0ae
fix: typo
rubenfonseca 226242f
chore: add production
rubenfonseca 9d6177c
chore: parallelize SAR
rubenfonseca b8798b2
fix: cleanup
rubenfonseca 136d0e3
fix: comment out deploy production layer for the time being
rubenfonseca b98d539
fix: cleanup
rubenfonseca 987b524
chore: apply suggestions from code review
rubenfonseca 0f62b6e
chore: add comments to the SAR workflow
rubenfonseca f4cc412
fix: stop using deprecated set-output
rubenfonseca 9f10f5e
fix: remove unecessary ENV
rubenfonseca 9abec5a
chore: line editing
heitorlessa 578448a
chore: line editing
heitorlessa 57b40ab
chore: line editing part2
heitorlessa 54f79f8
chore: typo from line-editing
heitorlessa File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or 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
This file contains hidden or 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
This file contains hidden or 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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,139 @@ | ||
name: Deploy V2 SAR | ||
|
||
# SAR deployment process | ||
# | ||
# 1. This workflow starts after the layer artifact is produced on `publish_v2_layer` | ||
# 2. We use the same layer artifact to ensure the SAR app is consistent with the published Lambda Layer | ||
# 3. We publish the SAR for both x86_64 and arm64 (see `matrix` section) | ||
# 4. We use `sam package` and `sam publish` to publish the SAR app | ||
# 5. We remove the previous Canary stack (if present) and deploy a new one to test the SAR App. We retain the Canary in the account for debugging purposes | ||
# 6. Finally the published SAR app is made public on the PROD environment | ||
|
||
permissions: | ||
id-token: write | ||
contents: read | ||
|
||
env: | ||
NODE_VERSION: 16.12 | ||
AWS_REGION: eu-west-1 | ||
SAR_NAME: aws-lambda-powertools-python-layer-v2 | ||
TEST_STACK_NAME: serverlessrepo-v2-powertools-layer-test-stack | ||
|
||
on: | ||
workflow_call: | ||
inputs: | ||
stage: | ||
description: "Deployment stage (BETA, PROD)" | ||
required: true | ||
type: string | ||
artefact-name: | ||
description: "CDK Layer Artefact name to download" | ||
required: true | ||
type: string | ||
package-version: | ||
description: "The version of the package to deploy" | ||
required: true | ||
type: string | ||
environment: | ||
description: "GitHub Environment to use for encrypted secrets" | ||
required: true | ||
type: string | ||
|
||
jobs: | ||
deploy-sar-app: | ||
runs-on: ubuntu-latest | ||
environment: ${{ inputs.environment }} | ||
strategy: | ||
matrix: | ||
architecture: ["x86_64", "arm64"] | ||
steps: | ||
- name: Checkout | ||
uses: actions/checkout@v3 | ||
- name: AWS credentials | ||
uses: aws-actions/configure-aws-credentials@v1 | ||
with: | ||
aws-region: ${{ env.AWS_REGION }} | ||
role-to-assume: ${{ secrets.AWS_LAYERS_ROLE_ARN }} | ||
- name: AWS credentials SAR role | ||
uses: aws-actions/configure-aws-credentials@v1 | ||
id: aws-credentials-sar-role | ||
with: | ||
aws-access-key-id: ${{ env.AWS_ACCESS_KEY_ID }} | ||
aws-secret-access-key: ${{ env.AWS_SECRET_ACCESS_KEY }} | ||
aws-session-token: ${{ env.AWS_SESSION_TOKEN }} | ||
role-duration-seconds: 1200 | ||
aws-region: ${{ env.AWS_REGION }} | ||
role-to-assume: ${{ secrets.AWS_SAR_V2_ROLE_ARN }} | ||
- name: Setup Node.js | ||
uses: actions/setup-node@v3 | ||
with: | ||
node-version: ${{ env.NODE_VERSION }} | ||
- name: Download artifact | ||
uses: actions/download-artifact@v3 | ||
with: | ||
name: ${{ inputs.artefact-name }} | ||
- name: Unzip artefact | ||
run: unzip cdk.out.zip | ||
- name: Configure SAR name | ||
run: | | ||
if [[ "${{ inputs.stage }}" == "BETA" ]]; then | ||
SAR_NAME="test-${SAR_NAME}" | ||
fi | ||
echo SAR_NAME="${SAR_NAME}" >> "$GITHUB_ENV" | ||
- name: Adds arm64 suffix to SAR name | ||
if: ${{ matrix.architecture == 'arm64' }} | ||
run: echo SAR_NAME="${SAR_NAME}-arm64" >> "$GITHUB_ENV" | ||
- name: Deploy SAR | ||
run: | | ||
rubenfonseca marked this conversation as resolved.
Show resolved
Hide resolved
|
||
# From the generated LayerStack cdk.out artifact, find the layer asset path for the correct architecture. | ||
# We'll use this as the source directory of our SAR. This way we are re-using the same layer asset for our SAR. | ||
asset=$(jq -jc '.Resources[] | select(.Properties.CompatibleArchitectures == ["${{ matrix.architecture }}"]) | .Metadata."aws:asset:path"' cdk.out/LayerV2Stack.template.json) | ||
|
||
# fill in the SAR SAM template | ||
sed -e "s|<VERSION>|${{ inputs.package-version }}|g" -e "s/<SAR_APP_NAME>/${{ env.SAR_NAME }}/g" -e "s|<LAYER_CONTENT_PATH>|./cdk.out/$asset|g" layer/sar/template.txt > template.yml | ||
|
||
# SAR needs a README and a LICENSE, so just copy the ones from the repo | ||
cp README.md LICENSE "./cdk.out/$asset/" | ||
|
||
# Package the SAR to our SAR S3 bucket, and publish it | ||
sam package --template-file template.yml --output-template-file packaged.yml --s3-bucket ${{ secrets.AWS_SAR_S3_BUCKET }} | ||
sam publish --template packaged.yml --region "$AWS_REGION" | ||
- name: Deploy BETA canary | ||
if: ${{ inputs.stage == 'BETA' }} | ||
run: | | ||
if [[ "${{ matrix.architecture }}" == "arm64" ]]; then | ||
TEST_STACK_NAME="${TEST_STACK_NAME}-arm64" | ||
fi | ||
|
||
echo "Check if stack does not exist" | ||
stack_exists=$(aws cloudformation list-stacks --query "StackSummaries[?(StackName == '$TEST_STACK_NAME' && StackStatus == 'CREATE_COMPLETE')].{StackId:StackId, StackName:StackName, CreationTime:CreationTime, StackStatus:StackStatus}" --output text) | ||
|
||
if [[ -n "$stack_exists" ]] ; then | ||
rubenfonseca marked this conversation as resolved.
Show resolved
Hide resolved
|
||
echo "Found test deployment stack, removing..." | ||
aws cloudformation delete-stack --stack-name "$TEST_STACK_NAME" | ||
aws cloudformation wait stack-delete-complete --stack-name "$TEST_STACK_NAME" | ||
fi | ||
|
||
echo "Creating canary stack" | ||
echo "Stack name: $TEST_STACK_NAME" | ||
aws serverlessrepo create-cloud-formation-change-set --application-id arn:aws:serverlessrepo:${{ env.AWS_REGION }}:${{ steps.aws-credentials-sar-role.outputs.aws-account-id }}:applications/${{ env.SAR_NAME }} --stack-name "${TEST_STACK_NAME/serverlessrepo-/}" --capabilities CAPABILITY_NAMED_IAM | ||
CHANGE_SET_ID=$(aws cloudformation list-change-sets --stack-name "$TEST_STACK_NAME" --query 'Summaries[*].ChangeSetId' --output text) | ||
aws cloudformation wait change-set-create-complete --change-set-name "$CHANGE_SET_ID" | ||
aws cloudformation execute-change-set --change-set-name "$CHANGE_SET_ID" | ||
aws cloudformation wait stack-create-complete --stack-name "$TEST_STACK_NAME" | ||
echo "Waiting until stack deployment completes..." | ||
|
||
echo "Exit with error if stack is not in CREATE_COMPLETE" | ||
stack_exists=$(aws cloudformation list-stacks --query "StackSummaries[?(StackName == '$TEST_STACK_NAME' && StackStatus == 'CREATE_COMPLETE')].{StackId:StackId, StackName:StackName, CreationTime:CreationTime, StackStatus:StackStatus}") | ||
if [[ -z "$stack_exists" ]] ; then | ||
echo "Could find successful deployment, exit error..." | ||
exit 1 | ||
fi | ||
echo "Deployment successful" | ||
- name: Publish SAR | ||
if: ${{ inputs.stage == 'PROD' }} | ||
run: | | ||
# wait until SAR registers the app, otherwise it fails to make it public | ||
sleep 15 | ||
heitorlessa marked this conversation as resolved.
Show resolved
Hide resolved
|
||
echo "Make SAR app public" | ||
aws serverlessrepo put-application-policy --application-id arn:aws:serverlessrepo:${{ env.AWS_REGION }}:${{ steps.aws-credentials-sar-role.outputs.aws-account-id }}:applications/${{ env.SAR_NAME }} --statements Principals='*',Actions=Deploy |
This file contains hidden or 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
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.