Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
130 changes: 129 additions & 1 deletion .github/workflows/remote-docs-preview.yml
Original file line number Diff line number Diff line change
Expand Up @@ -166,6 +166,131 @@ jobs:
VERCEL_PROJECT_ID: ${{ secrets.VERCEL_PROJECT_ID }}
VERCEL_TOKEN: ${{ secrets.VERCEL_TOKEN }}
run: |
deployment_id=""
deployment_finished=false

cancel_vercel_deployment() {
local deployment_id_to_cancel="$1"
local deployment_label="$2"
local cancel_response
local cancel_exit_code
local deployment_response
local ready_state

if cancel_response="$(
curl --silent --show-error --fail-with-body \
--request PATCH \
--header "Authorization: Bearer $VERCEL_TOKEN" \
"https://api.vercel.com/v12/deployments/$deployment_id_to_cancel/cancel?teamId=$VERCEL_ORG_ID"
)"; then
echo "Canceled $deployment_label Vercel deployment $deployment_id_to_cancel."
return 0
else
cancel_exit_code=$?
fi

if deployment_response="$(
curl --silent --show-error --fail-with-body \
--header "Authorization: Bearer $VERCEL_TOKEN" \
"https://api.vercel.com/v13/deployments/$deployment_id_to_cancel?teamId=$VERCEL_ORG_ID"
)"; then
ready_state="$(jq -er .readyState <<< "$deployment_response")"
case "$ready_state" in
READY|ERROR|CANCELED|DELETED|BLOCKED)
echo "$deployment_label Vercel deployment $deployment_id_to_cancel already reached $ready_state."
return 0
;;
esac
fi

printf '%s\n' "$cancel_response" >&2
echo "Unable to cancel $deployment_label Vercel deployment $deployment_id_to_cancel." >&2
return "$cancel_exit_code"
}

cancel_superseded_deployments() {
local ready_state
local until=""
local list_response
local next
local superseded_id
local -a request_args
local -a deployment_ids

for ready_state in QUEUED INITIALIZING BUILDING; do
until=""
while true; do
request_args=(
--silent
--show-error
--fail-with-body
--get
--header "Authorization: Bearer $VERCEL_TOKEN"
--data-urlencode "projectId=$VERCEL_PROJECT_ID"
--data-urlencode "state=$ready_state"
--data-urlencode "limit=100"
--data-urlencode "teamId=$VERCEL_ORG_ID"
)
if [[ -n "$until" ]]; then
request_args+=(--data-urlencode "until=$until")
fi

if ! list_response="$(
curl "${request_args[@]}" "https://api.vercel.com/v7/deployments"
)"; then
printf '%s\n' "$list_response" >&2
echo "Unable to list source-preview Vercel deployments." >&2
return 1
fi

mapfile -t deployment_ids < <(
jq -r \
--arg pull_request "$PULL_REQUEST_NUMBER" \
--arg source_repository "$DOCS_REMOTE_REPOSITORY" \
'.deployments[]
| select((.meta.buildScope? // "") == "source-preview")
| select((.meta.sourceRepository? // "") == $source_repository)
| select((.meta.pullRequest? // "") == $pull_request)
| (.uid // .id)' \
<<< "$list_response"
)
for superseded_id in "${deployment_ids[@]}"; do
cancel_vercel_deployment "$superseded_id" "superseded source-preview" || return 1
done

next="$(jq -er '.pagination.next // ""' <<< "$list_response")"
if [[ -z "$next" ]]; then
break
fi
if [[ "$next" == "$until" ]]; then
echo "Vercel returned a repeated pagination cursor while listing source-preview deployments." >&2
return 1
fi
until="$next"
done
done
}

finalize_deployment() {
local exit_code=$?
trap - EXIT INT TERM
if [[ "$deployment_finished" != true && -n "$deployment_id" ]]; then
if ! cancel_vercel_deployment "$deployment_id" "source-preview"; then
echo "::warning::Unable to cancel the interrupted source-preview deployment."
if [[ "$exit_code" -eq 0 ]]; then
exit_code=1
fi
fi
fi
exit "$exit_code"
}

cancel_superseded_deployments

trap finalize_deployment EXIT
trap 'exit 130' INT
trap 'exit 143' TERM

if ! project_response="$(
curl --silent --show-error --fail-with-body \
--header "Authorization: Bearer $VERCEL_TOKEN" \
Expand Down Expand Up @@ -198,7 +323,9 @@ jobs:
sha: $site_sha
},
build: {env: {
DOCS_LOCALE: "en",
DOCS_DEPLOY_TARGET: "english",
DOCS_LOCALES: "none",
DOCS_AVAILABLE_LOCALES: "all",
DOCS_REMOTES: "all",
DOCS_REMOTE_NAME: $remote_name,
DOCS_REMOTE_REPOSITORY: $remote_repository,
Expand Down Expand Up @@ -272,6 +399,7 @@ jobs:
echo "Vercel returned an invalid preview URL." >&2
exit 1
fi
deployment_finished=true

- name: Add the preview link to the pull request
if: github.repository == inputs.source_repository
Expand Down
Loading