Skip to main content

Examples

Docusaurus + GitHub Actions

Project
Root ─┬─ project
├─ src
├─ ... more directories
└─ website─┬─ blog
├─ docs
├─ build <== Contains website files
├─ node_modules
└─ ... more directories

plugins.sbt

In the project/plugins.sbt

addSbtPlugin("io.kevinlee" % "sbt-github-pages" % "0.19.0")

build.sbt

In build.sbt,

lazy val root = (project in file("."))
.enablePlugins(GitHubPagesPlugin)
.settings(
name := "YOUR_PROJECT",
gitHubPagesSiteDir := baseDirectory.value / "website"
)

GitHub Actions

In your GitHub Actions config file,

e.g.)

.github/workflows/publish-github-pages.yml
name: Publish GitHub Pages

on:
workflow_dispatch:

jobs:
build_and_publish_doc_site:
if: github.ref != 'refs/heads/gh-pages' && github.ref != 'gh-pages'

runs-on: ubuntu-latest

strategy:
matrix:
scala:
- { java-version: "21", java-distribution: "temurin" }
node:
- { version: "24.12.0" }

steps:
- uses: actions/checkout@v6
- uses: actions/setup-java@v5
with:
java-version: ${{ matrix.scala.java-version }}
distribution: ${{ matrix.scala.java-distribution }}
cache: 'sbt'
- uses: sbt/setup-sbt@v1
- uses: actions/setup-node@v6
with:
node-version: ${{ matrix.node.version }}
registry-url: 'https://registry.npmjs.org'

- name: Cache npm
uses: actions/cache@v5
with:
path: ~/.npm
key: ${{ runner.os }}-node-${{ matrix.node.version }}-${{ hashFiles('**/package-lock.json') }}
restore-keys: |
${{ runner.os }}-node-${{ matrix.node.version }}

- name: Build and publish website using Docusaurus
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
echo "> Create gh-pages branch if not exist"
sbt gitHubPagesCreateGitHubPagesBranchIfNotExist

cd website
echo "> Install packages"
npm install
echo "> Build the website using Docusaurus"
rm -Rf build
npm run build
cd ..

echo "> Publish to GitHub Pages"
sbt publishToGitHubPages

Pushing to publish-docs branch triggers the publish build in GitHub Actions.