ci: runner 无 curl——产物上传改 node 原生 fetch(FormData multipart),修被 curl 缺失掩盖的假告警
This commit is contained in:
1 parent
d4ce755efa
commit
c9fcf82495
1 file changed
+21
-17
@@ -49,22 +49,26 @@ jobs:
|
|||||||
run: yarn workspace @stack/tutorial build
|
run: yarn workspace @stack/tutorial build
|
||||||
|
|
||||||
- name: 产物上传(滚动 release 资产;权限不足仅告警不红)
|
- name: 产物上传(滚动 release 资产;权限不足仅告警不红)
|
||||||
|
env:
|
||||||
|
TOK: ${{ secrets.CI_TOKEN || github.token }}
|
||||||
run: |
|
run: |
|
||||||
TOK="${{ secrets.CI_TOKEN || github.token }}"
|
|
||||||
J() { node -e "let d='';process.stdin.on('data',c=>d+=c).on('end',()=>{try{const o=JSON.parse(d);console.log(eval('o.'+process.argv[1])??'')}catch(e){console.log('')}})" "$1"; }
|
|
||||||
tar -czf /tmp/tutorial-dist.tar.gz -C apps/tutorial/dist .
|
tar -czf /tmp/tutorial-dist.tar.gz -C apps/tutorial/dist .
|
||||||
RID=$(curl -sf -H "Authorization: token $TOK" "$API/releases/tags/ci-dist" | J id)
|
cat > /tmp/upload.mjs <<'JS'
|
||||||
if [ -z "$RID" ]; then
|
const API = process.env.API
|
||||||
RID=$(curl -sf -X POST -H "Authorization: token $TOK" -H "Content-Type: application/json" "$API/releases" \
|
const H = { Authorization: `token ${process.env.TOK}` }
|
||||||
-d '{"tag_name":"ci-dist","name":"CI 产物(滚动更新)","body":"每次构建的最新 dist。","draft":false,"prerelease":true}' | J id)
|
const j = async (u, opt) => { const r = await fetch(API + u, { ...opt, headers: { ...H, ...(opt?.headers || {}) } }); return { ok: r.ok, status: r.status, data: r.status === 204 ? null : await r.json().catch(() => null) } }
|
||||||
fi
|
let rid
|
||||||
if [ -z "$RID" ]; then
|
let r = await j('/releases/tags/ci-dist')
|
||||||
echo "::warning::release 不可用(job token 无写权限)——构建已成功,产物留在 runner"
|
if (r.ok) rid = r.data.id
|
||||||
exit 0
|
else {
|
||||||
fi
|
r = await j('/releases', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ tag_name: 'ci-dist', name: 'CI 产物(滚动更新)', body: '每次构建的最新 dist。', draft: false, prerelease: true }) })
|
||||||
for AID in $(curl -s -H "Authorization: token $TOK" "$API/releases/$RID/assets" | J 'assets.map(a=>a.id).join(" ")'); do
|
if (r.ok) rid = r.data.id
|
||||||
curl -s -X DELETE -H "Authorization: token $TOK" "$API/releases/$RID/assets/$AID" >/dev/null
|
}
|
||||||
done
|
if (!rid) { console.log(`::warning::release 不可用(${r.status})——构建已成功,产物留在 runner`); process.exit(0) }
|
||||||
URL=$(curl -sf -X POST -H "Authorization: token $TOK" "$API/releases/$RID/assets?name=tutorial-dist.tar.gz" \
|
for (const a of (await j(`/releases/${rid}/assets`)).data || []) await j(`/releases/${rid}/assets/${a.id}`, { method: 'DELETE' })
|
||||||
-F "attachment=@/tmp/tutorial-dist.tar.gz" | J browser_download_url)
|
const fd = new FormData()
|
||||||
echo "产物下载:${URL:-上传失败}"
|
fd.append('attachment', new Blob([await (await import('node:fs/promises')).readFile('/tmp/tutorial-dist.tar.gz')]), 'tutorial-dist.tar.gz')
|
||||||
|
const up = await fetch(`${API}/releases/${rid}/assets?name=tutorial-dist.tar.gz`, { method: 'POST', headers: H, body: fd })
|
||||||
|
console.log(up.ok ? `产物下载:${(await up.json()).browser_download_url}` : `上传失败 ${up.status}`)
|
||||||
|
JS
|
||||||
|
node /tmp/upload.mjs
|
||||||
Reference in new issue
Block a user