{"id":51712144,"url":"https://github.com/jclaveau/ci-prebuilds","last_synced_at":"2026-07-16T22:36:23.142Z","repository":{"id":319269837,"uuid":"1078151749","full_name":"jclaveau/ci-prebuilds","owner":"jclaveau","description":"Prebuilt images to use as containers to speedup GHA / Act runs","archived":false,"fork":false,"pushed_at":"2026-07-14T05:02:33.000Z","size":985,"stargazers_count":0,"open_issues_count":15,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-07-14T06:23:19.440Z","etag":null,"topics":["act","actions","dind","docker","dood","gha","github","images"],"latest_commit_sha":null,"homepage":"","language":"Shell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/jclaveau.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2025-10-17T09:33:49.000Z","updated_at":"2026-06-27T09:42:51.000Z","dependencies_parsed_at":"2025-10-24T11:08:24.729Z","dependency_job_id":"0235b2fa-d00e-4fd5-9014-f25e36c5d7ea","html_url":"https://github.com/jclaveau/ci-prebuilds","commit_stats":null,"previous_names":["jclaveau/docker-images","jclaveau/github-action-container-images"],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/jclaveau/ci-prebuilds","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jclaveau%2Fci-prebuilds","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jclaveau%2Fci-prebuilds/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jclaveau%2Fci-prebuilds/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jclaveau%2Fci-prebuilds/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jclaveau","download_url":"https://codeload.github.com/jclaveau/ci-prebuilds/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jclaveau%2Fci-prebuilds/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35560452,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-07-16T02:00:06.687Z","response_time":83,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["act","actions","dind","docker","dood","gha","github","images"],"created_at":"2026-07-16T22:36:22.539Z","updated_at":"2026-07-16T22:36:23.132Z","avatar_url":"https://github.com/jclaveau.png","language":"Shell","funding_links":[],"categories":[],"sub_categories":[],"readme":"# CI-Prebuilds\n\n[![Test and Publish](https://github.com/jclaveau/ci-prebuilds/actions/workflows/test-and-publish.yml/badge.svg)](https://github.com/jclaveau/ci-prebuilds/actions/workflows/test-and-publish.yml)\n\nSpeed 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\n\n## Goals\n- [x] Speed up CI (Even more relevant at the Agentic era)\n- [x] Provide an environment similar to the default `ubuntu-latest` (`docker compose`, `shell aliases`, ...)\n- [x] Debugable / Fast using `dind` or `dood`\n- [x] Fast and light using the `Alpine` versions\n- [x] Easy to extend / Request a specific version\n- [x] Easy to revert / Small footprint in the CI workflows\n\n## Quickstart\n\nPull from Docker Hub (`docker.io/jclaveau/\u003cimage\u003e`) — drop one into your workflow as the job\n`container:`:\n\n```yaml\n# Example for acceptance tests\njobs:\n  e2e-front:\n    runs-on: ubuntu-latest\n    container: jclaveau/ubuntu-dood-playwright-gyp:latest\n    steps:\n      - uses: jclaveau/ci-prebuilds/.github/actions/prepare@v0  # DOCKER_MODE/HOST_ADDRESS defaults + start-dockerd under dind\n      - uses: actions/checkout@v4\n      - run: pnpm install --frozen-lockfile\n      - run: docker compose up -d --wait  # no docker mcr.microsoft.com/playwright\n      - run: pnpm exec playwright test    # no `playwright install --with-deps` required\n  e2e-back:\n    runs-on: ubuntu-latest\n    container: jclaveau/ubuntu-dood-pnpm-gyp:latest\n    steps:\n      - uses: jclaveau/ci-prebuilds/.github/actions/prepare@v0\n      - uses: actions/checkout@v4\n      - run: pnpm install --frozen-lockfile\n      - run: docker compose up -d --wait\n      - run: pnpm exec vitest\n```\n\n\n## Images\n\nImages are layered — each builds on the previous — and every layer above the base ships in two\n**flavors**, `-dood` and `-dind`:\n\n```\nubuntu-gha-tools            GitHub ubuntu-latest mimic (users, env, OS tools; slim — no compiler)\n  └─ docker  (internal)     + Docker Engine \u0026 Compose\n       ├─ dood              shares the host daemon (mounted socket)\n       └─ dind              boots its own inner daemon\n            then:  node ─┬─ pnpm ─────── playwright          (slim; each in both -dood and -dind)\n                         └─ pnpm-gyp ─── playwright-gyp       (+ node-gyp toolchain, for native addons)\n```\n\nImage names follow `\u003cos\u003e-\u003cmode\u003e[-\u003clayer\u003e][-sudoer]`. Pick one of each axis:\n\n| Axis | Options | Default if unsure |\n| --- | --- | --- |\n| **OS** | `ubuntu` · `alpine` | `ubuntu` |\n| **Mode** | `dood` (faster) · `dind` (isolated) | `dind` |\n| **Layer** | none · `-node` · `-pnpm` · `-pnpm-gyp` · `-playwright` · `-playwright-gyp` | your needs |\n| **Flavor** | default (no runtime sudo) · `-sudoer` | hardened |\n\n- **One exception**: Playwright on Alpine is **Chromium-only** for now (using a --shell-only Chromium).\n\n| Image | What it adds | Docs |\n| --- | --- | --- |\n| `ubuntu-gha-tools` | GitHub `ubuntu-latest` mimic (users, env, OS tools; no compiler) | [README](ubuntu-gha-tools/README.md) |\n| `ubuntu-dood` / `ubuntu-dind` | + Docker Engine \u0026 Compose | [dood](dood/README.md) · [dind](dind/README.md) |\n| `…-node` | + Node, npm (slim — no compiler) | [README](node/README.md) |\n| `…-pnpm` | + pnpm | [README](pnpm/README.md) |\n| `…-pnpm-gyp` | + node-gyp toolchain (for native addons) | [README](pnpm-gyp/README.md) |\n| `…-playwright` | + Playwright | [README](playwright/README.md) |\n| `…-playwright-gyp` | + Playwright on the `-gyp` base | [README](pnpm-gyp/README.md) |\n\n(The `docker` layer is an internal, unpublished base — see [docker/README.md](docker/README.md).)\n\n\n### Tags\nEvery combination is published with a `:latest` tag plus a version-pinned tag. Examples on the\ncurrent chain (Ubuntu 24.04 / Node 22.12 / pnpm 9.15 / Playwright 1.50):\n\n| Image | `:latest` example | Version-pinned tag example |\n| --- | --- | --- |\n| `jclaveau/ubuntu-gha-tools` | `:latest` | `:ubuntu24.04` |\n| `jclaveau/ubuntu-dood` · `jclaveau/ubuntu-dind` | `:latest` | `:ubuntu24.04` |\n| `jclaveau/ubuntu-dood-node` | `:latest` | `:ubuntu24.04-node22.12` |\n| `jclaveau/ubuntu-dood-pnpm` | `:latest` | `:ubuntu24.04-node22.12-pnpm9.15` |\n| `jclaveau/ubuntu-dood-playwright` | `:latest` | `:ubuntu24.04-node22.12-pnpm9.15-pw1.50` |\n| `jclaveau/ubuntu-dood-playwright-gyp` | `:latest` | `:ubuntu24.04-node22.12-pnpm9.15-pw1.50-gyp` |\n\n\n\u003e `ghcr.io/jclaveau/…:sha-\u003ccommit\u003e` tags also exist but are **build intermediates** — the consumer\n\u003e contract is Docker Hub `:latest` and the version-pinned tags above.\n\n## Security\n\n- Once every deps are installed you may not require sudo anymore. So sudo is disabled by default\n- add `-sudoer` to any image to get sudo back\n- For local `act --bind` use on untrusted code, prefer **rootless docker**\n\n\n## Gains\n\nSee [The last benchmarks](https://github.com/jclaveau/ci-prebuilds/actions/workflows/benchmark-playwright.yml).\n\n\n## Full control usage\n\n```yaml\njobs:\n  e2e-front:\n    name: ${{ matrix.mode }}\n    runs-on: ubuntu-latest\n    strategy:\n      fail-fast: false\n      matrix:\n        include: # Switch between ci environments to debug or save time\n          - mode: dood\n            image: jclaveau/ubuntu-dood-playwright-gyp:latest\n            options: --volume /var/run/docker.sock:/var/run/docker.sock\n          # - mode: dind\n          #   image: jclaveau/ubuntu-dind-playwright-gyp:latest\n          #   options: --privileged --env DOCKER_HOST=unix:///var/run/dind.sock\n          # - mode: vm\n          #   image: \"\"    # empty image → run on the host VM\n          #   options: \"\"\n    container:\n      image: ${{ matrix.image }}\n      options: ${{ matrix.options }}\n    steps:\n      - uses: jclaveau/ci-prebuilds/.github/actions/prepare@v0  # DOCKER_MODE/HOST_ADDRESS defaults + start-dockerd under dind\n      - uses: actions/checkout@v4\n\n      - if: env.DOCKER_MODE == 'vm'\n        uses: actions/setup-node@v4\n      - if: env.DOCKER_MODE == 'vm'\n        uses: pnpm/action-setup@v4\n        with:\n          run_install: false\n\n      - run: pnpm install --frozen-lockfile\n      - run: docker compose up -d --wait\n\n      - if: env.DOCKER_MODE == 'vm'\n        name: Install Playwright browsers (vm)\n        run: pnpm exec playwright install --with-deps\n\n      - run: pnpm exec playwright test\n```\n\nSee [the action](.github/actions/prepare/action.yml). Versioning:\n\n- `@v0` — moving tag, advanced manually on compatible action updates\n- `@v0.1.0` (immutable) or a commit SHA — full reproducibility\n- `@v1` will exist once the repo reaches v1\n\n\n## Roadmap\n\nSee [open issues](https://github.com/jclaveau/ci-prebuilds/issues).\n\n## License\n\nMIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjclaveau%2Fci-prebuilds","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjclaveau%2Fci-prebuilds","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjclaveau%2Fci-prebuilds/lists"}