diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..eb4927c --- /dev/null +++ b/.dockerignore @@ -0,0 +1,8 @@ +# buildah/docker 构建上下文瘦身 +.git +**/node_modules +**/dist +**/test-results +**/playwright-report +apps/design-lab/e2e +.zcode* diff --git a/.gitea/workflows/build-tutorial.yml b/.gitea/workflows/build-tutorial.yml index 4281888..36c7eca 100644 --- a/.gitea/workflows/build-tutorial.yml +++ b/.gitea/workflows/build-tutorial.yml @@ -1,10 +1,10 @@ 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 上传) +# 构建环境全部封装在 apps/tutorial/Dockerfile(node24-alpine + yarn4 + npmmirror), +# runner 用 buildah 无 daemon 执行——不依赖 runner 宿主的 node/docker,也不碰 github.com。 +# 源码:gitea API tarball(同机房) +# 产物:滚动 release「ci-dist」资产(node 取自镜像挂载层,原生 fetch 上传) on: push: branches: [main] @@ -12,47 +12,36 @@ on: 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 + name: Build @stack/tutorial (buildah) 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 + ls apps/tutorial/Dockerfile - - name: 装便携 node 24(musl bundle,自有资产) + - name: 装 buildah(runner 无 docker;buildah 无 daemon 即可构建) + run: command -v buildah >/dev/null || apk add --no-cache buildah + + - name: buildah 构建镜像(环境封装在 Dockerfile) 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 + buildah build --storage-driver=vfs -f apps/tutorial/Dockerfile -t stack-tutorial:ci . - - 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 资产;权限不足仅告警不红) + - name: 取产物并上传 release(node 取自镜像挂载层) env: TOK: ${{ secrets.CI_TOKEN || github.token }} run: | - tar -czf /tmp/tutorial-dist.tar.gz -C apps/tutorial/dist . + CID=$(buildah from localhost/stack-tutorial:ci) + MNT=$(buildah mount "$CID") + ls "$MNT/repo/apps/tutorial/dist/index.html" + tar -czf /tmp/tutorial-dist.tar.gz -C "$MNT/repo/apps/tutorial/dist" . + export LD_LIBRARY_PATH="$MNT/usr/lib" cat > /tmp/upload.mjs <<'JS' const API = process.env.API const H = { Authorization: `token ${process.env.TOK}` } @@ -71,4 +60,6 @@ jobs: 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 + "$MNT/usr/local/bin/node" /tmp/upload.mjs + buildah unmount "$CID" >/dev/null 2>&1 || true + buildah rm "$CID" >/dev/null 2>&1 || true diff --git a/apps/tutorial/Dockerfile b/apps/tutorial/Dockerfile new file mode 100644 index 0000000..a2eea79 --- /dev/null +++ b/apps/tutorial/Dockerfile @@ -0,0 +1,13 @@ +# 教程站构建镜像——CI 用 buildah(无 daemon)执行,本地 docker/podman build 同样可用。 +# 基座走 daocloud 公共镜像(国内快、免登录);与阿里云 idealjs/node:24.14.0-alpine 同源。 +FROM docker.m.daocloud.io/library/node:24.14.0-alpine + +ENV YARN_NPM_REGISTRY_SERVER=https://registry.npmmirror.com +WORKDIR /repo + +# monorepo 全量上下文(.dockerignore 瘦身);依赖与构建同层——lockfile 由 --immutable 锁定 +COPY . . +RUN rm -f /usr/local/bin/yarn /usr/local/bin/yarnpkg \ + && corepack enable \ + && yarn install --immutable \ + && yarn workspace @stack/tutorial build