Emma Thorpe d296d88c4c
Build and publish container / build (pull_request) Successful in 1m59s
ci: tag images by semver and point latest at newest release
Replace the raw latest-on-default-branch tag, which moved latest on every
main push, with metadata-action's latest=auto flavor so latest follows the
newest non-prerelease v* release. Add a {{major}} tag alongside the
existing version and major.minor semver tags; branch and SHA tags remain
for traceability of non-release builds.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-11 16:43:33 +01:00

Why is the DLR shut today?

A single-page site that displays one randomly chosen message in the centre of the screen. The message changes on every page load and whenever the Check again button is pressed.

The site is themed around the Docklands Light Railway colour scheme, with a toggle between:

  • Modern colours — the current DLR turquoise/teal branding.
  • Original colours — the 1987 DLR red-and-blue livery.

The chosen theme is remembered between visits via localStorage.

Adding messages

Edit messages.js and fill the MESSAGES array with your own reasons — one string per entry. Entries are inserted as plain text. Until you add some, the page shows a fallback prompt.

Running

It is a static site with no build step. Open index.html in a browser, or serve the directory with any static file server, for example:

python3 -m http.server

Container

The site is packaged as a container based on nginxinc/nginx-unprivileged. It runs as a non-root user and listens on port 8080, serving the static files and exposing a /healthz endpoint. It is designed to sit behind an external reverse proxy that terminates TLS and routes by host.

Build and run locally:

docker build -t dlr .
docker run --rm -p 8080:8080 dlr
# then browse http://localhost:8080

CI

.gitea/workflows/build-and-publish.yml builds the container with Gitea Actions and publishes it to this Gitea instance's container registry on pushes to main and on v* tags. Pull requests build the image but do not push. The registry host is derived from the Gitea server URL.

Authentication requires a Personal Access Token with package read/write scope, because the automatically provided GITEA_TOKEN does not carry container registry write permission on most Gitea instances. Create the token under an account with write access to the target package namespace, then store it as a repository Actions secret named PACKAGES_TOKEN.

The published image is <gitea-host>/<owner>/<repo>. Pushing a v* git tag produces semantic-version tags ({{version}}, {{major}}.{{minor}}, {{major}}), and latest is moved to that build when it is not a pre-release. Non-release builds on main are tagged by branch name and commit SHA only, so latest always points at the most recent release rather than the newest commit.

Dependency updates

renovate.json configures Renovate to keep dependencies current:

  • the Dockerfile base image,
  • the actions used in the Gitea workflow,
  • versioned front-end dependencies referenced in HTML.

There are currently no external front-end dependencies. When one is added via a CDN, Renovate will track it if it is either annotated with a comment, e.g.

<!-- renovate: datasource=npm depName=bootstrap -->
<link href="https://cdn.example.com/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet">

or referenced through a versioned jsDelivr / unpkg npm URL, which is detected automatically.

Files

File Purpose
index.html Page structure.
styles.css Both colour schemes, selected via data-theme.
messages.js The list of messages (fill this in).
script.js Random message selection and the theme toggle.
Dockerfile / default.conf Container image and nginx static-serving config.
.gitea/workflows/ Gitea Actions build-and-publish pipeline.
renovate.json Renovate dependency-update configuration.
S
Description
No description provided
Readme 172 KiB
Languages
CSS 43.5%
JavaScript 32.7%
HTML 17.4%
Dockerfile 6.4%