Невозможно создать конвейер CI, используя «только / кроме: изменения» - PullRequest
2 голосов
/ 17 марта 2020

У меня есть следующая git структура репо:

.
├── docker
│   ├── Dockerfile
│   └── requirements.txt
└── software
    ├── app
    │   └── app.py
    └── Dockerfile

Папка docker отвечает за создание docker образа, который будет использоваться моим приложением.

Затем, если я изменю какой-либо файл в папке docker, я бы хотел воссоздать base image, а затем создать новый app image, используя последний созданный base image.

Но если я только изменю свой app, в папке software, я хотел бы вызвать только сцену для образа приложения.

Ниже моего .gitlab-ci.yml файла:

image: docker:latest

services:
    - docker:dind

stages:
    - buildDockerImage
    - buildAppImage

build docker image:
    stage: buildDockerImage
    script:
        - docker login -u $CI_DEPLOY_USER -p $CI_DEPLOY_PASSWORD $CI_REGISTRY
        - docker build --target final --build-arg docker_image_version=$CI_COMMIT_SHORT_SHA -t $DOCKER_IMAGE_NAME docker
        - docker tag $DOCKER_IMAGE_NAME $CI_REGISTRY/xx/$APP_IMAGE_NAME:base
        - docker push $CI_REGISTRY/xx/$APP_IMAGE_NAME
    only:
        changes:
          - docker/**/*

build app image:
    stage: buildAppImage
    script:
        - docker login -u $CI_DEPLOY_USER -p $CI_DEPLOY_PASSWORD $CI_REGISTRY
        - docker build --build-arg app_image_version=$CI_COMMIT_SHORT_SHA -t $APP_IMAGE_NAME software
        - docker tag $APP_IMAGE_NAME $CI_REGISTRY/xx/$APP_IMAGE_NAME:$CI_COMMIT_SHORT_SHA
        - docker push $CI_REGISTRY/xx/$APP_IMAGE_NAME
    except:
        changes:
          - docker/**/*

only / except : changes работает нормально распознавать место изменения, но не создаю конвейер с обоими этапами, если я изменяю папку docker. Он создает только buildDockerImage.

. Если я удаляю конфигурацию only / except : changes, конвейер работает должным образом.

Можно ли добиться того, что мне нужно? Я имею в виду, я не хочу запускать buildDockerImage, если я только изменяю свое приложение, но если я действительно изменяю base image, мне нужно запустить оба buildDockerImage и buildAppImage в конвейере.

1 Ответ

0 голосов
/ 17 марта 2020

Так что, если я правильно понимаю, вы хотите:

  1. Сборка buildDockerImage только при изменении местоположения docker/**/*, так что ваш текущий yaml для этого этапа в порядке.
  2. Build buildAppImage

    • всегда, просто удалить за исключением пункта из buildAppImage stage,

    • только для изменения в docker местоположениях, замените, кроме как только на 2 местоположения:

      only:
        changes:
          - docker/**/*
          - software/**/*
...