- Create config-provider.yml (reusable workflow, conf→JSON) - Replace duplicated job env blocks with workflow env + fromJson - Move provider workflows to workflows/ directory - Move consumer scripts to .gitea/scripts/ - Move feature-env.conf to .gitea/workflows/ - Add bats-report.sh for TAP→HTML conversion - Update ci.yml with setup→needs→with pattern - Add ADR 0006 directory ownership - Document cross-job config propagation in ci-pipeline-practices.md - Remove config.yaml, scripts/load-config.sh unused
Gitea Actions CI -kirjasto
Reusable workflow -kirjasto Gitea Actionsille. Lisätietoja: docs/
Provider-binding — miten consumer löytää providerin
Consumer kutsuu provideria uses:-viittauksella. Ei discoveryä — polku kovakoodataan consumerin
ci.yml:ään. Gitea hakee workflow YAML:n samalta Gitea-palvelimelta annetusta reposta ja tagista.
Polun muodostus
{owner}/{repo}/.gitea/workflows/ci-engine.yml@{ref}
| Osa | Mistä | Esimerkki (homelab) |
|---|---|---|
owner |
Repopolun ensimmäinen osa — käyttäjänimi tai org | niko |
repo |
Repon nimi | gitea-ci-library |
| tiedosto | Providerin workflow | .gitea/workflows/ci-engine.yml |
@ref |
Tag tai branch provider-repossa | @v1 (tuotanto) |
Owner ei ole org-pakotettu. Homelabissa ei välttämättä ole organisaatiotasoa — silloin owner on
käyttäjänimi (niko/...), ei keksitty org/-prefiksi.
Polku löytyy repostasi:
git remote get-url origin
# → ssh://git@gitea.app.keskikuja.site:30009/niko/gitea-ci-library.git
# owner = niko, repo = gitea-ci-library
Consumerin ci.yml:
jobs:
call-engine:
uses: niko/gitea-ci-library/.gitea/workflows/ci-engine.yml@v1
secrets: inherit
Usea Gitea-palvelin
uses: resolvoi vain sen Gitea-instanssin repohakemistosta, jolla runner ajaa työn.
Toisella palvelimella oleva repo ei näy — cross-server-viittaus ei toimi.
Jokaisella Gitea-palvelimella, jossa mikropalvelut ajavat CI:tä, tämä kirjasto-repo pitää olla
läsnä samalla owner/repo-polulla:
Gitea A (kehitys) Gitea B (tuotanto/homelab 2)
niko/gitea-ci-library ←→ niko/gitea-ci-library (mirror tai push-mirror)
↑ ↑
consumer uses: consumer uses:
niko/gitea-ci-library/... niko/gitea-ci-library/...
Mirror pitää ci-engine.yml:n ja tagit (v1) saatavilla kulloisellakin palvelimella. Tämä korvaa
provider-repon checkout-hackit workflowissa — binding hoituu Gitean natiivilla uses:-mekanismilla.
Periaatteet: tmp/data-flow-design.md
Main-haaran suojaus
Jokaisessa tätä kirjastoa käyttävässä repossa main-haara suojataan — koodi päätyy sinne vain PR:n kautta:
Repository → Settings → Branches → Branch Protection → Add Rule
| Osio | Asetus | Arvo |
|---|---|---|
| Patterns | Protected Branch Name Pattern | main |
| Push | Disable Push | ✓ |
| Force Push | Disable Force Push | ✓ |
| Pull Request Approvals | Required approvals | 1 |
| Dismiss stale approvals | ✓ | |
| Ignore stale approvals | ✓ | |
| Enable Status Check | ✓ (kun CI on olemassa) | |
| Pull Request Merge | Block merge on rejected reviews | ✓ |
| Block merge on official review requests | ✓ | |
| Block merge if pull request is outdated | ✓ |
Merge-tyyli: Suositellaan squashia — koko PR yhtenä commitina main-haaraan. Muut tyypit disabloidaan:
Repository → Settings → Pull Requests → Merge Styles
| Asetus | Arvo |
|---|---|
| Default Merge Style | Squash |
| Merge Commit | ✗ (pois) |
| Rebase | ✗ (pois) |
Ilman disablointia käyttäjä voi valita merge-commitin PR:n merge-napista — squash-suositus jää pelkäksi suositukseksi.
Gitea Actions runner (K8s / Helm)
Act runner suorittaa Gitea Actions workflowt. IaC-lähde: alla oleva Helm-snippet on
klusterin totuus — muutokset vain snippetiin, sitten helm upgrade --install (ei käsin muokattuja
arvoja klusterissa).
Asennus Kubernetes-klusteriin Helm chartilla:
1. Rekisteröintitoken
Hae token Giteasta:
- Organization-taso: Org → Settings → Actions → Runners → Create new runner
- Globaali (site admin): Site Admin → Actions → Runners → Create new runner
2. Asenna runner
GITEA_URL="https://<gitea-server-url>"
GITEA_ACTIONS_TOKEN="<registration-token>"
GITEA_ACTIONS_NAMESPACE="gitea-actions"
helm repo add gitea https://dl.gitea.com/charts
helm repo update
kubectl create secret generic act-runner-token \
--from-literal=token="$GITEA_ACTIONS_TOKEN" \
--namespace "$GITEA_ACTIONS_NAMESPACE" \
--dry-run=client -o yaml | kubectl apply -f -
helm upgrade --install act-runner gitea/actions \
--set enabled=true \
--set giteaRootURL="$GITEA_URL" \
--set existingSecret=act-runner-token \
--set existingSecretKey=token \
--set statefulset.dind.tag=29.5.2-dind \
--set-string 'statefulset.runner.config=log:
level: info
cache:
enabled: false
container:
require_docker: true
docker_timeout: 300s' \
--namespace "$GITEA_ACTIONS_NAMESPACE" \
--create-namespace
path escapes from parent -bugi korjattiin Docker 29.5.2:ssa. Tämän teko aikana default on 29.5.1 — juuri tämän alle jäävä versio.
Oletus-lokitaso on debug — suositeltu info. Näkee jobien aloitukset ja valmistumiset ilman konttikerrosten purkua (Downloading/Extracting-spämmiä). debug on tarpeen vain vianselvityksessä.
Docker (DinD)
Helm chart deployaa DinD:n init-sidecarina (docker:dind samassa podissa).
require_docker: true kytkee jobit siihen — erillistä DinD-asennusta ei tarvita.
DinD-tag pinottu: 29.5.2-dind (ei chart-oletusta). Docker 29.5.1 aiheuttaa act-runnerissa
path escapes from parent -virheen job-kontin käynnistyksessä.
Maven/npm-ajot käyttävät vain workflow'n container:-imagea; DinD tarvitaan vasta Docker-buildissä.
3. Varmista
kubectl get pods -n gitea-actions
# → act-runner-runner-0 Running
kubectl exec -n gitea-actions act-runner-runner-0 -c dind -- docker version
# → Server Version: 29.5.2 (tai uudempi)
Gitean puolella runner ilmestyy Active-tilaan pienellä viiveellä:
Site Admin → Actions → Runners (tai Org → Settings → Actions → Runners)
# → act-runner-runner-0 Active ubuntu-latest
Tämän jälkeen .gitea/workflows/ci.yml triggeröityy automaattisesti pushista.
Tarkista ennen ensimmäistä ajoa: Provider-binding
(owner/repo, @ref pushattu, Repo → Settings → Actions enabled).
Lisätietoa runnerin toiminnasta, konteista ja DinD:stä: docs/runner.md
Muuta
| Muuttuja | Kuvaus |
|---|---|
giteaRootURL |
Gitea-palvelimen osoite (esim. https://gitea.example.com) |
existingSecret |
Kubernetes secretin nimi, jossa token |
existingSecretKey |
Avain secretin sisällä |
statefulset.dind.tag |
DinD-image tag (29.5.2-dind minimi) |
statefulset.runner.labels |
Mukautetut labelit |