Skip to content

Deploy docs site with Hugo via GitHub Actions#702

Open
oschwald wants to merge 3 commits into
mainfrom
greg/stf-448
Open

Deploy docs site with Hugo via GitHub Actions#702
oschwald wants to merge 3 commits into
mainfrom
greg/stf-448

Conversation

@oschwald
Copy link
Copy Markdown
Member

Summary

Migrates the Pages index from Jekyll on gh-pages to a Hugo build that
publishes back onto gh-pages from GitHub Actions. All CSS is now
inlined in the layout template — no external CDN dependencies.

  • Hugo site lives under docs/ on main and mounts README.md as
    the home page; the source of truth stays in one place
  • A small pill nav links from the overview to the Javadoc at
    /doc/latest/
  • .github/workflows/pages.yml builds with mise run build-docs and
    pushes to gh-pages via peaceiris/actions-gh-pages with
    keep_files: true, so every /doc/vX.Y.Z/ Javadoc subtree stays
    untouched
  • dev-bin/release.sh no longer regenerates the Jekyll index.md;
    the Javadoc-publishing block that writes doc/$tag/ and updates
    doc/latest is unchanged

Same design as MaxMind-DB PR #221: Charter serif body text,
forest-green accents, hover # anchor links.

Preview locally with mise run serve-docs.

For STF-448.

Post-merge steps

  1. Verify the live site at https://maxmind.github.io/GeoIP2-java/ and
    a sample https://maxmind.github.io/GeoIP2-java/doc/latest/ still
    loads after the next workflow run
  2. After we're confident the Hugo-rendered index is healthy, drop the
    legacy Jekyll source (_config.yml, _layouts/, the
    release-generated index.md, stylesheets/pygments.css,
    Gemfile*) from the gh-pages branch in a separate commit

Pages source stays on gh-pages — no Terraform change for this repo.

Test plan

  • mise run build-docs succeeds with no warnings
  • Rendered <title>, <h1>, and pill nav are correct
  • No static-gh.maxmind.com references in the new site
  • Build job passes in CI (push step only runs on main)
  • After merge, confirm the workflow pushes successfully to gh-pages
    and /doc/vX.Y.Z/ subtrees are preserved

🤖 Generated with Claude Code

oschwald and others added 3 commits May 15, 2026 22:38
Build with `mise run build-docs`, preview with `mise run serve-docs`.

The site mounts the existing `README.md` as the home page so the source
of truth stays in one place. A small pill nav links from Overview to the
versioned API documentation that lives on the `gh-pages` branch under
`doc/latest/`.

CSS is inlined in the layout template — no external dependencies. Same
Charter serif + forest-green design as the MaxMind-DB spec site.

For STF-448.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Deploys the Hugo docs site on push to main. The workflow builds the
site with `mise run build-docs` and pushes the rendered output onto
the existing `gh-pages` branch with `keep_files: true` — that
preserves every `/doc/vX.Y.Z/` Javadoc subtree exactly as the release
script publishes them. Pages keeps deploying from `gh-pages`, so no
Terraform change is needed for this repo.

All actions are SHA-pinned.

For STF-448.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Hugo on `main` now owns the Pages index, so the release script no
longer needs to write a Jekyll front-matter wrapper around README.md
on the gh-pages branch. The Javadoc-publishing block that creates
`doc/$tag/` and updates the `doc/latest` symlink is unchanged — that
versioned tree continues to live on gh-pages and is preserved by the
new workflow's `keep_files: true`.

For STF-448.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Copy link
Copy Markdown

@gemini-code-assist gemini-code-assist Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request transitions the project's documentation generation from a manual script to Hugo, introducing a new Hugo configuration, layouts, and mise tasks for building and serving the site. The review feedback suggests enhancing the robustness of the HTML templates by handling potential null file objects in the page title and using absolute URLs for links to external API documentation. Additionally, it is recommended to pin the Hugo version in the mise configuration rather than using the 'latest' tag to ensure environment consistency.

<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>{{ if .IsHome }}{{ .Site.Title }}{{ else }}{{ or .Title .File.BaseFileName }} | {{ .Site.Title }}{{ end }}</title>
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

The fallback logic or .Title .File.BaseFileName might fail if .File is nil, which can happen for certain virtual pages in Hugo. While all current pages are file-backed, it's safer to use the with statement or check for .File existence to avoid potential build errors in the future.

Suggested change
<title>{{ if .IsHome }}{{ .Site.Title }}{{ else }}{{ or .Title .File.BaseFileName }} | {{ .Site.Title }}{{ end }}</title>
<title>{{ if .IsHome }}{{ .Site.Title }}{{ else }}{{ with .Title }}{{ . }}{{ else }}{{ with .File }}{{ .BaseFileName }}{{ end }}{{ end }} | {{ .Site.Title }}{{ end }}</title>

<body>
<nav class="page-nav">
<a href="{{ .Site.Home.RelPermalink }}"{{ if .IsHome }} class="active"{{ end }}>Overview</a>
<a href="{{ "doc/latest/" | relURL }}">API documentation</a>
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

Using relURL for a path that is not managed by Hugo (the Javadocs are generated by Maven and pushed directly to gh-pages) might lead to incorrect links if the baseURL in hugo.toml is not perfectly aligned with the deployment environment. Since the Javadocs are at a known path relative to the site root, using absURL or ensuring the path starts with a leading slash (if baseURL includes the subpath) is often more robust.

Suggested change
<a href="{{ "doc/latest/" | relURL }}">API documentation</a>
<a href="{{ "/doc/latest/" | absURL }}">API documentation</a>

Comment thread mise.toml
]

[tools]
hugo = "latest"
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

While mise.lock pins the version, it is generally better practice to specify a version range or a minimum version in mise.toml instead of latest. This provides better visibility into the required tool version without needing to inspect the lockfile.

Suggested change
hugo = "latest"
hugo = "0.161"

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Development

Successfully merging this pull request may close these issues.

1 participant