konttipolitiikka päivitys
This commit is contained in:
@@ -32,6 +32,31 @@ Kun kontti on pushattu registryyn, se on muiden pipeline-jobien käytettävissä
|
||||
`latest`-tägillä — rebuild = käyttöönotto. Mitään versioviittauksia ei tarvitse
|
||||
päivittää.
|
||||
|
||||
## Offline-periaate (DoD)
|
||||
|
||||
CI-kontin **Definition of Done**:
|
||||
|
||||
> Kontti ei lataa mitään pipeline-vaiheessa (`workflow run` -stepit) eikä kontin
|
||||
> runtime-prosessissa (`container:` / `docker run`). Kaikki riippuvuudet
|
||||
> (kielikohtaiset paketit, työkalut, binäärit) on joko:
|
||||
> - Pre-cachattu kontin **build-vaiheessa** Dockerfilessä, TAI
|
||||
> - Kopioitu multi-stage buildilla toisesta imagesta (`COPY --from`)
|
||||
>
|
||||
> Ainoa sallittu lataushetki on `docker build`. Sen jälkeen kontti toimii
|
||||
> ilman verkkoyhteyttä.
|
||||
|
||||
**Miksi:** Toistettavuus, air gap -yhteensopivuus, nopeus. Pipeline ei saa
|
||||
epäonnistua sen takia että ulkoinen registry on alhaalla tai että `go mod download`
|
||||
joutuu latamaan 100 modulia jokaisella testiajolla.
|
||||
|
||||
**Kielikohtaiset pre-cachet:** Jos kontissa ajetaan kielikohtaista testiä
|
||||
(Go, Java, Node, Python, ...), kaikki kielikohtaiset riippuvuudet on
|
||||
pre-cachattava Dockerfilessä build-vaiheessa:
|
||||
- Go: `COPY go.mod go.sum ./` → `RUN go mod download`
|
||||
- Java/Maven: `COPY pom.xml ./` → `RUN mvn dependency:go-offline`
|
||||
- Node: `COPY package.json package-lock.json ./` → `RUN npm ci --omit=dev`
|
||||
- Python: `COPY requirements.txt ./` → `RUN pip wheel --wheel-dir=/wheels -r requirements.txt` → `COPY --from` käyttöön
|
||||
|
||||
## Nimeäminen
|
||||
|
||||
CI-kontin build-workflow noudattaa samaa nimeämiskonventiota kuin muutkin
|
||||
@@ -123,27 +148,44 @@ tag: latest
|
||||
|
||||
### Dockerfile
|
||||
|
||||
Dockerfile yhdistää tarvitut työkalut yhteen konttiin. Molemmat tavat kelpaavat:
|
||||
Dockerfile yhdistää tarvitut työkalut yhteen konttiin.
|
||||
**Kaikki riippuvuudet ladataan build-vaiheessa — kontti on täysin itseriittoinen.**
|
||||
|
||||
```dockerfile
|
||||
# Tapa A: COPY --from toisesta imagesta
|
||||
FROM __BASE_IMAGE__:__VERSION__
|
||||
COPY --from=__SOURCE_IMAGE__:__VERSION__ /path/to/binary /usr/local/bin/
|
||||
RUN apk add --no-cache __PAKETIT__ # Ei koskaan git:iä — kloonaus kuuluu pipelinelle
|
||||
RUN apk add --no-cache __PAKETIT__
|
||||
|
||||
# Tapa B: curl-lataus (normaali Dockerfilessa)
|
||||
# Tapa B: Build-vaiheen curl-lataus
|
||||
FROM __BASE_IMAGE__:__VERSION__
|
||||
RUN apk add --no-cache curl __PAKETIT__ && \
|
||||
curl -fsSL __URL__/__BINARY__.tar.gz | tar xz -C /usr/local/bin && \
|
||||
apk del curl
|
||||
|
||||
# Tapa C: Multi-stage + kielikohtainen pre-cache
|
||||
FROM __BASE_IMAGE__:__VERSION__ AS deps
|
||||
COPY go.mod go.sum ./
|
||||
RUN go mod download
|
||||
|
||||
FROM deps AS build
|
||||
COPY . .
|
||||
RUN go test -c -o /tmp/test.bin ./...
|
||||
|
||||
FROM __BASE_IMAGE__:__VERSION__
|
||||
COPY --from=deps /go/pkg/mod /go/pkg/mod
|
||||
COPY --from=build /tmp/test.bin /usr/local/bin/test
|
||||
```
|
||||
|
||||
`COPY --from` on kevyempi (ei curl-asennusta). `curl` on selkeämpi kun binääri
|
||||
tulee suoraan GitHub Releasesista tai vastaavasta.
|
||||
`COPY --from` on kevyempi (ei curl-asennusta). `curl` (Tapa B) on sallittu
|
||||
vain build-vaiheessa — `apk del curl` poistaa työkalun ennen runtimea.
|
||||
Tapa C pre-cacheaa kielikohtaiset riippuvuudet ja tuottaa täysin
|
||||
offline-runtime-kontin.
|
||||
|
||||
## Mitä EI kannata tehdä
|
||||
|
||||
- Älä lisää `workflow_call`-triggariä — CI-konttia ei koskaan buildata automaattisesti
|
||||
- Älä poista `<komponentti>.`-prefiksiä olemassaolevista tiedostoista — ne kuuluvat monorepo-nimeämiskonventioon
|
||||
- Älä sisällytä CI-konttiin mitään sovelluskoodia — vain työkalut
|
||||
- Älä koskaan asenna `git`:iä CI-konttiin — repon kloonaus ja checkout ovat Gitea Actionsin natiiveja operaatioita, eivät kontin vastuulla. Git paisuttaa konttia turhaan ja luo harhan että kontti hallitsee repoa
|
||||
- Älä koskaan lataa mitään pipeline- tai runtime-vaiheessa — kaikki lataukset kuuluvat `docker build` -vaiheeseen (Offline-periaate)
|
||||
- Älä jätä kielikohtaisia riippuvuuksia pre-cachaamatta — `go mod download`, `npm install`, `mvn dependency:go-offline` jne. ajetaan Dockerfilessä, ei pipelinessä
|
||||
|
||||
Reference in New Issue
Block a user