diff --git a/.github/workflows/dangermattic.yml b/.github/workflows/dangermattic.yml index 014bc6dead3..096ada69da3 100644 --- a/.github/workflows/dangermattic.yml +++ b/.github/workflows/dangermattic.yml @@ -15,15 +15,15 @@ jobs: PIPELINE_SLUG="woocommerce-android" RETRY_STEP_KEY="danger" BUILDKITE_API_ACCESS_TOKEN="${{ secrets.TRIGGER_BK_BUILD_TOKEN }}" - LATEST_COMMIT_SHA="${{ github.sha }}" + LATEST_COMMIT_SHA="${{ github.event.pull_request.head.sha || github.sha }}" + # Performs a Buildkite request using a http method ($1) and an api path ($2) perform_buildkite_request() { local METHOD=$1 local BUILDKITE_API_PATH=$2 local BUILDKITE_API_URL="https://api.buildkite.com/v2/organizations/${ORG_SLUG}/pipelines/${PIPELINE_SLUG}/$BUILDKITE_API_PATH" - local CODE=0 local RAW_RESPONSE=$( curl \ --fail-with-body \ @@ -32,17 +32,17 @@ jobs: -X "$METHOD" \ -H "Authorization: Bearer ${BUILDKITE_API_ACCESS_TOKEN}" \ "$BUILDKITE_API_URL" - ) || CODE=$? + ) echo "$RAW_RESPONSE" | tr -d '\n' | jq -R -r } - # get the build(s) associated with the latest commit + # Gets the build(s) associated with the latest commit get_buildkite_build() { perform_buildkite_request "GET" "builds?commit=${LATEST_COMMIT_SHA}" } - # given the build id ($1) and job id ($2), retry the given job + # Given a build id ($1) and a job id ($2), retry the given job retry_buildkite_job() { local BUILD_ID=$1 local JOB_ID=$2 @@ -50,23 +50,47 @@ jobs: perform_buildkite_request "PUT" "builds/$BUILD_ID/jobs/$JOB_ID/retry" } - BUILDKITE_BUILD_RESPONSE=$(get_buildkite_build) + # Validates a Buildkite response ($1) + check_buildkite_error() { + local RESPONSE=$1 - LATEST_BUILD=$(echo "$BUILDKITE_BUILD_RESPONSE" | jq -r '.[0]') + # Check if the response is empty + if [ -z "$RESPONSE" ] || [ "$(echo "$RESPONSE" | jq 'length')" -eq 0 ]; then + echo "❌ Buildkite API call returned an empty response." + exit 1 + fi + + # Check if the response contains an error message + RESPONSE_ERROR=$(echo "$RESPONSE" | jq .message 2>/dev/null || true) + # if [[ -n "$RESPONSE_ERROR" ]]; then + if [[ -n "$RESPONSE_ERROR" && "$RESPONSE_ERROR" != 'null' ]]; then + echo "❌ Buildkite API call failed: $RESPONSE_ERROR" + exit 1 + fi + } + + BUILDKITE_GET_BUILD_RESPONSE=$(get_buildkite_build) + check_buildkite_error "$BUILDKITE_GET_BUILD_RESPONSE" + + LATEST_BUILD=$(echo "$BUILDKITE_GET_BUILD_RESPONSE" | jq -r '.[0]') LATEST_BUILD_NUMBER=$(echo "$LATEST_BUILD" | jq -r '.number') DANGER_JOB=$(echo "$LATEST_BUILD" | jq -r --arg step_key "$RETRY_STEP_KEY" '.jobs[] | select(.step_key == $step_key)') DANGER_JOB_ID=$(echo "$DANGER_JOB" | jq -r '.id') DANGER_JOB_STATE=$(echo "$DANGER_JOB" | jq -r '.state') - echo "Build Number: $LATEST_BUILD_NUMBER" - echo "Job ID for step '$RETRY_STEP_KEY': $DANGER_JOB_ID" - echo "Job state for step '$RETRY_STEP_KEY': $DANGER_JOB_STATE" + echo "ℹ️ Build Number: $LATEST_BUILD_NUMBER" + echo "ℹ️ Job ID for step '$RETRY_STEP_KEY': $DANGER_JOB_ID" + echo "ℹ️ Job state for step '$RETRY_STEP_KEY': $DANGER_JOB_STATE" # all states: running, scheduled, passed, failing, failed, blocked, canceled, canceling, skipped, not_run, finished allowed_job_states=("passed" "failed" "canceled" "finished") if [[ " ${allowed_job_states[@]} " =~ " $DANGER_JOB_STATE " ]]; then - echo $(retry_buildkite_job "$LATEST_BUILD_NUMBER" "$DANGER_JOB_ID") + BUILDKITE_RETRY_JOB_RESPONSE=$(retry_buildkite_job "$LATEST_BUILD_NUMBER" "$DANGER_JOB_ID") + check_buildkite_error "$BUILDKITE_RETRY_JOB_RESPONSE" + + JOB_WEB_URL=$(echo "$BUILDKITE_RETRY_JOB_RESPONSE" | jq -r '.web_url') + echo "✅ Job succesfully retried: $JOB_WEB_URL" else - echo "Cannot retry job in state '$DANGER_JOB_STATE'" + echo "❌ Cannot retry job in state '$DANGER_JOB_STATE'" fi