-
Notifications
You must be signed in to change notification settings - Fork 383
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
Improvements to deployments #615
Changes from 52 commits
ee08d3a
c790151
8355030
f19d79f
e487791
25e9502
de55983
5240c9b
2a1b9a3
8918cd2
fe262cb
80d841b
084f0d0
cac41c4
745ca0e
f77a610
87662fa
4970fbe
e26cc72
29ade6f
8db0511
b7a7229
1cff976
6cbdb04
0b15816
ae8a473
e6d5025
444ec85
8041a01
b03b6d7
a12e0d4
98649f2
b2e710a
c54a544
c80ff43
40473cc
038cf8f
c25211f
304e642
4744c76
5c8b3ab
2a51c92
61213b9
e431bdf
895986c
3fe506e
585c02d
c46f595
65c64d1
e96ac82
2be9c2f
5f50639
e0cf883
b27783e
66a4114
3426aca
92ad3a7
7d75738
d5b8b7f
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,6 @@ | ||
# Internal Notes to the Shakacode Team | ||
|
||
## Links | ||
|
||
- [Control Plane Org for Staging and Review Apps](https://console.cpln.io/console/org/shakacode-open-source-examples-staging/-info) | ||
- [Control Plane Org for Deployed App](https://console.cpln.io/console/org/shakacode-open-source-examples/-info) |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,32 @@ | ||
name: Build Docker Image | ||
description: 'Builds a Docker image for the application' | ||
|
||
inputs: | ||
app_name: | ||
description: 'Name of the application' | ||
required: true | ||
org: | ||
description: 'Organization name' | ||
required: true | ||
commit: | ||
description: 'Commit SHA to tag the image with' | ||
required: true | ||
PR_NUMBER: | ||
description: 'PR number' | ||
required: true | ||
|
||
runs: | ||
using: "composite" | ||
steps: | ||
- name: Build Docker Image | ||
id: build | ||
shell: bash | ||
run: | | ||
echo "🏗️ Building Docker image for PR #$PR_NUMBER (commit ${{ inputs.commit }})..." | ||
|
||
if cpflow build-image -a ${{ inputs.app_name }} --commit=${{ inputs.commit }} --org=${{ inputs.org }}; then | ||
echo "✅ Docker image build successful for PR #$PR_NUMBER (commit ${{ inputs.commit }})" | ||
else | ||
echo "❌ Docker image build failed for PR #$PR_NUMBER (commit ${{ inputs.commit }})" | ||
exit 1 | ||
fi |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,20 @@ | ||
name: Delete Control Plane App | ||
description: 'Deletes a Control Plane application and all its resources' | ||
|
||
inputs: | ||
app_name: | ||
description: 'Name of the application to delete' | ||
required: true | ||
org: | ||
description: 'Organization name' | ||
required: true | ||
|
||
runs: | ||
using: "composite" | ||
steps: | ||
- name: Delete Application | ||
shell: bash | ||
run: ${{ github.action_path }}/../deploy-to-control-plane/scripts/delete-app.sh | ||
env: | ||
APP_NAME: ${{ inputs.app_name }} | ||
CPLN_ORG: ${{ inputs.org }} |
Original file line number | Diff line number | Diff line change | ||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -1,56 +1,82 @@ | ||||||||||||||||||||
# Control Plane GitHub Action | ||||||||||||||||||||
|
||||||||||||||||||||
name: Deploy-To-Control-Plane | ||||||||||||||||||||
description: 'Deploys both to staging and to review apps' | ||||||||||||||||||||
name: Deploy to Control Plane | ||||||||||||||||||||
description: 'Deploys an application to Control Plane' | ||||||||||||||||||||
|
||||||||||||||||||||
inputs: | ||||||||||||||||||||
app_name: | ||||||||||||||||||||
description: 'The name of the app to deploy' | ||||||||||||||||||||
description: 'Name of the application' | ||||||||||||||||||||
required: true | ||||||||||||||||||||
default: | ||||||||||||||||||||
org: | ||||||||||||||||||||
description: 'The org of the app to deploy' | ||||||||||||||||||||
description: 'Organization name' | ||||||||||||||||||||
required: true | ||||||||||||||||||||
default: | ||||||||||||||||||||
github_token: | ||||||||||||||||||||
description: 'GitHub token' | ||||||||||||||||||||
required: true | ||||||||||||||||||||
wait_timeout: | ||||||||||||||||||||
description: 'Timeout in seconds for waiting for workloads to be ready' | ||||||||||||||||||||
required: false | ||||||||||||||||||||
default: 600 | ||||||||||||||||||||
|
||||||||||||||||||||
outputs: | ||||||||||||||||||||
rails_url: | ||||||||||||||||||||
description: 'URL of the deployed Rails application' | ||||||||||||||||||||
value: ${{ steps.deploy.outputs.rails_url }} | ||||||||||||||||||||
|
||||||||||||||||||||
runs: | ||||||||||||||||||||
using: 'composite' | ||||||||||||||||||||
using: "composite" | ||||||||||||||||||||
steps: | ||||||||||||||||||||
- name: Setup Environment | ||||||||||||||||||||
uses: ./.github/actions/setup-environment | ||||||||||||||||||||
|
||||||||||||||||||||
- name: Set Short SHA | ||||||||||||||||||||
id: vars | ||||||||||||||||||||
- name: Get Commit SHA | ||||||||||||||||||||
id: get_sha | ||||||||||||||||||||
shell: bash | ||||||||||||||||||||
run: echo "::set-output name=sha_short::$(git rev-parse --short HEAD)" | ||||||||||||||||||||
|
||||||||||||||||||||
# Caching step | ||||||||||||||||||||
- uses: actions/cache@v2 | ||||||||||||||||||||
with: | ||||||||||||||||||||
path: /tmp/.docker-cache | ||||||||||||||||||||
key: ${{ runner.os }}-docker-${{ hashFiles('**/Dockerfile', '**/package.json', '**/yarn.lock') }}-${{ github.sha }} | ||||||||||||||||||||
restore-keys: | | ||||||||||||||||||||
${{ runner.os }}-docker-${{ hashFiles('**/Dockerfile', '**/package.json', '**/yarn.lock') }} | ||||||||||||||||||||
${{ runner.os }}-docker- | ||||||||||||||||||||
run: ${{ github.action_path }}/scripts/get-commit-sha.sh | ||||||||||||||||||||
env: | ||||||||||||||||||||
GITHUB_TOKEN: ${{ inputs.github_token }} | ||||||||||||||||||||
PR_NUMBER: ${{ env.PR_NUMBER }} | ||||||||||||||||||||
|
||||||||||||||||||||
- name: cpflow setup-app | ||||||||||||||||||||
shell: bash | ||||||||||||||||||||
run: | | ||||||||||||||||||||
if ! cpflow exists -a ${{ inputs.app_name }} ; then | ||||||||||||||||||||
cpflow setup-app -a ${{ inputs.app_name }} | ||||||||||||||||||||
fi | ||||||||||||||||||||
# Provision all infrastructure on Control Plane. | ||||||||||||||||||||
# app react-webpack-rails-tutorial will be created per definition in .controlplane/controlplane.yml | ||||||||||||||||||||
- name: cpflow build-image | ||||||||||||||||||||
shell: bash | ||||||||||||||||||||
run: | | ||||||||||||||||||||
cpln image docker-login | ||||||||||||||||||||
# Use BUILDKIT_PROGRESS=plain to get more verbose logging of the build | ||||||||||||||||||||
# BUILDKIT_PROGRESS=plain cpflow build-image -a ${{ inputs.app_name }} --commit ${{steps.vars.outputs.sha_short}} --org ${{inputs.org}} | ||||||||||||||||||||
cpflow build-image -a ${{ inputs.app_name }} --commit ${{steps.vars.outputs.sha_short}} --org ${{inputs.org}} | ||||||||||||||||||||
# --cache /tmp/.docker-cache | ||||||||||||||||||||
- name: Deploy to Control Plane | ||||||||||||||||||||
id: deploy | ||||||||||||||||||||
shell: bash | ||||||||||||||||||||
run: | | ||||||||||||||||||||
echo "Deploying to Control Plane" | ||||||||||||||||||||
cpflow deploy-image -a ${{ inputs.app_name }} --run-release-phase --org ${{inputs.org}} --verbose | ||||||||||||||||||||
echo "🚀 Deploying app for PR #${PR_NUMBER}..." | ||||||||||||||||||||
|
||||||||||||||||||||
# Deploy the application and capture the Rails URL | ||||||||||||||||||||
if ! DEPLOY_OUTPUT=$(cpflow deploy-image -a "${{ inputs.app_name }}" --run-release-phase --org "${{ inputs.org }}" 2>&1); then | ||||||||||||||||||||
echo "❌ Deployment failed for PR #${PR_NUMBER}" | ||||||||||||||||||||
echo "Error output:" | ||||||||||||||||||||
echo "${DEPLOY_OUTPUT}" | ||||||||||||||||||||
exit 1 | ||||||||||||||||||||
fi | ||||||||||||||||||||
|
||||||||||||||||||||
# Extract Rails URL from deployment output | ||||||||||||||||||||
RAILS_URL=$(echo "${DEPLOY_OUTPUT}" | grep -oP 'https://rails-[^[:space:]]*\.cpln\.app(?=\s|$)' | head -n1) | ||||||||||||||||||||
if [ -z "${RAILS_URL}" ]; then | ||||||||||||||||||||
echo "❌ Failed to get Rails URL from deployment output" | ||||||||||||||||||||
echo "Deployment output:" | ||||||||||||||||||||
echo "${DEPLOY_OUTPUT}" | ||||||||||||||||||||
exit 1 | ||||||||||||||||||||
fi | ||||||||||||||||||||
|
||||||||||||||||||||
# Wait for all workloads to be ready | ||||||||||||||||||||
WAIT_TIMEOUT=${WAIT_TIMEOUT:-${{ inputs.wait_timeout }}} | ||||||||||||||||||||
echo "⏳ Waiting for all workloads to be ready (timeout: ${WAIT_TIMEOUT}s)..." | ||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🛠️ Refactor suggestion Add timeout validation and remove trailing spaces. The timeout value should be validated and trailing spaces should be removed. Apply this diff to add validation and remove trailing spaces: -WAIT_TIMEOUT=${WAIT_TIMEOUT:-${{ inputs.wait_timeout }}}
-echo "⏳ Waiting for all workloads to be ready (timeout: ${WAIT_TIMEOUT}s)..."
+# Validate timeout value
+WAIT_TIMEOUT=${WAIT_TIMEOUT:-${{ inputs.wait_timeout }}}
+if ! [[ "${WAIT_TIMEOUT}" =~ ^[0-9]+$ ]]; then
+ echo "❌ Invalid timeout value: ${WAIT_TIMEOUT}"
+ exit 1
+fi
+echo "⏳ Waiting for all workloads to be ready (timeout: ${WAIT_TIMEOUT}s)" 📝 Committable suggestion
Suggested change
|
||||||||||||||||||||
|
||||||||||||||||||||
# Use timeout command with ps:wait | ||||||||||||||||||||
if ! timeout "${WAIT_TIMEOUT}" bash -c "cpflow ps:wait -a \"${{ inputs.app_name }}\"" 2>&1; then | ||||||||||||||||||||
TIMEOUT_EXIT=$? | ||||||||||||||||||||
if [ ${TIMEOUT_EXIT} -eq 124 ]; then | ||||||||||||||||||||
echo "❌ Timed out waiting for workloads after ${WAIT_TIMEOUT} seconds" | ||||||||||||||||||||
else | ||||||||||||||||||||
echo "❌ Workloads did not become ready for PR #${PR_NUMBER} (exit code: ${TIMEOUT_EXIT})" | ||||||||||||||||||||
fi | ||||||||||||||||||||
echo "Last deployment output:" | ||||||||||||||||||||
echo "${DEPLOY_OUTPUT}" | ||||||||||||||||||||
exit 1 | ||||||||||||||||||||
fi | ||||||||||||||||||||
|
||||||||||||||||||||
echo "✅ Deployment successful for PR #${PR_NUMBER}" | ||||||||||||||||||||
echo "🌐 Rails URL: ${RAILS_URL}" | ||||||||||||||||||||
echo "rails_url=${RAILS_URL}" >> $GITHUB_OUTPUT |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,36 @@ | ||
#!/bin/bash | ||
|
||
# Script to delete a Control Plane application | ||
# Required environment variables: | ||
# - APP_NAME: Name of the application to delete | ||
# - CPLN_ORG: Organization name | ||
|
||
set -e | ||
|
||
# Validate required environment variables | ||
: "${APP_NAME:?APP_NAME environment variable is required}" | ||
: "${CPLN_ORG:?CPLN_ORG environment variable is required}" | ||
|
||
# Safety check: prevent deletion of production or staging apps | ||
if echo "$APP_NAME" | grep -iqE '(production|staging)'; then | ||
echo "❌ ERROR: Cannot delete apps containing 'production' or 'staging' in their name" >&2 | ||
echo "🛑 This is a safety measure to prevent accidental deletion of production or staging environments" >&2 | ||
echo " App name: $APP_NAME" >&2 | ||
exit 1 | ||
fi | ||
|
||
# Check if app exists before attempting to delete | ||
echo "🔍 Checking if application exists: $APP_NAME" | ||
if ! cpflow exists -a "$APP_NAME"; then | ||
echo "⚠️ Application does not exist: $APP_NAME" | ||
exit 0 | ||
fi | ||
|
||
# Delete the application | ||
echo "🗑️ Deleting application: $APP_NAME" | ||
if ! cpflow delete -a "$APP_NAME" --force; then | ||
echo "❌ Failed to delete application: $APP_NAME" >&2 | ||
exit 1 | ||
fi | ||
|
||
echo "✅ Successfully deleted application: $APP_NAME" |
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -0,0 +1,43 @@ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
#!/bin/bash | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
# This script handles the deployment to Control Plane and extracts the Rails URL | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
# | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
# Required environment variables: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
# - APP_NAME: Name of the application to deploy | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
# - CPLN_ORG: Control Plane organization | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
# | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
# Outputs: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
# - rails_url: URL of the deployed Rails application | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Add validation for required environment variables. The script should validate that required environment variables are set before proceeding. Add environment variable validation: set -e
+
+# Validate required environment variables
+: "${APP_NAME:?APP_NAME environment variable is required}"
+: "${CPLN_ORG:?CPLN_ORG environment variable is required}"
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
set -e | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
# Validate required environment variables | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
: "${APP_NAME:?APP_NAME environment variable is required}" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
: "${CPLN_ORG:?CPLN_ORG environment variable is required}" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
# Set deployment timeout (15 minutes) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
TIMEOUT=900 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
TEMP_OUTPUT=$(mktemp) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
trap 'rm -f "$TEMP_OUTPUT"' EXIT | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
# Deploy the application | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
echo "🚀 Deploying to Control Plane..." | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if timeout "$TIMEOUT" cpflow deploy-image -a "$APP_NAME" --run-release-phase --org "$CPLN_ORG" --verbose | tee "$TEMP_OUTPUT"; then | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
# Extract Rails URL from deployment output | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
RAILS_URL=$(grep -oP 'https://rails-[^[:space:]]*\.cpln\.app(?=\s|$)' "$TEMP_OUTPUT" | head -n1) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if [ -n "$RAILS_URL" ]; then | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
echo "rails_url=$RAILS_URL" >> "$GITHUB_OUTPUT" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
echo "✅ Deployment successful" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
echo "🚀 Rails URL: $RAILS_URL" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
else | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
echo "❌ Failed to extract Rails URL from deployment output" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
exit 1 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
fi | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
elif [ $? -eq 124 ]; then | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
echo "❌ Deployment timed out after $TIMEOUT seconds" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
exit 1 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
else | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
echo "❌ Deployment to Control Plane failed" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
exit 1 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
fi | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🛠️ Refactor suggestion Add health check after deployment. The script should verify that the deployed application is healthy and responding correctly. Add a health check after successful deployment: if [ -n "$RAILS_URL" ]; then
echo "rails_url=$RAILS_URL" >> "$GITHUB_OUTPUT"
echo "✅ Deployment successful"
echo "🚀 Rails URL: $RAILS_URL"
+ # Wait for the application to be ready
+ echo "🏥 Checking application health..."
+ MAX_ATTEMPTS=30
+ ATTEMPT=0
+ while [ $ATTEMPT -lt $MAX_ATTEMPTS ]; do
+ if curl -s -f -o /dev/null "$RAILS_URL/health"; then
+ echo "✅ Application is healthy"
+ break
+ fi
+ ATTEMPT=$((ATTEMPT + 1))
+ if [ $ATTEMPT -eq $MAX_ATTEMPTS ]; then
+ echo "❌ Application failed to become healthy"
+ exit 1
+ fi
+ echo "⏳ Waiting for application to become healthy (attempt $ATTEMPT/$MAX_ATTEMPTS)..."
+ sleep 10
+ done
else 📝 Committable suggestion
Suggested change
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,34 @@ | ||
#!/bin/bash | ||
|
||
# This script retrieves the commit SHA for deployment | ||
# It handles both PR and direct branch deployments | ||
# | ||
# Required environment variables: | ||
# - PR_NUMBER: Pull request number (optional) | ||
# - GITHUB_TOKEN: GitHub token for API access | ||
# | ||
# Outputs: | ||
# - sha: Full commit SHA | ||
# - sha_short: Short (7 char) commit SHA | ||
|
||
set -e | ||
|
||
if [ -n "$PR_NUMBER" ]; then | ||
# If PR_NUMBER is set, get the PR's head SHA | ||
if ! PR_SHA=$(gh pr view $PR_NUMBER --json headRefOid --jq '.headRefOid'); then | ||
echo "Failed to get PR head SHA" >&2 | ||
exit 1 | ||
fi | ||
echo "sha=$PR_SHA" >> "$GITHUB_OUTPUT" | ||
echo "sha_short=${PR_SHA:0:7}" >> "$GITHUB_OUTPUT" | ||
echo "Using PR head commit SHA: ${PR_SHA:0:7}" | ||
else | ||
# For direct branch deployments, use the current commit SHA | ||
if ! CURRENT_SHA=$(git rev-parse HEAD); then | ||
echo "Failed to get current SHA" >&2 | ||
exit 1 | ||
fi | ||
echo "sha=$CURRENT_SHA" >> "$GITHUB_OUTPUT" | ||
echo "sha_short=${CURRENT_SHA:0:7}" >> "$GITHUB_OUTPUT" | ||
echo "Using branch commit SHA: ${CURRENT_SHA:0:7}" | ||
fi |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🛠️ Refactor suggestion
Add validation for required secrets.
The workflow should validate that required secrets are available before proceeding.
Add this step after the checkout: