Skip to content

Commit 2e0c4e9

Browse files
committed
ci: verify assets by download+local sha256 instead of GitHub async digest field (kills recurring publish flake)
1 parent c50eb89 commit 2e0c4e9

1 file changed

Lines changed: 14 additions & 10 deletions

File tree

.github/workflows/ci.yml

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -148,21 +148,25 @@ jobs:
148148
| jq -r --arg name "$1" '[.assets[] | select(.name == $name) | .id][0] // empty'
149149
}
150150
151-
wait_for_asset_digest() {
152-
local name="$1" expected="$2" expected_id="${3:-}"
153-
local attempt asset_id digest
151+
# 下载资产回本地做 sha256 比对(不依赖 GitHub 异步计算的 digest 字段,消除时序抖动)
152+
wait_for_asset_bytes() {
153+
local name="$1" expected_hex="$2" expected_id="${3:-}"
154+
local attempt asset_id
154155
for attempt in {1..15}; do
155156
asset_id="$(asset_id_by_name "$name" 2>/dev/null || true)"
156157
if [ -n "$asset_id" ] && { [ -z "$expected_id" ] || [ "$asset_id" = "$expected_id" ]; }; then
157-
digest="$(gh api "repos/$GITHUB_REPOSITORY/releases/assets/$asset_id" --jq '.digest // empty' 2>/dev/null || true)"
158-
if [ "$digest" = "$expected" ]; then
158+
rm -f "$RUNNER_TEMP/asset-check.bin"
159+
gh api -H 'Accept: application/octet-stream' \
160+
"repos/$GITHUB_REPOSITORY/releases/assets/$asset_id" > "$RUNNER_TEMP/asset-check.bin" 2>/dev/null || true
161+
if [ -s "$RUNNER_TEMP/asset-check.bin" ] && \
162+
[ "$(sha256sum "$RUNNER_TEMP/asset-check.bin" | awk '{print $1}')" = "$expected_hex" ]; then
159163
printf '%s\n' "$asset_id"
160164
return 0
161165
fi
162166
fi
163167
sleep 2
164168
done
165-
echo "::error::等待 Release 资产 $name 的摘要就绪超时。" >&2
169+
echo "::error::等待 Release 资产 $name 下载校验超时。" >&2
166170
return 1
167171
}
168172
@@ -235,10 +239,10 @@ jobs:
235239
fi
236240
237241
step gh release upload latest "$staged_zip" --repo "$GITHUB_REPOSITORY"
238-
# GitHub 异步计算资产 digest,上传后留出沉降时间再轮询
242+
# 上传后短暂沉降,降低资产列表/下载端点的可见性延迟
239243
sleep 5
240-
staged_id="$(wait_for_asset_digest "$staged_name" "sha256:$expected_digest")" || {
241-
echo "::error::FAILED AT STEP: wait_for_asset_digest staged"
244+
staged_id="$(wait_for_asset_bytes "$staged_name" "$expected_digest")" || {
245+
echo "::error::FAILED AT STEP: wait_for_asset_bytes staged"
242246
exit 1
243247
}
244248
@@ -275,7 +279,7 @@ jobs:
275279
actual_tag="$(gh api "repos/$GITHUB_REPOSITORY/git/ref/tags/latest" --jq '.object.sha')"
276280
test "$actual_tag" = "$GITHUB_SHA"
277281
278-
asset_id="$(wait_for_asset_digest "$FIXED_NAME" "sha256:$expected_digest" "$staged_id")"
282+
asset_id="$(wait_for_asset_bytes "$FIXED_NAME" "$expected_digest" "$staged_id")"
279283
test "$asset_id" = "$staged_id"
280284
gh api -H 'Accept: application/octet-stream' \
281285
"repos/$GITHUB_REPOSITORY/releases/assets/$asset_id" > "$RUNNER_TEMP/published.zip"

0 commit comments

Comments
 (0)