Skip to main content

Github Actions Workflow

Create a GitHub Actions workflow to automatically deploy your Walrus Site whenever you push to your repository. The workflow uses the official Deploy Walrus Site action maintained by Mysten Labs.

  • A GitHub repository containing your site's source files.
  • SUI_KEYSTORE secret and SUI_ADDRESS variable added to your repository. See Preparing Deployment Credentials.

How the action works

The Deploy Walrus Site action (MystenLabs/walrus-sites-github-actions/deploy) takes a directory of static files and uploads them to Walrus using site-builder. It does not build your site. You are responsible for producing the deployable output before calling the action.

The action performs the following steps:

  1. Downloads the site-builder binary for the selected version.
  2. Writes the Sui keystore to the runner environment.
  3. Runs site-builder deploy against your DIST directory.
  4. If GITHUB_TOKEN is provided and ws-resources.json changed, opens a pull request with the updated file.

Required inputs

  • DIST: Path to the directory containing your built static files. This directory must exist before the action runs.

Authentication inputs

Only choose 1 of the following authentication methods. Providing more than 1 causes the action to fail.

  • Method 1 (recommended for CI/CD): SUI_ADDRESS and SUI_KEYSTORE. Both must be present. SUI_ADDRESS is read from a repository variable; SUI_KEYSTORE is read from an encrypted secret.
  • Method 2: SUI_BECH32_PRIVATE_KEY. Pass the bech32-encoded private key (starting with suiprivkey) directly as a secret. No address input is needed.
  • Method 3: SUI_SECRET_PHRASE. Pass the mnemonic recovery phrase as a secret. Use this method only when no other credential format is available.

Optional inputs

InputDescriptionDefault
SUI_NETWORKTarget network: mainnet or testnetmainnet
EPOCHSNumber of epochs to keep the site stored5
WALRUS_CONFIGCustom Walrus configuration file contentDownloaded from Walrus repo
SITES_CONFIGCustom sites-config.yaml contentDownloaded from walrus-sites repo
WS_RESOURCESFull path to the ws-resources.json fileDIST/ws-resources.json
GITHUB_TOKENEnables automatic pull request creation when resources change(none)
SITE_BUILDER_VERSIONSite-builder version: v1 or v2v2

Understanding ws-resources.json

The site-builder tool uses a file called ws-resources.json to track the Sui object ID of your deployed site. This file determines whether a deployment creates a new site or updates an existing one.

First deployment (no ws-resources.json): The action creates a new Walrus Site object on Sui and writes ws-resources.json to your DIST directory. If GITHUB_TOKEN is provided with the correct permissions, the action opens a pull request containing this new file.

Subsequent deployments (existing ws-resources.json): The action reads the object_id from the file and updates the same site in place. Only changed resources are re-uploaded.

caution

Merge the pull request from your first deployment before the next workflow run. If ws-resources.json is not committed, each run creates a new site object instead of updating the existing one.

To place the file in your repository so that it survives across builds, add it under your framework's public/ directory (or equivalent). Most build tools copy everything in public/ directly into the output directory, which makes the file available at DIST/ws-resources.json without any extra configuration.

Once your site is deployed and you have its object_id, you can link it to a SuiNS name so that it is accessible at <suins>.wal.app. See Setting a SuiNS Name for details.

Using GITHUB_TOKEN for pull request creation

Providing GITHUB_TOKEN enables the action to open a pull request automatically when ws-resources.json changes. This is most useful for the initial deployment, when the file is first created.

To enable this feature, add the GITHUB_TOKEN input and grant the workflow the required permissions:

permissions:
contents: write
pull-requests: write

Without GITHUB_TOKEN, the action still deploys your site but does not open pull requests.

Workflow structure

A Walrus Sites workflow follows this general structure:

  1. Trigger definition (push, pull request, manual dispatch, and so on).
  2. Permissions block (required if using GITHUB_TOKEN).
  3. Checkout step.
  4. Build steps (required for frameworks; skip for pre-built static sites).
  5. Deploy Walrus Site action.

Create a file at .github/workflows/deploy-walrus-site.yml in your repository and adapt one of the examples below.

Example workflows

Static site (no build step)

Use this pattern when your repository already contains deployable static files with no compilation required:

name: Deploy to Walrus

on:
push:
branches: [main]
workflow_dispatch:

permissions:
contents: write
pull-requests: write

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

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

Replace ./site with the path to your static files directory.

Framework site with build step (frameworks like Vite, React, Vue, Svelte, and others)

Use this pattern when your site requires a compilation step before deployment. The example below uses a Vite + React + TypeScript setup but applies to any Node.js-based framework:

name: Deploy to Walrus

on:
push:
branches: [main]
workflow_dispatch:

permissions:
contents: write
pull-requests: write

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

- name: Set up Node.js
uses: actions/setup-node@v4
with:
node-version: 'lts/*'
cache: 'npm'

- name: Install dependencies
run: npm ci

- name: Build site
run: npm run build

- name: Deploy to Walrus
uses: MystenLabs/walrus-sites-github-actions/deploy@v1
with:
SUI_ADDRESS: ${{ vars.SUI_ADDRESS }}
SUI_KEYSTORE: ${{ secrets.SUI_KEYSTORE }}
DIST: ./dist
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
EPOCHS: '5'

Adjust the node-version, package manager commands, and DIST path to match your project.

Testnet deployment

To target Testnet instead of Mainnet, set SUI_NETWORK to testnet. Make sure the SUI_ADDRESS and SUI_KEYSTORE values correspond to a Testnet-funded address:

      - name: Deploy to Walrus (Testnet)
uses: MystenLabs/walrus-sites-github-actions/deploy@v1
with:
SUI_ADDRESS: ${{ vars.SUI_ADDRESS }}
SUI_KEYSTORE: ${{ secrets.SUI_KEYSTORE }}
DIST: ./dist
SUI_NETWORK: testnet
EPOCHS: '5'

Trigger strategies

GitHub Actions supports several trigger types. Choose the one that fits your release process:

  • Push to main: Deploy on every merge. Suitable for continuous deployment.
  • workflow_dispatch: Trigger manually from the Actions tab. Useful for controlled or infrequent releases.
  • Tag push: Deploy only on tagged releases by adding tags: ['v*'] under push. Suitable for versioned sites.
  • Pull request (dry run): Combine with a separate job that builds and validates the site without deploying, so you can catch build errors before merging.

Most projects use push on main combined with workflow_dispatch so that both automatic and manual deployments are available.