Hostet runner-image
Workflower som bruker runs-on: fremforge, kjører på en flyktig VM, én per commit, som klargjøres fra det hostede runner-imaget. Det er laget for å være på nivå med ubuntu-latest: den samme actions/setup-*-opplevelsen som du bruker på GitHub Actions, de samme ferdigbakte verktøykjedene, de samme skannerne, pluss innebygd Docker for containerbygg.
Arkitektur i to lag
Runner-imaget er oppstartsdisken til VM-en – begge lagene ligger på samme disk og er til stede fra det øyeblikket VM-en starter, uten nedlasting per jobb.
| Lag | Hva det inneholder | Størrelse |
|---|---|---|
| Systemlaget | debian 13 som base + systemverktøy i én versjon (Node 24 LTS, byggeverktøy, skannere, IaC- og sky-CLI-er, nettlesere, databaseklienter, innebygd Docker-daemon) | ~300 MB |
| hostedtoolcache-laget | Språkkjøremiljøer i flere versjoner (Node, Go, Python, .NET, Java, Ruby) + Android SDK + Miniconda3 + R | ~7 GB |
setup-*-actions slås opp i hostedtoolcache uten nedlasting per jobb. RUNNER_TOOL_CACHE og AGENT_TOOLSDIRECTORY peker allerede på /opt/hostedtoolcache.
Versjonsnumrene i tabellene nedenfor viser hvilke major-/minor-linjer som er bakt inn. De nøyaktige versjonene oppdateres fortløpende av den ukentlige gjenoppbyggingen og publiseres automatisk for hver gjenoppbygging – se endringsloggen for gjeldende publiserte verktøysett.
Språk – system
Én nyere versjon på PATH. Bruk disse direkte når workflowen klarer seg med systemstandarden.
| Språk | Versjon | Merknader |
|---|---|---|
| Node.js | 24.x (LTS) | + npm, pluss pnpm + yarn via corepack. Nyere/eldre serier via actions/setup-node – se nedenfor |
| Rust | rustup stable | rustc + cargo |
| PowerShell | 7.x | pwsh |
| PHP | 8.3 | + Composer |
Språk – flere versjoner via setup-*-actions
Bruk disse actions/setup-*-actionene akkurat som på GitHub-hostede runnere. Versjonen du ber om, slås opp i hostedtoolcache (ingen henting over nettet).
| Action | Innbakte versjoner | Hva den setter opp |
|---|---|---|
actions/setup-node@v4 | 26.x, 24.x, 22.x | Node.js + npm; aktiver pnpm/yarn med corepack enable |
actions/setup-go@v5 | 1.27.x, 1.26.x | Go-verktøykjede + modulbuffer |
actions/setup-python@v5 | 3.14, 3.13, 3.12 | Python + pip |
actions/setup-dotnet@v4 | 10.0, 8.0 | .NET SDK (side om side, DOTNET_ROOT satt) |
actions/setup-java@v4 | Temurin 25, 21, 17 | OpenJDK fra Adoptium |
ruby/setup-ruby@v1 | 4.0.x, 3.4.x, 3.3.x | Ruby (ruby-builder) |
Trenger du en versjon vi ikke baker inn (f.eks. Node 20.x for et eldre prosjekt), kan actions/setup-node, actions/setup-go, actions/setup-java og actions/setup-dotnet laste ned en versjon som ikke er bakt inn, når jobben kjører (tregere, men det virker – de henter generiske Linux-bygg). actions/setup-python og ruby/setup-ruby kan ikke det: upstream publiserer ingen debian-filer for noen av dem, så en serie som ikke er bakt inn, feiler rett ut i stedet for å falle tilbake. Velg en innbakt serie, eller bruk uv python install <version> (uv er bakt inn) eller en container:-jobb for et engangstilfelle.
Byggeverktøy
Native node-moduler, Python-wheels med C-utvidelser, Go med cgo og Rust-crates med C-avhengigheter bygger rett ut av boksen.
build-essential (gcc + make) · clang + lld · cmake · ninja · pkg-config · autoconf · automake · libtool · zstd · linux-headers (via basen)
Pakkebehandlere og prosjektverktøy
| Pakkebehandler | Versjon | Merknader |
|---|---|---|
npm | følger med Node 24 | |
pnpm | 12.14.0 som standard | Via corepack, som allerede er slått på. En packageManager-pin i prosjektet vinner; se pnpm- og Yarn-versjoner |
yarn | 4.18.1 som standard | Via corepack, som allerede er slått på. Pin yarn@1.22.22 for Yarn Classic; se pnpm- og Yarn-versjoner |
pipx | debian | Installerer Python-CLI-verktøy i isolerte venv-er |
composer | nyeste | PHP |
cargo | administrert av rustup | Rust |
mvn (Maven) | 3.9.x | JVM |
gradle | 9.5.x | JVM |
pnpm- og Yarn-versjoner
pnpm og yarn kjører via corepack, som er slått på på runneren. Hvilken versjon en jobb får, avhenger av om prosjektet har pinnet en:
- Ingen pin: jobben får pnpm 12.14.0 og Yarn 4.18.1. Begge ligger på runneren, så det trengs ingen nedlasting. Fram til 2026-10-21 fikk en jobb uten pin det som var npms
latestda jobben kjørte, og for Yarn var det Yarn Classic 1.22. - Pinnet: sett
packageManageripackage.json, for eksempel"packageManager": "pnpm@11.28.6"eller"packageManager": "yarn@1.22.22", så kjørercorepacknøyaktig den versjonen. pnpm 12.14.0 og 11.28.6 ligger allerede på runneren; alle andre versjoner lastes ned når jobben starter.
Det er ved å pinne packageManager at du velger. Det holder også den lokale maskinen din og CI på samme versjon. Når vi flytter standardene til en nyere utgivelse, kunngjøres endringen i endringsloggen.
IaC
| Verktøy | Merknader |
|---|---|
tofu (OpenTofu) | MPL-2.0-lisensiert direkte erstatning for Terraform. Ekte Terraform er BUSL-lisensiert og ikke bakt inn; bruk hashicorp/setup-terraform hvis du trenger nettopp Terraform. |
bicep | Azure |
pulumi | På tvers av skyer |
ansible (ansible-core) | Via pipx |
sam (AWS SAM CLI) | Serverless |
Sky-CLI-er
| Sky | CLI | Merknader |
|---|---|---|
| AWS | aws v2, sam | |
| Google Cloud | gcloud, gsutil, bq | |
| Azure | az | |
| T Cloud Public (OTC) | tofu + opentelekomcloud-provider | Eller pip install otc-cli per jobb |
Containere og Kubernetes
| Verktøy | Merknader |
|---|---|
docker (CLI + innebygd daemon) | Docker kjører direkte på VM-en (ingen sidecar, ingen omvei via DOCKER_HOST) – se Containerbygg nedenfor |
kaniko | OCI-imagebygger uten daemon og uten root |
skopeo | Kopiering / inspeksjon av imager mellom registre |
kubectl | |
helm | |
kustomize | |
kind | Lokale k8s-klynger – fungerer med den innebygde Docker-daemonen i de fleste tilfeller; legg til etiketten dind-privileged hvis du støter på operasjoner som krever utvidede rettigheter (KVM-nesting, rå /dev for nestede gjester) |
tea | CLI for Forgejo / Gitea |
Sikkerhet og forsyningskjede
Ferdig bakt inn, slik at skanning etter secrets, CVE-er, SBOM og SAST ikke legger til oppsettstid.
| Skanner | Fanger |
|---|---|
gitleaks | Secrets i commits |
trivy | CVE-er i OS og språk + feilkonfigurasjon i IaC |
osv-scanner | Sårbarheter fra OSV-databasen |
cosign | Signering og verifisering av containerimager |
syft | Generering av SBOM (CycloneDX / SPDX) |
opengrep | SAST (Semgrep-kompatibel fork). Ferdig bakt inn med språkmappene fra GitLab sast-rules under /opt/sast-rules/: csharp, go, java, javascript, python og scala. Reglene er MIT, bortsett fra go, som er Apache-2.0 (avledet fra gosec). Bare disse mappene følger med. Send de du trenger, til --config; roten av /opt/sast-rules er ikke et regelsett |
scorecard | OSSF-scorecard for forsyningskjeden |
checkov | IaC-sikkerhet (Terraform, CFN, k8s) |
cfn-lint | Lint for CloudFormation |
Lintere
shellcheck · shfmt · yamllint · actionlint (linter Forgejo Actions-workflowene du skriver på frem.sh) · hadolint (Dockerfile)
Nettlesere og e2e
For hodeløse nettlesertester:
- Chromium +
chromedriver(debian-pakket, matchende versjoner) - Firefox ESR +
geckodriver - Selenium Server (jar på
/opt/selenium-server.jar)
Microsoft Edge er ikke bakt inn – Chromium bruker den samme Blink-motoren; til testing i CI er Chromium likeverdig.
Databaseklienter
postgresql-client · default-mysql-client · sqlite3. De fullstendige databaseserverne kommer via services:-blokker (en Docker-pull fra Docker Hub, gjennom organisasjonens avhengighetsproxy når den har sin egen Docker Hub-legitimasjon; se Docker Hub-imager).
Mobil og datavitenskap (bakt inn siden 2026-06-06)
| Verktøy | Hva som er forhåndsinstallert | Legg til per jobb |
|---|---|---|
| Android SDK | cmdline-tools (latest) + platforms;android-34 + build-tools;34.0.0 + platform-tools på ANDROID_HOME=/usr/local/lib/android/sdk | Flere API-nivåer / NDK / emulatorer via android-actions/setup-android@v3 (gjenbruker det som er forhåndsinstallert, ingen ny nedlasting) |
| R (CRAN) | r-base + r-base-dev (debian CRAN-repo, for tiden 4.3.x) på /opt/hostedtoolcache/R/4.3/x64 | CRAN-pakker via Rscript -e 'install.packages(...)' eller r-lib/actions/setup-r-dependencies@v2 |
| Miniconda3 | conda + python 3.11 på CONDA=/opt/hostedtoolcache/Miniconda3/latest/x64 | Miljøer og vitenskapelig stack via conda-incubator/setup-miniconda@v3 med environment-file: |
# Android example
- uses: android-actions/setup-android@v3
- run: ./gradlew assembleDebug
# R example
- uses: r-lib/actions/setup-r@v2
- uses: r-lib/actions/setup-r-dependencies@v2
- run: Rscript -e 'testthat::test_local()'
# Miniconda example
- uses: conda-incubator/setup-miniconda@v3
with:
environment-file: env.yml
- shell: bash -el {0}
run: pytestHva som fortsatt IKKE er bakt inn
Virkelig smale eller tunge verktøy som de fleste workflower ikke trenger. Installer dem per jobb:
| Verktøy | Installasjon | Merknader |
|---|---|---|
| iOS / Xcode | Bare macOS – støttes ikke (fremforge-runnere er Linux) | Eget punkt på veikartet for runner-nivåer |
| Julia | julia-actions/setup-julia@v2 | ~150 MB installasjon per jobb |
| Swift | swift-actions/setup-swift@v2 | Swift-verktøykjede for Linux |
| Haskell / GHC | haskell-actions/setup@v2 | |
| Mono | apt-get install mono-complete | Bare eldre .NET Framework – .NET 8/10 er bakt inn |
| Nettleseren Microsoft Edge | Trengs ikke – Chromium er samme motor | |
| Lua / Crystal / Nim / Elixir | setup-*-action eller apt per jobb |
Containerbygg
Innebygd Docker (standard)
VM-en leveres med Docker-daemonen installert og kjørende på verten. docker-CLI-en snakker med den over den vanlige lokale socketen – ingen Docker-in-Docker, ingen sidecar, ingen omvei via DOCKER_HOST. De fleste workflower for GitHub-hostede runnere virker uendret – docker build, docker compose, docker pull, flertrinnsbygg, BuildKit-funksjoner.
- run: docker build -t myapp:${{ github.sha }} .
- run: docker compose up -d
- run: docker pull postgres:16kaniko
For rene imagebygg er kaniko uten daemon (raskere kaldstart når du ikke trenger hele Docker-daemonen) og har bedre oppførsel for lagbuffer mot eksterne registre.
- run: |
/usr/local/bin/kaniko \
--context=$GITHUB_WORKSPACE \
--dockerfile=Dockerfile \
--destination=registry.example.com/$GITHUB_REPOSITORY:$GITHUB_SHADocker med utvidede rettigheter (KVM-nesting)
Hvis arbeidslasten trenger ekstra capabilities utover det standard Docker-brukeren får (f.eks. kind med KVM-nesting, testcontainers-funksjoner som krever capabilities for å opprette navnerom, /dev-tilgang for nestede gjester), legger du etiketten til i runs-on:
jobs:
integration:
runs-on: [fremforge, dind-privileged]
steps:
- run: docker run --privileged kindest/node:v1.31.0 ...fremforge sender disse til en VM-variant med nestet virtualisering slått på, med den samme isolasjonen med én VM per commit som standardrunnerne.
Slik får vi plass til dekningen på ~7 GB når GitHub-hostede bruker ~50 GB
GitHub-hostede ubuntu-latest-imager er store fordi de baker inn:
- Flere versjoner per språk – vi baker inn de 3 nyeste støttede seriene for Node, Python, Java og Ruby, og 2 for Go og .NET (~3 GB totalt for alle 6 språkfamiliene). Tabellene over vedlikeholdes for hånd og oppgir serien, ikke patchen. For de nøyaktige patch-versjonene som er bakt inn nå – generert fra byggeargumentene til runner-imaget ved hver endring – se den genererte listen over verktøysettet. Hvis de to noen gang er uenige, er det den genererte listen som har rett. En serie som ikke er bakt inn, kan IKKE lastes ned per jobb for Python eller Ruby (se merknaden nedenfor), så velg blant de innbakte.
- Android SDK + NDK (~10 GB på GitHub-hostede) – vi baker inn kjerne-SDK-en (cmdline-tools + platform 34 + build-tools 34.0.0 + platform-tools, ~3 GB). Flere API-nivåer, NDK og systemimager for emulatoren installeres per jobb via
setup-android(gjenbruker det som er forhåndsinstallert). - Forhåndshentede Docker-imager for tjenestecontainere (postgres, mysql, mongo, redis, mssql ~5 GB) – ikke bakt inn. En
docker pullhenter dem fra Docker Hub eller gjennom organisasjonens avhengighetsproxy (se pakkebuffere). - Nettleseren Microsoft Edge – ikke bakt inn (Chromium er samme motor når det gjelder testing i CI).
- Mono / Julia / Swift / Haskell / Lua / Crystal / Nim / Elixir – ikke bakt inn (smalt, installer per jobb).
- Eldre GCC-versjoner, utfasede verktøykjeder – vi leverer ett gjeldende sett.
Dette mister du ikke sammenlignet med GitHub-hostede runnere for vanlige workflower:
- Alle vanlige språk (Node, Python, Go, Java, .NET, Ruby, Rust, PHP, PowerShell)
- Mobil (Android SDK) og datavitenskap (Miniconda + R), bakt inn siden 2026-06-06
- Alle store sky-CLI-er (AWS, Azure, GCP)
- Alle vanlige skannere (Trivy, Gitleaks, OSV, Cosign, Syft, OpenGrep, Scorecard, Checkov)
- Begge de store nettleserne + Selenium
- Docker (innebygd, med utvidede rettigheter via etikett)
- Alle standard GitHub Actions (
actions/checkout,actions/setup-*,actions/upload-artifactosv.)
Hvis teamet ditt trenger noe vi ikke baker inn, kontakt support – verktøy som Renovate følger, rulles inn i neste ukentlige gjenoppbygging.
Image-størrelse, kaldstart, gjenoppbyggingsfrekvens
- Ukentlig gjenoppbygging: hver mandag kl. 06:00 UTC. Renovate foreslår versjonsoppdateringer fortløpende; gjenoppbyggingen på mandag tar med alt som er merget den uken.
- Trivy-sperre ved bygging: HIGH- og CRITICAL-CVE-er får bygget til å feile. Vi leverer aldri et image med kjente, upatchede HIGH/CRITICAL-funn.
- Nedlastinger pinnet med sha256: hver binærfil som hentes under byggingen, verifiseres mot en pinnet sha256. Renovate oppdaterer versjonen og hashen i samme PR. Bygget feiler tydelig hvis hashen avviker, og det er sikkerhetsnettet for forsyningskjeden.
- Kaldstart for VM: ~25 s (ECS-klargjøring + oppstart fra innbakt image). VM-er i varm pool (forhåndsklargjort og ledige) korter ventetiden ned til ~5 s når poolen har kapasitet.
- Publisering av manifest: hver gjenoppbygging publiserer de faktiske verktøyversjonene, image-digesten, Trivy-sammendraget og CycloneDX-SBOM-en i endringsloggen.
Eksempel på workflow
En minimal workflow som «bruker alt»:
name: ci
on:
push:
branches: [main]
workflow_dispatch: {}
jobs:
build-test-scan:
runs-on: fremforge
permissions:
contents: read
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '24' # resolves from hostedtoolcache, ~1 s
- run: npm ci && npm test
- uses: actions/setup-python@v5
with:
python-version: '3.13'
- run: pip install -r requirements.txt && pytest
- name: SAST + secrets
run: |
gitleaks detect --no-banner --redact
# one --config per language folder; /opt/sast-rules itself is not a rule set
opengrep scan --config=/opt/sast-rules/python --config=/opt/sast-rules/javascript .
- name: SBOM
run: syft scan dir:. -o cyclonedx-json > sbom.json
- name: Container build
run: docker build -t myapp:${{ github.sha }} .Lisenser og tredjepartsmerknader
Imaget inneholder tredjepartsprogramvare under egne lisenser, blant annet opengrep (LGPL-2.1, med tilbud om kildekode), Node.js og SAST-reglene. Merknadene, krediteringen for data om sårbarhetsvarsler og hvor du får kildekoden, står på Tredjepartsmerknader for runner-imaget. Inne i en jobb ligger lisensfilene under /usr/share/licenses/ og /usr/share/doc/<package>/copyright.
Rapportere problemer med runner-imaget
Hvis et verktøy du forventet, ikke er tilgjengelig, eller du støter på et problem med VM-kjøretiden (ressursgrenser, nettverk, capabilities), kontakter du support@frem.sh. Vi svarer samme virkedag på regresjoner i de hostede runnerne.