fix: import cjs keytar module correctly #800
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
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 |