Поскольку ваш вопрос очень общий, я отвечу на него примером.
Рассмотрим воображаемый проект C ++, который содержит код, Makefile , который создает исполняемое приложение "app"и этот Dockerfile:
FROM ubuntu:16.04
ADD ./app /app
CMD ["/app"]
Чтобы построить приложение и образ докера, как вы сказали, вы можете использовать конфигурацию GitLab CI, например:
stages:
- test
- build
- docker
test:
stage: test
script:
- make test
build:
stage: build
script:
- make
artifacts:
paths:
- ./app
docker:
stage: docker
dependencies:
- build
script:
- docker build -t your-repo/image-name:latest .
- docker push your-repo/image-name:latest
Объяснение
Этот файл CI создает три задания: " test ", " build " и " docker ".«test» запускает «make test» для выполнения любых воображаемых тестов, которые может иметь наша кодовая база.Если это удастся, исполнитель GitLab выполнит следующее задание, «build».
«build» создает приложение, вызывая «make».Мы ожидаем, что make создаст файл "app" в текущем каталоге, который является нашим скомпилированным приложением, которое будет работать в контейнере.В разделе «Артефакты» указано, что мы хотим сохранить этот результирующий файл, поскольку он нам нужен для следующего задания.
В следующем задании «Докер» есть раздел «Зависимости»;в этом разделе мы утверждаем, что эта работа зависит от вывода задания под названием «сборка», которое ранее создавало наш файл «приложение».Затем мы сначала создаем образ докера, используя docker build и проталкиваем его как обычно.
Как уже было сказано, это всего лишь примеры, особенно сценарий разделы будут сильно различаться в зависимости от ваших проектов и конфигурации вашего бегуна.См. официальную документацию CI для всех возможностей.