ci: migrate from Woodpecker CI to Forgejo Actions #1

Merged
fmartingr merged 17 commits from feat/forgejo-actions into master 2026-09-22 17:33:29 +02:00

2026-09-22

fix(e2e): move off the retired Playwright driver CDN
All checks were successful
CI / goreleaser-lint (pull_request) Successful in 8s
CI / format (pull_request) Successful in 1m33s
CI / lint (pull_request) Successful in 3m23s
CI / build (pull_request) Successful in 3m5s
CI / test (pull_request) Successful in 4m38s
CI / e2e (pull_request) Successful in 26m24s
playwright-go v0.5200.1 fetches its driver from playwright.azureedge.net
and two sibling mirrors. Microsoft retired that CDN, so the e2e job died
on a 404 before it ever reached a test. The replacement host serves no
builds/driver zip for any version — 1.52 through 1.62 all answer 400 —
so there is nothing to pin or mirror to.

v0.6100.0 onwards pulls playwright-core from npm and Node from
nodejs.org instead, and moves the module path back to
github.com/mxschmitt/playwright-go. Take v0.6201.1, the latest. The
Playwright 1.52 to 1.62 jump needs no changes beyond the import path.

The CLI must match the module the tests link against, and the three
places that ran it had already drifted apart: the workflow pinned
v0.5200.1, the Makefile and scripts/e2e.sh asked for @latest. Both now
read the version from e2e/go.mod, and the workflow calls make e2e-install.
2026-09-22 16:38:00 +02:00
ci: retry dockerd in the e2e docker-in-docker service
Some checks failed
CI / goreleaser-lint (pull_request) Successful in 13s
CI / format (pull_request) Successful in 1m35s
CI / e2e (pull_request) Failing after 1m32s
CI / lint (pull_request) Successful in 3m1s
CI / test (pull_request) Successful in 5m48s
CI / build (pull_request) Successful in 4m50s
containerd needs about 10.04 seconds to boot in the runner's container
and dockerd waits exactly ten, so the first attempt always exits with
"timeout waiting for containerd to start" and the job never sees a
daemon. The second attempt wins, because containerd's files are in the
page cache by then. Measured on the runner: ready after roughly 45
seconds, with one retry.

The wait loop goes from 60 to 120 tries to cover that on a loaded host.
2026-09-22 15:59:09 +02:00
ci: run workflows on the GitHub-compatible runner
Some checks failed
CI / goreleaser-lint (pull_request) Successful in 6s
CI / format (pull_request) Failing after 31s
CI / lint (pull_request) Failing after 1m6s
CI / e2e (pull_request) Failing after 1m54s
CI / test (pull_request) Successful in 5m4s
CI / build (pull_request) Successful in 4m44s
The forge resolves a short `uses:` against github.com, so every action
carries its real name: goreleaser/goreleaser-action, oven-sh/setup-bun,
docker/setup-qemu-action, docker/setup-buildx-action.

Jobs run on ubuntu-latest, answered with the catthehacker act image, so
the ci-base container is gone. That image carries none of the tooling
ci-base provided, so each job installs what it calls: make everywhere,
build-essential for the CGO test job, upx-ucl for the goreleaser `upx`
block, bun for the webapp build and goreleaser itself for `make build`.

Playwright installs with --with-deps again now that the job has sudo.
2026-09-22 12:14:58 +02:00

2026-08-19

fix(ci): combine DinD with Playwright install without --with-deps
Some checks failed
CI / goreleaser-lint (pull_request) Successful in 13s
CI / format (pull_request) Successful in 3m4s
CI / lint (pull_request) Successful in 3m58s
CI / e2e (pull_request) Failing after 1m48s
CI / test (pull_request) Successful in 5m42s
CI / build (pull_request) Successful in 3m8s
DinD is required for testcontainers but breaks apt-based --with-deps;
install chromium only after the daemon is ready.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-19 15:28:08 +02:00
fix(ci): simplify e2e job and default testcontainers for CI
Some checks failed
CI / format (pull_request) Successful in 2m37s
CI / lint (pull_request) Successful in 3m9s
CI / build (pull_request) Has been cancelled
CI / goreleaser-lint (pull_request) Successful in 9s
CI / e2e (pull_request) Failing after 41s
CI / test (pull_request) Has been cancelled
Drop DinD service (breaks apt/playwright in the job container) and the
workflow env overrides that masked the e2e script config. Default Ryuk
disabled in e2e.sh for CI friendliness.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-19 15:23:04 +02:00
fix(ci): install Playwright system deps before browser download
Some checks failed
CI / goreleaser-lint (pull_request) Successful in 11s
CI / format (pull_request) Successful in 2m33s
CI / lint (pull_request) Successful in 3m20s
CI / build (pull_request) Has been cancelled
CI / test (pull_request) Has been cancelled
CI / e2e (pull_request) Failing after 1m35s
The --with-deps flag fails in the DinD job container; install Ubuntu
packages explicitly and download chromium from the e2e module context.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-19 15:16:15 +02:00
fix(ci): use Docker-in-Docker service for e2e testcontainers
Some checks failed
CI / goreleaser-lint (pull_request) Successful in 7s
CI / format (pull_request) Successful in 2m31s
CI / lint (pull_request) Successful in 3m9s
CI / e2e (pull_request) Failing after 1m31s
CI / build (pull_request) Has been cancelled
CI / test (pull_request) Has been cancelled
Mounting the host socket via container options is blocked by the runner,
so run a dind service and point DOCKER_HOST at it instead.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-19 15:10:27 +02:00
fix(ci): mount Docker socket for e2e job on Forgejo Actions
Some checks failed
CI / goreleaser-lint (pull_request) Successful in 10s
CI / format (pull_request) Successful in 2m28s
CI / lint (pull_request) Successful in 2m58s
CI / e2e (pull_request) Failing after 1s
CI / test (pull_request) Has been cancelled
CI / build (pull_request) Has been cancelled
The e2e job runs testcontainers inside a ci-base container, which needs
the host Docker socket mounted. Also preserve TESTCONTAINERS_RYUK_DISABLED
from CI env and wait for archive UI before asserting in archive tests.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-19 15:05:13 +02:00
ci: align Forgejo Actions with migrated repo conventions
Some checks failed
CI / goreleaser-lint (pull_request) Successful in 7s
CI / format (pull_request) Successful in 1m14s
CI / lint (pull_request) Successful in 2m57s
CI / e2e (pull_request) Failing after 21s
CI / test (pull_request) Successful in 5m22s
CI / build (pull_request) Successful in 4m23s
Bump ci-base to 1.1.0 and actions to v7, add Docker buildx setup for
releases, restore dockers_v2 for multi-arch images, and set testcontainers
env vars on the e2e job.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-19 14:45:50 +02:00

