GitHub Непрерывная интеграция CMake / C ++ - PullRequest
0 голосов
/ 18 марта 2020

Я пытаюсь настроить CI для моего проекта cmake / c ++, размещенного в приватном репозитории на GitHub.

Проект зависит от множества сторонних библиотек, которые должны быть git клонированы и собраны. Последнее занимает некоторое время, поэтому я создал образ docker со всеми установленными зависимостями и разместил его на хабе docker. (В идеале я хотел бы, чтобы изображение docker было также приватным, но если это невозможно, я могу сделать его публичным c.)

Я хочу добиться следующего:

При получении запросов на ветку master к приложению автоматически создается контейнер docker (поскольку все зависимости есть), все модульные тесты (gtest) запускаются, и, если все в порядке, ветвь объединяется с master. .

В идеале я хотел бы увидеть журналы и статистику, сгенерированные gcovr / lcov.

ОС: Ubuntu 18.04

Интересно, это вообще возможно, поскольку я искал 2 дня без удачи и миллиарда возможных чтений.

1 Ответ

0 голосов
/ 19 марта 2020

Мои 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
...