B
3.4.2024
Jaakko Hannikainen

Pikavinkki - näin puolitat CI-putkesi ajoajan

Käytätkö Dockeria CI-putkessa? Muista cachettaa Dockerin kääntämät imaget.
Tässä on esimerkki AWS:n CodePipelinelle ja ECR:lle, mutta suunnilleen samat
muutokset voi tehdä putkelle kuin putkelle. Kyseessä on helppo kolmivaiheinen
prosessi:

  1. Kirjoita Dockerfile cachetettavaan muotoon
  2. Käytä Docker-repositoriotasi CI-cachena
  3. Olet valmis; hae kunniaa työkavereiltasi

## 1) Kirjoita Dockerfile cachetettavaan muotoon

Jos Dockerfilesi näyttää tältä:

COPY * ./
RUN npm install && npm build && npm test

kirjoita se uudelleen näin:

# olennainen: npm install (tai vastaava "hae ja käännä dependenssit")...
COPY package.json package-lock.json ./
RUN npm install

# ...ennen muiden tiedostojen kopiointia
COPY src ./src
RUN npm build
RUN npm test

Voit testata omalla koneella toimivuutta ensin kääntämällä imagen, muuttamalla jotain lähdekoodin tiedostoa ja kääntämällä imagen uudelleen. Jos Dockerin logeissa näkyy teksti ‘—> Using cache’ ’npm install’ -vaiheen jälkeen, Dockerfile toimii oikein.

## 2) Käytä Docker-repositoriotasi CI-cachena

Tämä esimerkki käyttää AWS:ää ja ECR:ää. Muuta tarpeen mukaan.

Jos CI-putkesi näyttää tältä:

pre_build:
  commands:
    $(aws ecr get-login --no-include-email --region $AWS_DEFAULT_REGION)
build:
  commands:
    docker build -f Dockerfile \
        --target $ECR_TARGET_REPOSITORY_URI:latest .
post_build:
  commands:
    docker push $ECR_TARGET_REPOSITORY_URI:latest

muuta tämä ensin hakemaan image ECR:stä, ja käyttämään sitä uuden imagen pohjana:

pre_build:
  commands:
    $(aws ecr get-login --no-include-email --region $AWS_DEFAULT_REGION)
    docker pull $ECR_TARGET_REPOSITORY_URI:latest # <- Muutettu rivi nro 1
build:
  commands:
    docker build -f Dockerfile \
        --cache-from $ECR_TARGET_REPOSITORY_URI:latest \ # <- Muutettu rivi nro 2
        --target $ECR_TARGET_REPOSITORY_URI:latest . # <- Tämän tagin pitää olla sama kuin pull/push
post_build:
  commands:
    docker push $ECR_TARGET_REPOSITORY_URI:latest # <- Tämän tagin pitää myös olla sama

3) Olet valmis; hae kunniaa työkavereiltasi

Omassa asiakasprojektissani tämä nopeutti CI-putkeamme 20 minuutista 10 minuuttiin. Riippuen siitä, onko teillä yhtä paljon dependenssejä projektissa, tämä saattaa nopeuttaa tai olla nopeuttamatta yhtä paljon.

PS. jos teillä on multi-stage build, kääntäkää joka image erikseen:

docker pull $REPO::builder || true
docker pull $REPO::app || true
...
docker build -f Dockerfile \
    --target build \
    --cache-from $REPO:builder \
    -t $REPO:builder
docker build -f Dockerfile \
    --target app \
    --cache-from $REPO:builder \
    --cache-from $REPO:app \
    -t $REPO:app \
    -t $REPO:latest
docker push $REPO:builder
docker push $REPO:app
docker push $REPO:latest
Bytecraft
Sähköposti hello@bytecraft.fi
Sijainti Opastinsilta 8 B, 00520 Helsinki