2026-04-08

fix(e2e): make link creation reach test web server via shared network
Some checks failed
CI / goreleaser-lint (pull_request) Successful in 11s
CI / format (pull_request) Successful in 2m38s
CI / test (pull_request) Successful in 5m0s
CI / lint (pull_request) Successful in 3m5s
CI / build (pull_request) Successful in 3m16s
CI / e2e (pull_request) Failing after 28m15s
The test web server and Hako container previously ran on isolated Docker
networks, so Hako could not fetch URLs like http://localhost:32865 (the
host-mapped port) from inside its container. Most tests passed vacuously
because they only checked DOM containers; the Archive tests failed
because they tried to click an actual link item that was never created.

Changes:
- Add a shared Docker network so both containers can communicate by alias
- Test web server registers as hako-testserver and returns that as its URL
- Hako container joins the same network and can resolve the alias
- CreateLink now navigates to /home before each call so it can be invoked
  multiple times in a row (the form redirects to /links after submission)
- IsVisible uses .First() to avoid Playwright strict-mode errors when a
  selector matches multiple elements
- Archive tests use .link-item instead of the never-matching
  a[href*='/links/'] selector
- Bump Dockerfile.e2e Alpine to 3.23 to match the production Containerfile
2026-04-08 16:42:42 +02:00
fix: add missing mattn/go-sqlite3 dependency to e2e module
Some checks failed
CI / goreleaser-lint (pull_request) Successful in 12s
CI / format (pull_request) Successful in 2m52s
CI / lint (pull_request) Successful in 3m33s
CI / test (pull_request) Successful in 6m0s
CI / build (pull_request) Successful in 3m18s
CI / e2e (pull_request) Failing after 39m39s
2026-04-08 10:01:15 +02:00
ci: use e2e/go.mod for e2e job Go version
Some checks failed
CI / goreleaser-lint (pull_request) Successful in 7s
CI / format (pull_request) Successful in 2m36s
CI / lint (pull_request) Successful in 3m13s
CI / e2e (pull_request) Failing after 2m1s
CI / build (pull_request) Has been cancelled
CI / test (pull_request) Has been cancelled
2026-04-08 09:53:15 +02:00
ci: increase test timeout to 5m for CI with race detector
Some checks failed
CI / goreleaser-lint (pull_request) Successful in 10s
CI / lint (pull_request) Has been cancelled
CI / format (pull_request) Has been cancelled
CI / test (pull_request) Has been cancelled
CI / e2e (pull_request) Has been cancelled
CI / build (pull_request) Has been cancelled
2026-04-08 09:52:19 +02:00

2026-04-07

fix: use all:dist embed directive to include dot-files
Some checks failed
CI / goreleaser-lint (pull_request) Successful in 15s
CI / format (pull_request) Successful in 2m19s
CI / lint (pull_request) Successful in 3m53s
CI / test (pull_request) Failing after 3m26s
CI / e2e (pull_request) Failing after 1m39s
CI / build (pull_request) Successful in 3m59s
2026-04-07 18:26:06 +02:00
fix: add .gitkeep to webapp/dist for go:embed compatibility
Some checks failed
CI / goreleaser-lint (pull_request) Successful in 5s
CI / lint (pull_request) Failing after 1m53s
CI / format (pull_request) Successful in 2m7s
CI / e2e (pull_request) Failing after 1m53s
CI / test (pull_request) Failing after 3m17s
CI / build (pull_request) Has been cancelled
2026-04-07 18:21:23 +02:00
fix: use master branch in CI workflow triggers
Some checks failed
CI / goreleaser-lint (pull_request) Successful in 6s
CI / e2e (pull_request) Failing after 1m40s
CI / test (pull_request) Failing after 3m14s
CI / build (pull_request) Successful in 4m31s
CI / format (pull_request) Successful in 1m15s
CI / lint (pull_request) Failing after 2m4s
2026-04-07 18:09:57 +02:00
ci: migrate from Woodpecker CI to Forgejo Actions
Replace Woodpecker CI pipelines with GitHub/Forgejo Actions workflows
using the ci-base:1.0.0 image. Simplify Makefile by removing unused
variables and adopting a cleaner help target. Switch goreleaser from
dockers_v2 to dockers + docker_manifests for per-arch image builds.
Update Containerfile to Alpine 3.23 and fix nfpm description.
2026-04-07 18:08:25 +02:00