Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

第 11 章 Walrus Sites CI/CD

Walrus Sites 的 CI/CD 目标很简单:每次合并到主分支后,构建静态产物,调用官方 GitHub Action 运行 site-builder deploy,并保存更新后的 ws-resources.json

官方 Action 是:

MystenLabs/walrus-sites-github-actions/deploy

它负责下载 site-builder、写入 Sui keystore,并对你指定的静态目录执行部署。它不会替你构建前端项目,所以 npm run buildmdbook buildastro build 等步骤必须放在 Action 之前。

凭据

在 GitHub 仓库中配置:

类型名称内容
SecretSUI_KEYSTORE部署钱包的 Sui keystore JSON 内容。
VariableSUI_ADDRESS部署钱包地址。

部署钱包必须拥有目标 Walrus Site 对象。生产项目建议单独创建部署钱包,只给它站点更新所需资产,不要复用个人主钱包。

最小静态站点部署 workflow

本仓库提供可复制模板:examples/sites/github-actions/deploy-walrus-site.yml

如果你的仓库直接包含静态目录 site/

name: Deploy Walrus Site

on:
  push:
    branches: [main]
  workflow_dispatch:

permissions:
  contents: write
  pull-requests: write

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6

      - name: Deploy to Walrus Sites
        uses: MystenLabs/walrus-sites-github-actions/deploy@main
        with:
          DIST: site
          EPOCHS: 5
          SUI_ADDRESS: ${{ vars.SUI_ADDRESS }}
          SUI_KEYSTORE: ${{ secrets.SUI_KEYSTORE }}
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          SITE_BUILDER_VERSION: v2

第一次部署没有 ws-resources.json 或其中没有 object_id 时,Action 会创建新站点。如果传入了 GITHUB_TOKEN 且权限足够,Action 可以把新生成或更新后的 ws-resources.json 通过 pull request 带回仓库。

Vite / React 示例

Vite 的部署目录是 dist,但 ws-resources.json 通常放在项目根目录或 public/ 中。为了让构建产物带上配置文件,可以把它放到 public/ws-resources.json

my-app/
├── public/
│   └── ws-resources.json
├── src/
├── index.html
└── package.json

workflow:

name: Deploy Vite App to Walrus Sites

on:
  push:
    branches: [main]
  workflow_dispatch:

permissions:
  contents: write
  pull-requests: write

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6

      - uses: actions/setup-node@v6
        with:
          node-version: 22
          cache: npm

      - run: npm ci
      - run: npm run build

      - name: Deploy to Walrus Sites
        uses: MystenLabs/walrus-sites-github-actions/deploy@main
        with:
          DIST: dist
          EPOCHS: 10
          SUI_ADDRESS: ${{ vars.SUI_ADDRESS }}
          SUI_KEYSTORE: ${{ secrets.SUI_KEYSTORE }}
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          SITE_BUILDER_VERSION: v2

如果第一次部署后 Action 创建了更新 ws-resources.json 的 PR,先合并它,再继续后续自动部署。否则每次 CI 都会缺少 object_id,不断创建新站点。

mdBook 示例

mdBook 的构建输出默认是 book/。把 Walrus Sites 配置复制到输出目录:

name: Deploy mdBook to Walrus Sites

on:
  push:
    branches: [main]
  workflow_dispatch:

permissions:
  contents: write
  pull-requests: write

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6

      - name: Install mdBook
        run: |
          curl -LsSf https://github.com/rust-lang/mdBook/releases/download/v0.5.2/mdbook-v0.5.2-x86_64-unknown-linux-gnu.tar.gz \
            | tar -xz
          sudo mv mdbook /usr/local/bin/mdbook

      - run: mdbook build
      - run: cp ws-resources.json book/ws-resources.json

      - name: Deploy to Walrus Sites
        uses: MystenLabs/walrus-sites-github-actions/deploy@main
        with:
          DIST: book
          EPOCHS: 10
          SUI_ADDRESS: ${{ vars.SUI_ADDRESS }}
          SUI_KEYSTORE: ${{ secrets.SUI_KEYSTORE }}
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          SITE_BUILDER_VERSION: v2

分环境发布

建议把 Testnet 和 Mainnet 的配置分开:

config/
├── ws-resources.mainnet.json
└── ws-resources.testnet.json

部署前复制到构建目录:

cp config/ws-resources.testnet.json dist/ws-resources.json

GitHub Actions 可以用 workflow_dispatch 参数控制环境:

on:
  workflow_dispatch:
    inputs:
      target:
        type: choice
        required: true
        options: [testnet, mainnet]

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6
      - run: npm ci
      - run: npm run build
      - run: cp config/ws-resources.${{ inputs.target }}.json dist/ws-resources.json
      - uses: MystenLabs/walrus-sites-github-actions/deploy@main
        with:
          DIST: dist
          EPOCHS: 10
          SUI_ADDRESS: ${{ vars.SUI_ADDRESS }}
          SUI_KEYSTORE: ${{ secrets.SUI_KEYSTORE }}
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          SITE_BUILDER_VERSION: v2

Mainnet 发布建议保留人工触发,Testnet 可以在 push 后自动发布。

CI 失败排查

现象处理
每次都创建新站点检查 ws-resources.json 是否被提交或 Action 是否能创建 PR。
owner 或权限错误部署钱包不是 Walrus Site 对象 owner,换钱包或转移对象。
找不到 index.htmlDIST 指错目录,应该指向构建产物。
Mainnet 部署成功但打不开wal.app 需要 SuiNS 名称;先把名称指向站点对象。
路由刷新 404ws-resources.json"routes": { "/*": "/index.html" }
静态资源旧版本检查 headers,入口 HTML 不要长期缓存,hash 资源可以长缓存。

CI 的核心约束是可重复:同一份源码、同一份 lockfile、同一个 ws-resources.json,应该更新同一个站点对象。只要这个约束成立,Walrus Sites 的发布流程就能稳定接入常规前端工程。