71 lines
3.5 KiB
YAML
71 lines
3.5 KiB
YAML
name: Build Tutorial
|
||
|
||
# 主仓库 gitea.idealjs.com/idealjs/stack 的 CI:打包新教程站。
|
||
# 全 shell、零外部 action——runner 连 github.com 不稳(actions 下载常超时):
|
||
# 源码:gitea API tarball(同机房,不走 github)
|
||
# node:自有 release 资产(提取自 node:24.14.0-alpine,镜像在阿里云 idealjs/node)
|
||
# 产物:滚动 release「ci-dist」资产(node 解析 JSON 上传)
|
||
on:
|
||
push:
|
||
branches: [main]
|
||
pull_request:
|
||
workflow_dispatch:
|
||
|
||
env:
|
||
NODE_DIST: https://gitea.idealjs.com/attachments/edad7a7e-3b3d-4d1b-9551-1a978fdf95d1
|
||
YARN_NPM_REGISTRY_SERVER: https://registry.npmmirror.com
|
||
API: https://gitea.idealjs.com/api/v1/repos/idealjs/stack
|
||
|
||
jobs:
|
||
build:
|
||
name: Build @stack/tutorial
|
||
runs-on: ubuntu-latest
|
||
steps:
|
||
- name: 拉源码(gitea tarball)
|
||
run: |
|
||
wget -q "$API/archive/$GITHUB_SHA.tar.gz" -O /tmp/src.tgz
|
||
tar -xzf /tmp/src.tgz --strip-components=1
|
||
ls apps/tutorial/package.json
|
||
|
||
- name: 装便携 node 24(musl bundle,自有资产)
|
||
run: |
|
||
wget -q "$NODE_DIST" -O /tmp/node.tar.xz
|
||
mkdir -p "$RUNNER_TEMP/node"
|
||
tar -xJf /tmp/node.tar.xz -C "$RUNNER_TEMP/node" --strip-components=1
|
||
echo "$RUNNER_TEMP/node/bin" >> "$GITHUB_PATH"
|
||
# alpine node 动态依赖 libstdc++/libgcc——bundle 自带,指给它
|
||
echo "LD_LIBRARY_PATH=$RUNNER_TEMP/node/lib" >> "$GITHUB_ENV"
|
||
export LD_LIBRARY_PATH="$RUNNER_TEMP/node/lib"
|
||
"$RUNNER_TEMP/node/bin/node" -v
|
||
|
||
- name: 安装依赖(corepack yarn4,registry 走 npmmirror)
|
||
run: |
|
||
# 镜像自带的 yarn1 断链(指向未提取的 /opt/yarn-*),清掉让 corepack 接管
|
||
rm -f "$(dirname "$(command -v node)")/yarn" "$(dirname "$(command -v node)")/yarnpkg"
|
||
corepack enable
|
||
yarn install --immutable
|
||
|
||
- name: 构建(Vite MPA:教程七页 + 博客 + 设计系统四册)
|
||
run: yarn workspace @stack/tutorial build
|
||
|
||
- name: 产物上传(滚动 release 资产;权限不足仅告警不红)
|
||
run: |
|
||
TOK="${{ 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 .
|
||
RID=$(curl -sf -H "Authorization: token $TOK" "$API/releases/tags/ci-dist" | J id)
|
||
if [ -z "$RID" ]; then
|
||
RID=$(curl -sf -X POST -H "Authorization: token $TOK" -H "Content-Type: application/json" "$API/releases" \
|
||
-d '{"tag_name":"ci-dist","name":"CI 产物(滚动更新)","body":"每次构建的最新 dist。","draft":false,"prerelease":true}' | J id)
|
||
fi
|
||
if [ -z "$RID" ]; then
|
||
echo "::warning::release 不可用(job token 无写权限)——构建已成功,产物留在 runner"
|
||
exit 0
|
||
fi
|
||
for AID in $(curl -s -H "Authorization: token $TOK" "$API/releases/$RID/assets" | J 'assets.map(a=>a.id).join(" ")'); do
|
||
curl -s -X DELETE -H "Authorization: token $TOK" "$API/releases/$RID/assets/$AID" >/dev/null
|
||
done
|
||
URL=$(curl -sf -X POST -H "Authorization: token $TOK" "$API/releases/$RID/assets?name=tutorial-dist.tar.gz" \
|
||
-F "attachment=@/tmp/tutorial-dist.tar.gz" | J browser_download_url)
|
||
echo "产物下载:${URL:-上传失败}"
|