Docker Создайте как конвейер CI - PullRequest
2 голосов
/ 05 апреля 2019

Итак, мы используем Gitlab CI. Проблема заключалась в том, что каждый раз, когда мы хотим тестировать, нужно ли выполнять фиксацию, правильно ли настроен наш конвейер сборки. К сожалению, нет способа легко протестировать Gitlab CI локально, когда наши контейнеры / конвейеры работают неправильно.

Наше решение, используйте docker-compose.yml в качестве CI-конвейера для локального тестирования этапов сборки в контейнерах, почему бы вам не знать. , , ? По сути, Gitlab CI и большинство других имеют каждый раздел, порождающий контейнер для запуска команды, и не будет продолжаться до тех пор, пока не завершатся предыдущие шаги, то есть первый шаг должен полностью завершиться, а затем произойдет следующий шаг.

Вот простой .gitlab-ci.yml файл, который мы используем:

stages:
  - install
  - test

cache:
  untracked: true
  key: "$CI_COMMIT_REF_SLUG"
  paths:
    - node_modules/

install:
  image: node:10.15.3
  stage: install
  script: npm install

test:
  image: node:10.15.3
  stage: test
  script: 
    - npm run test
  dependencies:
    - install

Вот файл docker-compose.yml, в который мы его преобразовали:

version: "3.7"
services:
  install:
    image: node:10.15.3
    working_dir: /home/node
    user: node
    entrypoint: npm
    command:
      - install
    volumes:
      - .:/home/node:Z
  test:
    image: node:10.15.3
    working_dir: /home/node
    user: node
    entrypoint: npm
    command:
      - run
      - test
    volumes:
      - .:/home/node:Z
    depends_on:
      - install

Хорошо, теперь для реальной проблемы здесь. Часть depends_on файла compose не ожидает окончания работы контейнера install, она просто ожидает выполнения команды npm. Поэтому, как только команда npm будет официально загружена и запущена, контейнер test начнет работать и пожалуется, что node_modules пока нет. Это происходит из-за того, что npm запущен, не означает, что команда npm действительно завершена.

Кто-нибудь знает любые приемы, чтобы лучше контролировать то, что докер считает done. Во всех решениях, которые я изучал, использовался какой-то скрипт-обертка, который наблюдал, как какой-то порт во внутренней докерной сети ждал, когда служба, такая как db, будет полностью включена и готова.

При использовании k8s я могу настроить датчик готовности, который является супер допингом, хотя, похоже, не является особенностью Docker Compose. Я здесь не прав? Было бы неплохо просто написать команду, которую использует docker, чтобы определить, что означает done.

На данный момент мы должны запустить каждый шаг вручную, а затем выполнить следующий, когда предыдущий шаг завершен, например:

docker-compose up install

подождите ....

docker-compose up test

Мы действительно просто хотим сказать:

docker-compose up

и выполните все шаги в правильном порядке, ожидая предыдущих шагов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...