Compare commits

...
Author SHA1 Message Date
branderson d4288f45ff ci: stop building images on the GitHub mirror
GHCR keeps throttling the streamer's base image pull, so drop the GitHub
image workflow for now and have users build with docker compose. The
forge workflow keeps its retry for the operator's own deployment.
2026-10-16 00:02:36 -07:00
branderson a84ba7f6de Merge pull request 'Retry image builds once after a GHCR 429' (#17) from ci-retry-ghcr into main
Images / app (push) Successful in 4m56s
Images / session-manager (push) Successful in 1m49s
Images / streamer (push) Successful in 3m40s
Reviewed-on: #17
Reviewed-by: branderson <brad@branderson.io>
2026-10-15 21:29:32 -07:00
branderson d45aa8b603 ci: retry forge image builds once after a GHCR 429 too 2026-10-15 21:28:37 -07:00
branderson d54a44da1d ci: retry GitHub image builds once after a GHCR 429
The streamer's base image pull from ghcr.io intermittently gets 429 Too
Many Requests on GitHub's shared runners, failing the first attempt of
the last two runs; re-running minutes later succeeded both times.
2026-10-15 20:05:38 -07:00
branderson bf175b64a2 Merge pull request 'Retake screenshots on made-up demo data' (#16) from demo-screenshots into main
Images / app (push) Successful in 5m47s
Images / session-manager (push) Successful in 7m22s
Images / streamer (push) Failing after 1m14s
Reviewed-on: #16
Reviewed-by: branderson <brad@branderson.io>
2026-10-15 19:47:24 -07:00
10 changed files with 34 additions and 101 deletions
+1 -3
View File
@@ -37,9 +37,7 @@ architecture notes are in `CLAUDE.md`; feature and deployment docs are in
## GitHub mirror
`mirror/` publishes `main` to a read-only GitHub mirror from the operator's
host, never from a session; see `docs/08-development/github-mirror.md`. GitHub
runs `.github/workflows`, the forge `.gitea/workflows`; keep the two image
workflows in step.
host, never from a session; see `docs/08-development/github-mirror.md`.
## CI
+1 -1
View File
@@ -13,7 +13,7 @@ JWT_SECRET=replace-with-a-secure-random-string
# Built from source by default. To pull published images instead, set the
# registry path they live under (ending in /), then:
# docker compose pull && docker compose up -d
# IMAGE_PREFIX=ghcr.io/branderson/
# IMAGE_PREFIX=registry.example.com/owner/
# IMAGE_TAG=latest
# "Latest release" API URL to check for updates (GitHub or Gitea); off when unset
# APP_UPDATE_URL=https://git.example.com/api/v1/repos/owner/dotcom-arcade/releases/latest
+22 -1
View File
@@ -78,7 +78,28 @@ jobs:
images: ${{ steps.registry.outputs.host }}/${{ steps.registry.outputs.owner }}/${{ matrix.image }}
tags: type=raw,value=latest
- uses: docker/build-push-action@v6
# GHCR sometimes answers the streamer's base image pull with 429 Too Many
# Requests; it clears within minutes, so retry once.
- id: build
uses: docker/build-push-action@v6
continue-on-error: true
with:
context: ${{ matrix.context }}
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
platforms: linux/amd64
build-args: |
VERSION=${{ steps.version.outputs.sha }}
provenance: false
- name: Wait before retrying
if: steps.build.outcome == 'failure'
run: sleep 120
- name: Retry the build
if: steps.build.outcome == 'failure'
uses: docker/build-push-action@v6
with:
context: ${{ matrix.context }}
push: true
-70
View File
@@ -1,70 +0,0 @@
# Builds the app, session manager and streamer images on the GitHub mirror and
# pushes them to GitHub's container registry, under the repository's owner.
# The forge runs .gitea/workflows/images.yml instead; Gitea ignores this
# directory while .gitea/workflows exists.
name: Images
on:
push:
branches: [main]
workflow_dispatch:
permissions:
contents: read
packages: write
jobs:
build:
name: ${{ matrix.name }}
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
include:
- name: app
image: dotcom-arcade
context: .
- name: session-manager
image: dotcom-arcade-session-manager
context: streaming/session-manager
- name: streamer
image: dotcom-arcade-streamer
context: streaming/streamer
steps:
- uses: actions/checkout@v4
- name: Lowercase the owner
id: owner
shell: bash
run: echo "name=${GITHUB_REPOSITORY_OWNER,,}" >> "$GITHUB_OUTPUT"
# Shown in Settings, since images carry no version number
- name: Name the version
id: version
shell: bash
run: echo "sha=${GITHUB_SHA::7}" >> "$GITHUB_OUTPUT"
- uses: docker/setup-buildx-action@v3
- uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- id: meta
uses: docker/metadata-action@v5
with:
images: ghcr.io/${{ steps.owner.outputs.name }}/${{ matrix.image }}
tags: type=raw,value=latest
- uses: docker/build-push-action@v6
with:
context: ${{ matrix.context }}
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
platforms: linux/amd64
build-args: |
VERSION=${{ steps.version.outputs.sha }}
provenance: false
-3
View File
@@ -135,9 +135,6 @@ PGID=1000
docker compose up -d --build
```
To pull prebuilt images instead of building them, see
[prebuilt images](docs/09-deployment/docker-deployment.md#prebuilt-images).
Open `http://<server>/` and create the admin account. On first start the app
indexes the collection, which takes a few minutes on a full Ultimate install.
Under **Settings → App** you can set the site name and tagline.
+1 -1
View File
@@ -16,7 +16,7 @@ the Dotcom Arcade application.
6. **[Debugging Guide](./debugging.md)** - Debugging tips and troubleshooting
7. **[Common Pitfalls](./common-pitfalls.md)** - Known issues and solutions
8. **[Upstream Sync](./upstream-sync.md)** - Merging changes from flashpoint-web
9. **[GitHub Mirror](./github-mirror.md)** - Publishing to GitHub and GHCR
9. **[GitHub Mirror](./github-mirror.md)** - Publishing to GitHub
10. **[Demo Data](./demo-data.md)** - Made-up games for development and screenshots
## Quick Start
+1 -4
View File
@@ -4,8 +4,7 @@ Dotcom Arcade is developed on a private forge. `mirror/github-mirror.sh`
publishes its `main` and the tags on `main` to
[github.com/branderson/dotcom-arcade](https://github.com/branderson/dotcom-arcade),
hourly, from a host that can push to GitHub. Issues and pull requests are off
there. Actions stays on, since it builds the images that `ghcr.io/branderson/`
serves (see [publishing images](../09-deployment/docker-deployment.md#publishing-images)).
there.
The mirror's `main` is the forge's plus one commit, which adds a read-only notice
under the README's title. Every forge commit is in the mirror unchanged, and
@@ -21,8 +20,6 @@ instead of publishing without the notice.
pushing it.
3. Once the first sync has pushed, run `github-mirror.sh --settings` (needs
`gh`). It turns off issues, pull requests, projects, wiki and discussions.
4. The first image build creates its packages as private. In each package's
settings on GitHub, set its visibility to public.
The timer runs a copy of the script, not the checkout's. Reinstall it after
reviewing a change to `mirror/`.
+5 -14
View File
@@ -28,27 +28,18 @@ All three are built from this repository by `docker compose up -d --build`.
### Prebuilt images
Images are published to GitHub's container registry. To pull them instead of
building, set `IMAGE_PREFIX` in `.env`, ending in `/`. There's one tag,
`latest`, built from the tip of `main`.
No images are published for now, so build them with `docker compose up -d --build`.
If you publish your own (see below), set `IMAGE_PREFIX` in `.env` to the
registry path they live under, ending in `/`:
```sh
IMAGE_PREFIX=ghcr.io/branderson/
IMAGE_PREFIX=registry.example.com/owner/
```
Then run `docker compose pull && docker compose up -d`. Images from another
registry work the same way, with its path as the prefix.
Then run `docker compose pull && docker compose up -d`.
### Publishing images
Two workflows build the same images with the same tags:
- `.github/workflows/images.yml` runs on the
[GitHub mirror](../08-development/github-mirror.md) and pushes to
`ghcr.io/<owner>/` with the workflow's own token. It needs no setup.
- `.gitea/workflows/images.yml` runs on the forge. Gitea ignores
`.github/workflows` while `.gitea/workflows` exists.
`.gitea/workflows/images.yml` builds all three images on Gitea Actions and
pushes them to the Gitea instance's container registry, under the repository's
owner. Each push to `main` publishes `latest`. Its jobs run docker builds, so they need a runner labelled
+1 -1
View File
@@ -126,7 +126,7 @@ for Flashpoint Ultimate.
- [Debugging](08-development/debugging.md) - Debugging tips
- [Common Pitfalls](08-development/common-pitfalls.md) - Known issues
- [Upstream Sync](08-development/upstream-sync.md) - Merging changes from flashpoint-web
- [GitHub Mirror](08-development/github-mirror.md) - Publishing to GitHub and GHCR
- [GitHub Mirror](08-development/github-mirror.md) - Publishing to GitHub
- [Demo Data](08-development/demo-data.md) - Made-up games for development and screenshots
### 09. Deployment
+2 -3
View File
@@ -54,9 +54,8 @@ transform() {
|| die "README.md: no title to put the mirror notice under"
}
# Issues, pull requests, wiki and the like off; Actions stays on, since it
# publishes the images. Settings rather than content, so a sync does not
# reapply them; run once after creating the repository.
# Issues, pull requests, wiki and the like off. Settings rather than content,
# so a sync does not reapply them; run once after creating the repository.
settings() {
command -v gh >/dev/null || die "--settings needs the gh CLI"
gh api -X PATCH "repos/$MIRROR_REPO" --silent \