Как условно обновить образ задания CI / CD? - PullRequest
1 голос
/ 16 апреля 2019

Я только что попал в (замечательный) мир CI / CD и у меня есть работающие конвейеры.Хотя они не оптимальны.

Приложение представляет собой веб-сайт с поддержкой Docker:

  • источник должен быть скомпилирован с помощью webpack и в конечном итоге dist
  • в этом dist каталогекопируется в Docker-контейнер
  • , который затем удаленно создается и развертывается

Моя текущая настройка довольно наивна (я добавил несколько комментариев, чтобы показать, почему я считаю, что необходимы различные элементы /полезно):

# I start with a small image
image: alpine

# before the job I need to have npm and docker
# the problem: I need one in one job, and the second one in the other
# I do not need both on both jobs but do not see how to split them
before_script:
    - apk add --update npm
    - apk add docker
    - npm install
    - npm install webpack -g

stages:
    - create_dist
    - build_container
    - stop_container
    - deploy_container

# the dist directory is preserved for the other job which will make use of it
create_dist:
    stage: create_dist
    script: npm run build
    artifacts:
        paths:
        - dist

# the following three jobs are remote and need to be daisy chained
build_container:
    stage: build_container
    script: docker -H tcp://eu13:51515 build -t widgets-sentinels .

stop_container:
    stage: stop_container
    script: docker -H tcp://eu13:51515 stop widgets-sentinels
    allow_failure: true

deploy_container:
    stage: deploy_container
    script: docker -H tcp://eu13:51515 run --rm -p 8880:8888 --name widgets-sentinels -d widgets-sentinels

Эта установка работает, биты npm и docker установлены в обоих заданиях.Это не нужно и замедляет развертывание. Есть ли способ заявить, что такие-то и такие-то пакеты нужно добавлять для определенных заданий (а не глобально для всех)?

Чтобы было понятно: это не шоустопор (и в действительности это вряд ли будет проблемой), но я боюсь, что мой подход к такой автоматизации работы неверен.

Ответы [ 3 ]

1 голос
/ 18 апреля 2019

Вам не обязательно использовать одно и то же изображение для всех заданий.Позвольте мне показать вам один из наших конвейеров (частично), который делает похожую вещь, просто с composer для php вместо npm:

cache:
  paths:
    - vendor/

build:composer:
  image: registry.example.com/base-images/php-composer:latest # use our custom base image where only composer is installed on to build the dependencies)
  stage: build dependencies
  script:
    - php composer.phar install --no-scripts
  artifacts:
    paths:
      - vendor/
  only:
    changes:
      - composer.{json,lock,phar}  # build vendor folder only, when relevant files change, otherwise use cached folder form s3 bucket (configured in runner config)

build:api:
  image: docker:18  # use docker image to build the actual application image
  stage: build api
  dependencies:
    - build:composer # reference dependency dir
  script:
    - docker login -u gitlab-ci-token -p "$CI_BUILD_TOKEN" "$CI_REGISTRY"
    - docker build -t $CI_REGISTRY_IMAGE:latest.
    - docker push $CI_REGISTRY_IMAGE:latest

Базовый образ composer содержит все необходимые пакеты для запуска composerТаким образом, в вашем случае вы бы создали базовое изображение для npm:

FROM alpine:latest 

RUN apk add --update npm

Затем используйте это изображение на этапе create_dist и используйте image: docker:latest в качестве изображения на других этапах.

1 голос
/ 18 апреля 2019

Помимо ссылок на разные изображения для разных заданий, вы также можете попробовать привязки gitlab, которые предоставляют многократно используемые шаблоны для заданий:

.install-npm-template: &npm-template
  before_script:
  - apk add --update npm
  - npm install
  - npm install webpack -g

.install-docker-template: &docker-template
  before_script:
  - apk add docker

create_dist:
    <<: *npm-template
    stage: create_dist
    script: npm run build
...

deploy_container:
    <<: *docker-template
    stage: deploy_container
...

0 голосов
/ 16 апреля 2019

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

...