Skip to content

feat: Implement comprehensive AWS Lambda deployment workflow with ver… #7

feat: Implement comprehensive AWS Lambda deployment workflow with ver…

feat: Implement comprehensive AWS Lambda deployment workflow with ver… #7

Workflow file for this run

name: Deploy to AWS Lambda
on:
push:
branches:
- main
env:
LAMBDA_FUNCTION_NAME: time-warden
ALIAS_NAME: production
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: Setup Node.js
uses: actions/setup-node@v3
with:
node-version: '16'
cache: 'npm'
- name: Install dependencies
run: npm ci
- name: Run Tests
run: npm run test || echo "No tests specified"
- name: Build TypeScript
run: npm run build
- name: Package Lambda
run: |
echo "Creating deployment package..."
cd dist
zip -r ../lambda.zip .
cd ..
zip -r lambda.zip node_modules/
echo "Package size: $(ls -lh lambda.zip | awk '{print $5}')"
- name: Configure AWS Credentials
uses: aws-actions/configure-aws-credentials@v2
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: ${{ secrets.AWS_REGION }}
- name: Get Current Published Version
id: get_current_version
run: |
CURRENT_VERSION=$(aws lambda get-function --function-name ${{ env.LAMBDA_FUNCTION_NAME }} --query 'Configuration.Version' --output text)
echo "CURRENT_VERSION=$CURRENT_VERSION" >> $GITHUB_ENV
echo "Current published version: $CURRENT_VERSION"
- name: Deploy New Code
id: deploy_new_code
run: |
echo "Updating function code..."
aws lambda update-function-code --function-name ${{ env.LAMBDA_FUNCTION_NAME }} --zip-file fileb://lambda.zip
- name: Publish New Version
id: publish_version
run: |
NEW_VERSION=$(aws lambda publish-version --function-name ${{ env.LAMBDA_FUNCTION_NAME }} --query 'Version' --output text)
echo "NEW_VERSION=$NEW_VERSION" >> $GITHUB_ENV
echo "Published new version: $NEW_VERSION"
- name: Update Alias to New Version
id: update_alias
run: |
echo "Updating alias ${{ env.ALIAS_NAME }} to point to version $NEW_VERSION"
aws lambda update-alias --function-name ${{ env.LAMBDA_FUNCTION_NAME }} --name ${{ env.ALIAS_NAME }} --function-version $NEW_VERSION
- name: Verify Deployment
run: |
echo "Waiting for function update to complete..."
sleep 10
FUNCTION_INFO=$(aws lambda get-function --function-name ${{ env.LAMBDA_FUNCTION_NAME }})
FUNCTION_STATE=$(echo $FUNCTION_INFO | jq -r '.Configuration.State')
LAST_UPDATE=$(echo $FUNCTION_INFO | jq -r '.Configuration.LastModified')
CODE_SIZE=$(echo $FUNCTION_INFO | jq -r '.Configuration.CodeSize')
echo "Function State: $FUNCTION_STATE"
echo "Last Updated: $LAST_UPDATE"
echo "Code Size: $CODE_SIZE bytes"
if [ "$FUNCTION_STATE" != "Active" ]; then
echo "Error: Function is not Active"
exit 1
fi
- name: Rollback on Failure
if: failure()
run: |
echo "Deployment failed. Rolling back alias to previous version ${{ env.CURRENT_VERSION }}"
aws lambda update-alias --function-name ${{ env.LAMBDA_FUNCTION_NAME }} --name ${{ env.ALIAS_NAME }} --function-version ${{ env.CURRENT_VERSION }}
ROLLBACK_STATE=$(aws lambda get-function --function-name ${{ env.LAMBDA_FUNCTION_NAME }} --query 'Configuration.State' --output text)
echo "Rollback state: $ROLLBACK_STATE"
if [ "$ROLLBACK_STATE" != "Active" ]; then
echo "Error: Rollback failed, manual intervention required"
exit 1
fi
echo "Rollback completed successfully"