https://github.com/jclaveau/ci-prebuilds
Prebuilt images to use as containers to speedup GHA / Act runs
https://github.com/jclaveau/ci-prebuilds
act actions dind docker dood gha github images
Last synced: about 23 hours ago
JSON representation
Prebuilt images to use as containers to speedup GHA / Act runs
- Host: GitHub
- URL: https://github.com/jclaveau/ci-prebuilds
- Owner: jclaveau
- Created: 2025-10-17T09:33:49.000Z (9 months ago)
- Default Branch: main
- Last Pushed: 2026-07-14T05:02:33.000Z (4 days ago)
- Last Synced: 2026-07-14T06:23:19.440Z (4 days ago)
- Topics: act, actions, dind, docker, dood, gha, github, images
- Language: Shell
- Homepage:
- Size: 962 KB
- Stars: 0
- Watchers: 0
- Forks: 0
- Open Issues: 15
-
Metadata Files:
- Readme: README.md
- Agents: AGENTS.md
Awesome Lists containing this project
README
# CI-Prebuilds
[](https://github.com/jclaveau/ci-prebuilds/actions/workflows/test-and-publish.yml)
Speed up [GitHub Actions](https://docs.github.com/en/actions/get-started/quickstart) and [Act](https://nektosact.com) by removing the dep-install steps from your workflows
## Goals
- [x] Speed up CI (Even more relevant at the Agentic era)
- [x] Provide an environment similar to the default `ubuntu-latest` (`docker compose`, `shell aliases`, ...)
- [x] Debugable / Fast using `dind` or `dood`
- [x] Fast and light using the `Alpine` versions
- [x] Easy to extend / Request a specific version
- [x] Easy to revert / Small footprint in the CI workflows
## Quickstart
Pull from Docker Hub (`docker.io/jclaveau/`) — drop one into your workflow as the job
`container:`:
```yaml
# Example for acceptance tests
jobs:
e2e-front:
runs-on: ubuntu-latest
container: jclaveau/ubuntu-dood-playwright-gyp:latest
steps:
- uses: jclaveau/ci-prebuilds/.github/actions/prepare@v0 # DOCKER_MODE/HOST_ADDRESS defaults + start-dockerd under dind
- uses: actions/checkout@v4
- run: pnpm install --frozen-lockfile
- run: docker compose up -d --wait # no docker mcr.microsoft.com/playwright
- run: pnpm exec playwright test # no `playwright install --with-deps` required
e2e-back:
runs-on: ubuntu-latest
container: jclaveau/ubuntu-dood-pnpm-gyp:latest
steps:
- uses: jclaveau/ci-prebuilds/.github/actions/prepare@v0
- uses: actions/checkout@v4
- run: pnpm install --frozen-lockfile
- run: docker compose up -d --wait
- run: pnpm exec vitest
```
## Images
Images are layered — each builds on the previous — and every layer above the base ships in two
**flavors**, `-dood` and `-dind`:
```
ubuntu-gha-tools GitHub ubuntu-latest mimic (users, env, OS tools; slim — no compiler)
└─ docker (internal) + Docker Engine & Compose
├─ dood shares the host daemon (mounted socket)
└─ dind boots its own inner daemon
then: node ─┬─ pnpm ─────── playwright (slim; each in both -dood and -dind)
└─ pnpm-gyp ─── playwright-gyp (+ node-gyp toolchain, for native addons)
```
Image names follow `-[-][-sudoer]`. Pick one of each axis:
| Axis | Options | Default if unsure |
| --- | --- | --- |
| **OS** | `ubuntu` · `alpine` | `ubuntu` |
| **Mode** | `dood` (faster) · `dind` (isolated) | `dind` |
| **Layer** | none · `-node` · `-pnpm` · `-pnpm-gyp` · `-playwright` · `-playwright-gyp` | your needs |
| **Flavor** | default (no runtime sudo) · `-sudoer` | hardened |
- **One exception**: Playwright on Alpine is **Chromium-only** for now (using a --shell-only Chromium).
| Image | What it adds | Docs |
| --- | --- | --- |
| `ubuntu-gha-tools` | GitHub `ubuntu-latest` mimic (users, env, OS tools; no compiler) | [README](ubuntu-gha-tools/README.md) |
| `ubuntu-dood` / `ubuntu-dind` | + Docker Engine & Compose | [dood](dood/README.md) · [dind](dind/README.md) |
| `…-node` | + Node, npm (slim — no compiler) | [README](node/README.md) |
| `…-pnpm` | + pnpm | [README](pnpm/README.md) |
| `…-pnpm-gyp` | + node-gyp toolchain (for native addons) | [README](pnpm-gyp/README.md) |
| `…-playwright` | + Playwright | [README](playwright/README.md) |
| `…-playwright-gyp` | + Playwright on the `-gyp` base | [README](pnpm-gyp/README.md) |
(The `docker` layer is an internal, unpublished base — see [docker/README.md](docker/README.md).)
### Tags
Every combination is published with a `:latest` tag plus a version-pinned tag. Examples on the
current chain (Ubuntu 24.04 / Node 22.12 / pnpm 9.15 / Playwright 1.50):
| Image | `:latest` example | Version-pinned tag example |
| --- | --- | --- |
| `jclaveau/ubuntu-gha-tools` | `:latest` | `:ubuntu24.04` |
| `jclaveau/ubuntu-dood` · `jclaveau/ubuntu-dind` | `:latest` | `:ubuntu24.04` |
| `jclaveau/ubuntu-dood-node` | `:latest` | `:ubuntu24.04-node22.12` |
| `jclaveau/ubuntu-dood-pnpm` | `:latest` | `:ubuntu24.04-node22.12-pnpm9.15` |
| `jclaveau/ubuntu-dood-playwright` | `:latest` | `:ubuntu24.04-node22.12-pnpm9.15-pw1.50` |
| `jclaveau/ubuntu-dood-playwright-gyp` | `:latest` | `:ubuntu24.04-node22.12-pnpm9.15-pw1.50-gyp` |
> `ghcr.io/jclaveau/…:sha-` tags also exist but are **build intermediates** — the consumer
> contract is Docker Hub `:latest` and the version-pinned tags above.
## Security
- Once every deps are installed you may not require sudo anymore. So sudo is disabled by default
- add `-sudoer` to any image to get sudo back
- For local `act --bind` use on untrusted code, prefer **rootless docker**
## Gains
See [The last benchmarks](https://github.com/jclaveau/ci-prebuilds/actions/workflows/benchmark-playwright.yml).
## Full control usage
```yaml
jobs:
e2e-front:
name: ${{ matrix.mode }}
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
include: # Switch between ci environments to debug or save time
- mode: dood
image: jclaveau/ubuntu-dood-playwright-gyp:latest
options: --volume /var/run/docker.sock:/var/run/docker.sock
# - mode: dind
# image: jclaveau/ubuntu-dind-playwright-gyp:latest
# options: --privileged --env DOCKER_HOST=unix:///var/run/dind.sock
# - mode: vm
# image: "" # empty image → run on the host VM
# options: ""
container:
image: ${{ matrix.image }}
options: ${{ matrix.options }}
steps:
- uses: jclaveau/ci-prebuilds/.github/actions/prepare@v0 # DOCKER_MODE/HOST_ADDRESS defaults + start-dockerd under dind
- uses: actions/checkout@v4
- if: env.DOCKER_MODE == 'vm'
uses: actions/setup-node@v4
- if: env.DOCKER_MODE == 'vm'
uses: pnpm/action-setup@v4
with:
run_install: false
- run: pnpm install --frozen-lockfile
- run: docker compose up -d --wait
- if: env.DOCKER_MODE == 'vm'
name: Install Playwright browsers (vm)
run: pnpm exec playwright install --with-deps
- run: pnpm exec playwright test
```
See [the action](.github/actions/prepare/action.yml). Versioning:
- `@v0` — moving tag, advanced manually on compatible action updates
- `@v0.1.0` (immutable) or a commit SHA — full reproducibility
- `@v1` will exist once the repo reaches v1
## Roadmap
See [open issues](https://github.com/jclaveau/ci-prebuilds/issues).
## License
MIT