Я использую свой CI / CD на Gitlab-CI (на gitlab.com). Я знаю, как кэшировать результаты одного этапа, чтобы повторно использовать их на другом этапе.
Однако я не знаю, как кэшировать мои изображения зданий, чтобы предотвратить их загрузку из GCR.io каждый раз, когда я запускаю сборка. Это занимает много времени и довольно неэффективно.
Итак, ниже представлен упрощенный конвейер, чтобы выделить мою проблему.
- В основном я разрабатываю с помощью Node, поэтому я использую свой линтер в образе
node:lts
. - Я развертываю в GKE, и мне нужно запустить несколько специальных тестов c на образе
cloud-sdk
(с инструментами, недоступными для node:lts
) - Я строю Docker контейнеров. Я использую для этого
docker:dind
. - Наконец, я развертываюсь на
GKE
, поэтому мне нужно еще раз запустить cloud-sdk
со всеми инструментами и настройками для подключения к GKE
.
Итак, я вытягиваю в два раза больше cloud-sdk
изображений на каждом конвейере, но что более важно, я вытягиваю 3 разных изображения на каждом конвейере. Всегда одни и те же 3 штуки. Тот же sha1. Если бы я мог кэшировать локально (Gitlab Registry? Specifi c Gitlab cache? ...?) Это бы ускорило процесс и уменьшило потребление полосы пропускания, ...
Знаете ли вы какое-нибудь решение для этого?
variables:
NODE_ENV: "development"
GCP_PROJECT_ID: my-little-project
IMAGE_NAME: simin-api
stages:
- test
- publish
- deploy
cache:
key: ${CI_COMMIT_REF_SLUG}
paths:
- node_modules/
test_requirement:
image: gcr.io/google.com/cloudsdktool/cloud-sdk:291.0.0
stage: test
script:
# Authenticate with GKE
- echo "Authentication..."
# Straight forward testing
- ./run-all-tests.sh
environment:
name: dev
lint:
image: node:lts-alpine # Use commit sha instead. Named version here for the sake of reading
stage: test
script:
- npm install lint
- npm run lint
publish-image:
tags:
- docker
- gce
stage: publish
image: docker:19.03.5-dind # Use commit sha instead. Named version here for the sake of reading
services:
- docker:19.03.5-dind
variables:
DOCKER_DRIVER: overlay2
script:
# Do cool stuffs
- echo "Prepare for Docker login..."
- docker login -u _json_key --password-stdin https://gcr.io < ${HOME}/gcloud-service-key.json
# Build image
- docker build -t $IMAGE_NAME .
# Optionally tag the image with the commit short-sha or the tag name
- export IMAGE_VERSION=$([ -z $CI_COMMIT_TAG ] && echo $CI_COMMIT_SHA | cut -c1-8 || echo $CI_COMMIT_TAG)
- echo "Tagging and pushing gcr.io/$GCP_PROJECT_ID/$IMAGE_NAME:$IMAGE_VERSION"
- docker tag $IMAGE_NAME gcr.io/$GCP_PROJECT_ID/$IMAGE_NAME:$IMAGE_VERSION
- docker tag $IMAGE_NAME gcr.io/$GCP_PROJECT_ID/$IMAGE_NAME:latest
- docker push gcr.io/$GCP_PROJECT_ID/$IMAGE_NAME:$IMAGE_VERSION
- docker push gcr.io/$GCP_PROJECT_ID/$IMAGE_NAME:latest
only:
- master
- tags
deploy:
tags:
- docker
- gce
image: gcr.io/google.com/cloudsdktool/cloud-sdk:291.0.0
stage: deploy
script:
# Authenticate with GKE
- echo "Authentication..."
# Set commit tag to use in the deploy.yaml
- export IMAGE_VERSION=$([ -z $CI_COMMIT_TAG ] && echo $CI_COMMIT_SHA | cut -c1-8 || echo $CI_COMMIT_TAG)
# Set commit tag to use in the deploy.yaml
- sed -i "s/TAG_TO_BE_CHANGED/$IMAGE_VERSION/g" kubernetes/deploy.yaml
# Do the deployment
- echo "Deploying image gcr.io/my-little-project/simin-api:$IMAGE_VERSION"
- kubectl apply -f kubernetes/deploy.yaml
environment:
name: dev
# Only run builds for these refs
only:
- master
- tags
Ура,
Оливье