Мои 2 цента (больше комментарий) для контролируемой сборки с использованием docker.
Для автоматического c слияния, я не знаю, потому что я был бы против, так как проверка кода не может быть заменена CI только ИМХО ...
Взгляните на https://github.com/Mizux/cmake-cpp
Введение
Я использую Makefile для оркестровки (команда docker может быть слишком длинный;)) и docker для изолированной сборки на различных дистрибутивах.
pro:
- Возможность локального тестирования (Просто нужен дистрибутив GNU / Linux с Docker & Make)
- Может легко мигрировать к различным провайдерам CI (Travis-CI, GitHub Workflow, gitlab-runner, bitbucket?)
- Участники могут тестировать локально перед отправкой PR
минусы:
- Менее связан с github -> более сложен в обслуживании.
- сложнее иметь кеш между рабочими процессами
примечание: Dockerfile хранится в репозитории в ci/docker
, т.е. я перестраиваю образы на первых шагах, но вы сможете заменить Это простой шаг docker load
, если ваше изображение находится на docker концентраторе (не проверено)
Настройка
Dockerfile
Я разбил свой Dockerfile на несколько этапов (в основном для отладки).
примечание: вы можете заменить ubuntu:rolling
своим собственным изображением ...
ci / docker / ubuntu / Dockerfile:
# Create a virtual environment with all tools installed
# ref: https://hub.docker.com/_/ubuntu
FROM ubuntu:rolling AS env
LABEL maintainer="mizux.dev@gmail.com"
# Install system build dependencies
# note: here we use the CMake package provided by Ubuntu
# see: https://repology.org/project/cmake/versions
ENV PATH=/usr/local/bin:$PATH
RUN apt-get update -q && \
apt-get install -yq git build-essential cmake && \
apt-get clean && \
rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
CMD [ "/bin/sh" ]
# Add the library src to our build env
FROM env AS devel
# Create lib directory
WORKDIR /home/lib
# Bundle lib source
COPY . .
# Build in an other stage
FROM devel AS build
# CMake configure
RUN cmake -H. -Bbuild
# CMake build
RUN cmake --build build --target all
# CMake install
RUN cmake --build build --target install
# Create an install image to check cmake install config
FROM env AS install
# Copy lib from build to install
COPY --from=build /usr/local /usr/local/
# Copy sample
WORKDIR /home/sample
COPY ci/sample .
Задания для бегунов
Для бегунов Github установлено docker.
Примечание: вы можете иметь один значок на файл yml. Например, вы можете использовать одно задание для каждого дистрибутива, например, чтобы иметь одно задание на один дистрибутив или один файл для Release
и один файл для Debug
...
.github / workflows / docker .yml :
name: C++ CI
on: [push, pull_request]
jobs:
build-docker:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Build env image
run: docker build --target=env --tag project:env -f ci/docker/ubuntu/Dockerfile .
- name: Build devel image
run: docker build --target=devel --tag project:devel -f ci/docker/ubuntu/Dockerfile .
- name: Build build image
run: docker build --target=build --tag project:build -f ci/docker/ubuntu/Dockerfile .
Для тестирования вы можете добавить другой этап или запустить его, используя project:build
изображение:
docker run --rm --init -t --name test project:build cmake --build build --target test
Приложения
Быстрая сборка
Вы можете добавить файл .dockerignore
для удаления ненужных файлов (например, ЛИЦЕНЗИИ, do c, локальный каталог сборки при локальном тестировании ...), чтобы уменьшить контекст docker и COPY . .
.dockerignore:
# Project Files unneeded by docker
ci/cache
ci/docker
ci/Makefile
.git
.gitignore
.github
.dockerignore
.travis.yml
.appveyor.yml
.clang-format
AUTHORS
CONTRIBUTING.md
CONTRIBUTHORS
INSTALL
LICENSE
README.md
doc
# Native CMake build
build/
# Editor directories and files
*.user
*.swp
Установка пользовательской версии CMake
Вы можете использовать следующее вместо apt install -y cmake
Может потребоваться время, так как вы перестраиваете CMake ...
# Install CMake 3.16.4
RUN wget "https://cmake.org/files/v3.16/cmake-3.16.4.tar.gz" \
&& tar xzf cmake-3.16.4.tar.gz \
&& rm cmake-3.16.4.tar.gz \
&& cd cmake-3.16.4 \
&& ./bootstrap --prefix=/usr/local/ \
&& make \
&& make install \
&& cd .. \
&& rm -rf cmake-3.16.4
, поэтому вы можете использовать предустановленную версию вместо:
# Install CMake 3.16.4
RUN wget "https://cmake.org/files/v3.16/cmake-3.16.4-Linux-x86_64.sh" \
&& chmod a+x cmake-3.16.4-Linux-x86_64.sh \
&& ./cmake-3.16.4-Linux-x86_64.sh --prefix=/usr/local/ --skip-license \
&& rm cmake-3.16.4-Linux-x86_64.sh