Skip to content

Commit 465b4a4

Browse files
committed
Refresh Existing Promotion Releases
1 parent 28b2383 commit 465b4a4

1 file changed

Lines changed: 64 additions & 13 deletions

File tree

.github/workflows/promote-nsc-channel.yml

Lines changed: 64 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,8 @@ jobs:
119119

120120
- name: Publish release to manifest backend
121121
env:
122-
GH_TOKEN: ${{ secrets.CR_PAT }}
122+
CR_PAT: ${{ secrets.CR_PAT }}
123+
READ_PAT: ${{ secrets.READ_PAT }}
123124
RELEASE_TAG: ${{ steps.source-run.outputs.release_tag }}
124125
SOURCE_SHA: ${{ steps.source-run.outputs.source_sha }}
125126
SOURCE_BRANCH: ${{ steps.source-run.outputs.source_branch }}
@@ -136,6 +137,19 @@ jobs:
136137
137138
source_repo_url="https://github.com/${SOURCE_REPO}"
138139
source_commit_url="${source_repo_url}/commit/${SOURCE_SHA}"
140+
updated_at="$(date -u +'%Y-%m-%dT%H:%M:%SZ')"
141+
release_token_candidates=()
142+
if [[ -n "${CR_PAT}" ]]; then
143+
release_token_candidates+=("${CR_PAT}")
144+
fi
145+
if [[ -n "${READ_PAT}" && "${READ_PAT}" != "${CR_PAT}" ]]; then
146+
release_token_candidates+=("${READ_PAT}")
147+
fi
148+
if [[ "${#release_token_candidates[@]}" -eq 0 ]]; then
149+
echo "No token is available for manifest backend release operations." >&2
150+
exit 1
151+
fi
152+
139153
notes_file="${RUNNER_TEMP}/nsc-release-notes.md"
140154
cat > "${notes_file}" <<EOF
141155
Promoted NSC payload from [\`${SOURCE_REPO}\`](${source_repo_url}).
@@ -144,18 +158,40 @@ jobs:
144158
- source branch: \`${SOURCE_BRANCH}\`
145159
- source event: \`${SOURCE_EVENT}\`
146160
- source run: [\`${RUN_ID}\`](${RUN_URL})
161+
162+
Updated at \`${updated_at}\`.
147163
EOF
148164
149165
release_exists=false
150-
if gh release view "${RELEASE_TAG}" --repo "${ASSET_REPO}" >/dev/null 2>&1; then
151-
release_exists=true
152-
fi
166+
release_id=""
167+
release_token="${release_token_candidates[0]}"
168+
for candidate in "${release_token_candidates[@]}"; do
169+
if release_json="$(GH_TOKEN="${candidate}" gh api "repos/${ASSET_REPO}/releases/tags/${RELEASE_TAG}" 2>/dev/null)"; then
170+
release_exists=true
171+
release_id="$(jq -r '.id' <<<"${release_json}")"
172+
release_token="${candidate}"
173+
break
174+
fi
175+
done
176+
export GH_TOKEN="${release_token}"
153177
154178
if [[ "${release_exists}" == "false" ]]; then
155-
gh release create "${RELEASE_TAG}" \
156-
--repo "${ASSET_REPO}" \
157-
--title "${RELEASE_TAG}" \
158-
--notes-file "${notes_file}"
179+
release_created=false
180+
for candidate in "${release_token_candidates[@]}"; do
181+
if GH_TOKEN="${candidate}" gh release create "${RELEASE_TAG}" \
182+
--repo "${ASSET_REPO}" \
183+
--title "${RELEASE_TAG}" \
184+
--notes-file "${notes_file}"; then
185+
release_token="${candidate}"
186+
export GH_TOKEN="${release_token}"
187+
release_created=true
188+
break
189+
fi
190+
done
191+
if [[ "${release_created}" != "true" ]]; then
192+
echo "Failed to create release ${RELEASE_TAG} in ${ASSET_REPO}." >&2
193+
exit 1
194+
fi
159195
160196
mapfile -d '' payload_assets < <(find "${RUNNER_TEMP}/nsc-payload" -maxdepth 1 -type f -print0)
161197
if [[ "${#payload_assets[@]}" -eq 0 ]]; then
@@ -167,11 +203,26 @@ jobs:
167203
gh release upload "${RELEASE_TAG}" "${payload_assets[@]}" --repo "${ASSET_REPO}"
168204
else
169205
echo "Release ${RELEASE_TAG} already exists in ${ASSET_REPO}. Reusing immutable release."
170-
if ! gh release edit "${RELEASE_TAG}" \
171-
--repo "${ASSET_REPO}" \
172-
--title "${RELEASE_TAG}" \
173-
--notes-file "${notes_file}"; then
174-
echo "Skipping release note refresh for existing ${RELEASE_TAG}." >&2
206+
patch_file="${RUNNER_TEMP}/nsc-release-patch.json"
207+
jq -n \
208+
--arg name "${RELEASE_TAG}" \
209+
--rawfile body "${notes_file}" \
210+
'{name:$name, body:$body}' > "${patch_file}"
211+
release_refreshed=false
212+
for candidate in "${release_token_candidates[@]}"; do
213+
if GH_TOKEN="${candidate}" gh api \
214+
--method PATCH \
215+
"repos/${ASSET_REPO}/releases/${release_id}" \
216+
--input "${patch_file}" >/dev/null 2>&1; then
217+
release_token="${candidate}"
218+
export GH_TOKEN="${release_token}"
219+
release_refreshed=true
220+
break
221+
fi
222+
done
223+
if [[ "${release_refreshed}" != "true" ]]; then
224+
echo "Failed to refresh notes for existing ${RELEASE_TAG}. Provide a token with release edit permissions." >&2
225+
exit 1
175226
fi
176227
fi
177228

0 commit comments

Comments
 (0)