Итак, мы используем 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
и выполните все шаги в правильном порядке, ожидая предыдущих шагов.