Образ сборки кэша Gitlab-CI для других итераций конвейера - PullRequest
0 голосов
/ 09 июля 2020

Я использую свой CI / CD на Gitlab-CI (на gitlab.com). Я знаю, как кэшировать результаты одного этапа, чтобы повторно использовать их на другом этапе.

Однако я не знаю, как кэшировать мои изображения зданий, чтобы предотвратить их загрузку из GCR.io каждый раз, когда я запускаю сборка. Это занимает много времени и довольно неэффективно.

Итак, ниже представлен упрощенный конвейер, чтобы выделить мою проблему.

  1. В основном я разрабатываю с помощью Node, поэтому я использую свой линтер в образе node:lts.
  2. Я развертываю в GKE, и мне нужно запустить несколько специальных тестов c на образе cloud-sdk (с инструментами, недоступными для node:lts)
  3. Я строю Docker контейнеров. Я использую для этого docker:dind.
  4. Наконец, я развертываюсь на 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

Ура,

Оливье

...