Skip to content

fix: import cjs keytar module correctly #800

fix: import cjs keytar module correctly

fix: import cjs keytar module correctly #800

name: Rollback Deployment
on:
push:
branches:
- main
jobs:
check-commit-message:
runs-on: ubuntu-latest
outputs:
should_rollback: ${{ steps.check.outputs.should_rollback }}
rollback_steps: ${{ steps.check.outputs.rollback_steps }}
steps:
- name: Checkout code
uses: actions/checkout@v3
with:
fetch-depth: 2
- name: Check commit message
id: check
run: |
COMMIT_MSG=$(git log -1 --pretty=%B)
# Check if commit message matches "rollback X" pattern
if [[ "$COMMIT_MSG" =~ ^rollback[[:space:]]+([0-9]+)$ ]]; then
STEPS="${BASH_REMATCH[1]}"
echo "should_rollback=true" >> $GITHUB_OUTPUT
echo "rollback_steps=$STEPS" >> $GITHUB_OUTPUT
echo "Will rollback $STEPS deployments"
else
echo "should_rollback=false" >> $GITHUB_OUTPUT
echo "rollback_steps=0" >> $GITHUB_OUTPUT
fi
echo "Commit message: $COMMIT_MSG"
echo "Should rollback: ${{ steps.check.outputs.should_rollback }}"
echo "Rollback steps: ${{ steps.check.outputs.rollback_steps }}"
rollback:
needs: check-commit-message
if: needs.check-commit-message.outputs.should_rollback == 'true' && needs.check-commit-message.outputs.rollback_steps != '0'
runs-on: ubuntu-latest
strategy:
matrix:
include:
- app: web
codedeploy_app: LatitudeLLMCodeDeployApp
codedeploy_group: LatitudeLLMDeploymentGroup
- app: gateway
codedeploy_app: LatitudeLLMCodeDeployGateway
codedeploy_group: LatitudeLLMGatewayDeploymentGroup
- app: workers
codedeploy_app: LatitudeLLMWorkersCodeDeployApp
codedeploy_group: LatitudeLLMWorkersDeploymentGroup
concurrency:
group: rollback-${{ matrix.app }}
cancel-in-progress: false
steps:
- name: Configure AWS Credentials
uses: aws-actions/configure-aws-credentials@v4.0.2
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
role-to-assume: ${{ secrets.ARN_OF_IAM_ROLE_TO_ASSUME }}
role-session-name: ${{ matrix.app }}Rollback
aws-region: ${{ vars.AWS_REGION }}
role-skip-session-tagging: true
- name: Get target deployment for rollback
id: get-deployment
run: |
# Get the rollback steps from the previous job
ROLLBACK_STEPS=${{ needs.check-commit-message.outputs.rollback_steps }}
echo "Rolling back $ROLLBACK_STEPS deployments for ${{ matrix.app }}"
# Get list of successful deployments
DEPLOYMENTS=$(aws deploy list-deployments \
--application-name ${{ matrix.codedeploy_app }} \
--deployment-group-name ${{ matrix.codedeploy_group }} \
--include-only-statuses "Succeeded" \
--query "deployments" \
--output json)
# Convert to array and get the target deployment
DEPLOYMENTS_ARRAY=$(echo $DEPLOYMENTS | jq -c '.')
DEPLOYMENT_COUNT=$(echo $DEPLOYMENTS_ARRAY | jq 'length')
echo "Found $DEPLOYMENT_COUNT successful deployments"
if [ $DEPLOYMENT_COUNT -eq 0 ]; then
echo "No successful deployments found for ${{ matrix.app }}. Rollback cannot proceed."
exit 1
fi
# Check if we have enough deployments to roll back the requested number of steps
if [ $DEPLOYMENT_COUNT -le $ROLLBACK_STEPS ]; then
echo "Error: Cannot roll back $ROLLBACK_STEPS steps as only $DEPLOYMENT_COUNT deployments exist."
exit 1
else
TARGET_INDEX=$ROLLBACK_STEPS
fi
# Get the target deployment ID
DEPLOYMENT_ID=$(echo $DEPLOYMENTS_ARRAY | jq -r ".[$TARGET_INDEX]")
echo "Target deployment ID: $DEPLOYMENT_ID (deployment $TARGET_INDEX out of $DEPLOYMENT_COUNT)"
if [ -z "$DEPLOYMENT_ID" ] || [ "$DEPLOYMENT_ID" == "null" ]; then
echo "Failed to get target deployment ID. Rollback cannot proceed."
exit 1
fi
echo "DEPLOYMENT_ID=$DEPLOYMENT_ID" >> $GITHUB_ENV
# Get the deployment info to extract the revision details
DEPLOYMENT_INFO=$(aws deploy get-deployment \
--deployment-id $DEPLOYMENT_ID)
# Extract the revision type and details
REVISION_TYPE=$(echo "$DEPLOYMENT_INFO" | jq -r '.deploymentInfo.revision.revisionType')
echo "Revision type: $REVISION_TYPE"
# Store the entire revision JSON for reuse in a file to avoid escaping issues
REVISION_JSON=$(echo "$DEPLOYMENT_INFO" | jq -c '.deploymentInfo.revision')
echo "$REVISION_JSON" > revision.json
echo "Saved revision details to revision.json"
- name: Rollback to target deployment
run: |
echo "Rolling back ${{ matrix.app }} to deployment ${{ env.DEPLOYMENT_ID }}"
echo "Using revision from file: revision.json"
# Create a rollback deployment using the same revision as the target deployment
ROLLBACK_ID=$(aws deploy create-deployment \
--application-name ${{ matrix.codedeploy_app }} \
--deployment-group-name ${{ matrix.codedeploy_group }} \
--deployment-config-name CodeDeployDefault.ECSAllAtOnce \
--description "Rollback to deployment ${{ env.DEPLOYMENT_ID }} triggered by GitHub Action" \
--revision file://revision.json \
--query 'deploymentId' \
--output text)
echo "Rollback deployment ID: $ROLLBACK_ID"
# Monitor deployment status
echo "Waiting for rollback to complete..."
DEPLOYMENT_STATUS="InProgress"
START_TIME=$(date +%s)
TIMEOUT_SECONDS=$((12 * 60)) # 12 minutes in seconds
while [ "$DEPLOYMENT_STATUS" == "InProgress" ] || [ "$DEPLOYMENT_STATUS" == "Created" ] || [ "$DEPLOYMENT_STATUS" == "Queued" ] || [ "$DEPLOYMENT_STATUS" == "Ready" ]; do
CURRENT_TIME=$(date +%s)
ELAPSED_TIME=$((CURRENT_TIME - START_TIME))
# Check if we've exceeded the timeout
if [ $ELAPSED_TIME -gt $TIMEOUT_SECONDS ]; then
echo "Deployment monitoring timed out after 12 minutes for ${{ matrix.app }}!"
echo "The deployment may still be in progress, but we're no longer waiting."
echo "Last known status: $DEPLOYMENT_STATUS"
echo "Deployment ID: $ROLLBACK_ID"
exit 1
fi
# Calculate and display remaining time
REMAINING_SECONDS=$((TIMEOUT_SECONDS - ELAPSED_TIME))
REMAINING_MINUTES=$((REMAINING_SECONDS / 60))
REMAINING_SECONDS=$((REMAINING_SECONDS % 60))
echo "Checking deployment status... (Timeout in ${REMAINING_MINUTES}m ${REMAINING_SECONDS}s)"
DEPLOYMENT_STATUS=$(aws deploy get-deployment --deployment-id $ROLLBACK_ID --query "deploymentInfo.status" --output text)
echo "Current status: $DEPLOYMENT_STATUS"
if [ "$DEPLOYMENT_STATUS" == "Succeeded" ]; then
echo "Rollback completed successfully for ${{ matrix.app }} after ${ELAPSED_TIME} seconds!"
break
elif [ "$DEPLOYMENT_STATUS" == "Failed" ] || [ "$DEPLOYMENT_STATUS" == "Stopped" ]; then
echo "Rollback failed for ${{ matrix.app }} with status: $DEPLOYMENT_STATUS"
exit 1
fi
sleep 30
done