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:
- Kirjoita Dockerfile cachetettavaan muotoon
- Käytä Docker-repositoriotasi CI-cachena
- 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