1
0
Fork 0
mirror of https://git.rwth-aachen.de/acs/public/villas/node/ synced 2025-03-16 00:00:02 +01:00
VILLASnode/.gitlab-ci.yml

292 lines
8.4 KiB
YAML

variables:
GIT_STRATEGY: fetch
GIT_SUBMODULE_STRATEGY: recursive
DISTRO: fedora # standard distro
DOCKER_FILE: packaging/docker/Dockerfile.${DISTRO}
DOCKER_TAG: ${CI_COMMIT_REF_NAME}
DOCKER_IMAGE: registry.git.rwth-aachen.de/acs/public/villas/node
DOCKER_IMAGE_DEV: ${DOCKER_IMAGE}/dev-${DISTRO}
DOCKER_CLI_EXPERIMENTAL: enabled
MAKE_OPTS: "-j16"
stages:
- prepare
- build
- test
- packaging
- deploy
- latest
# Stage: prepare
##############################################################################
# Build docker image which is used to build & test VILLASnode
prepare:docker:
stage: prepare
image: docker:20.10
script:
- docker build ${DOCKER_OPTS}
--file ${DOCKER_FILE}
--tag ${DOCKER_IMAGE_DEV}:${DOCKER_TAG}
--target dev .
parallel:
matrix:
- DISTRO: [ ubuntu, debian, centos, rocky ]
- DISTRO: fedora
DOCKER_OPTS: --tag ${DOCKER_IMAGE}/dev:${CI_COMMIT_REF_NAME}
- DISTRO: fedora
DOCKER_FILE: packaging/docker/Dockerfile.fedora-minimal
DOCKER_IMAGE_DEV: ${DOCKER_IMAGE}/dev-fedora-minimal
tags:
- docker
# Stage: build
##############################################################################
build:source:
stage: build
image: ${DOCKER_IMAGE_DEV}:${DOCKER_TAG}
script:
- mkdir -p build && cd build
- cmake ${CMAKE_OPTS} ..
- make ${MAKE_OPTS}
artifacts:
expire_in: 1 week
paths:
- build/
variables:
CMAKE: cmake
parallel:
matrix:
- DISTRO: [ fedora, fedora-minimal, debian, centos, rocky, ubuntu ]
- DISTRO: fedora-minimal
CMAKE_OPTS: -DWITH_API=OFF
-DWITH_CLIENTS=OFF
-DWITH_CONFIG=OFF
-DWITH_DOC=OFF
-DWITH_FPGA=OFF
-DWITH_GRAPHVIZ=OFF
-DWITH_HOOKS=OFF
-DWITH_LUA=OFF
-DWITH_OPENMP=OFF
-DWITH_PLUGINS=OFF
-DWITH_SRC=OFF
-DWITH_TESTS=OFF
-DWITH_TOOLS=OFF
-DWITH_WEB=OFF
-DCMAKE_MODULE_PATH=/usr/local/lib64/cmake
-DCMAKE_PREFIX_PATH=/usr/local
tags:
- docker
# Stage: test
##############################################################################
test:flake8:
stage: test
script:
- flake8 python/
image: ${DOCKER_IMAGE_DEV}:${DOCKER_TAG}
tags:
- docker
needs:
- job: "build:source: [fedora]"
test:cppcheck:
stage: test
script:
- cppcheck -j $(nproc)
--max-configs=32
--error-exitcode=1
--quiet
--inline-suppr
--enable=warning,performance,portability,missingInclude
--std=c++11
--suppress=noValidConfiguration
-U '_MSC_VER;_WIN32;_M_ARM'
-U '_MSC_VER;_WIN32;_M_AMD64;_M_X64'
-U '_MSC_FULL_VER;_MSC_VER'
-U '_MSC_BUILD;_MSC_VER'
-I include
-I common/include
src/ lib/ tests/unit/ | tee cppcheck.log
image: ${DOCKER_IMAGE_DEV}:${DOCKER_TAG}
tags:
- docker
needs:
- job: "build:source: [fedora]"
artifacts:
when: on_failure
paths:
- cppcheck.log
expose_as: cppcheck
test:unit:
stage: test
image: ${DOCKER_IMAGE_DEV}:${DOCKER_TAG}
variables:
LD_PRELOAD: /usr/lib64/libSegFault.so
SEGFAULT_SIGNALS: all
script:
- mkdir -p build && cd build
- cmake ${CMAKE_OPTS} ..
- make ${MAKE_OPTS} run-unit-tests
tags:
- docker
needs:
- job: "build:source: [fedora]"
artifacts: true
test:integration:
stage: test
image: ${DOCKER_IMAGE_DEV}:${DOCKER_TAG}
script:
- mkdir -p build && cd build
- cmake ${CMAKE_OPTS} ..
- make ${MAKE_OPTS} run-integration-tests
artifacts:
name: ${CI_PROJECT_NAME}-integration-tests-${CI_BUILD_REF}
when: always
paths:
- build/tests/integration/
services:
- name: eclipse-mosquitto:2.0
alias: mosquitto
command: [ mosquitto, -c, /mosquitto-no-auth.conf ]
- name: rwthacs/rabbitmq
alias: rabbitmq
- name: redis:6.2
alias: redis
tags:
- docker
needs:
- job: "build:source: [fedora]"
artifacts: true
# Stage: packaging
##############################################################################
pkg:docker:
stage: packaging
image: docker:20.10
before_script:
- mkdir -p ~/.docker/cli-plugins/
- wget -O ~/.docker/cli-plugins/docker-buildx https://github.com/docker/buildx/releases/download/v0.6.3/buildx-v0.6.3.linux-amd64
- chmod a+x ~/.docker/cli-plugins/docker-buildx
- docker buildx create --use --name cross-platform-build --buildkitd-flags "--allow-insecure-entitlement security.insecure"
- docker buildx inspect --bootstrap cross-platform-build
- docker login -u ${CI_REGISTRY_USER} -p ${CI_REGISTRY_PASSWORD} ${CI_REGISTRY}
script:
- docker buildx build ${DOCKER_OPTS}
--pull
--allow security.insecure
--output type=docker
--target ${TARGET}
--build-arg ARCH=${ARCH}
--build-arg TRIPLET=${TRIPLET}
--platform ${PLATFORM}
--file ${DOCKER_FILE}
--tag ${DOCKER_IMAGE}:${DOCKER_TAG}-${ARCH} .
- docker push ${DOCKER_IMAGE}:${DOCKER_TAG}-${ARCH}
tags:
- docker
variables:
TARGET: app
parallel:
matrix:
- DISTRO: alpine
PLATFORM: linux/amd64
ARCH: amd64
TRIPLET: x86_64-alpine-linux-musl
- DISTRO: alpine
PLATFORM: linux/arm64/v8
ARCH: arm64
TRIPLET: aarch64-alpine-linux-musl
- DISTRO: alpine
PLATFORM: linux/arm/v6
ARCH: armv6
TRIPLET: armv6-alpine-linux-musleabihf
- DISTRO: alpine
PLATFORM: linux/arm/v7
ARCH: armv7
TRIPLET: armv7-alpine-linux-musleabihf
- DISTRO: debian
PLATFORM: linux/amd64
ARCH: x86_64
TRIPLET: x86_64-linux-gnu
DOCKER_IMAGE: ${CI_REGISTRY_IMAGE}/debian
- DISTRO: debian
PLATFORM: linux/arm/v7
ARCH: armhf
TRIPLET: arm-linux-gnueabihf
DOCKER_FILE: packaging/docker/Dockerfile.debian-multiarch
DOCKER_IMAGE: ${CI_REGISTRY_IMAGE}/debian
- DISTRO: debian
PLATFORM: linux/arm64/v8
ARCH: arm64
TRIPLET: aarch64-linux-gnu
DOCKER_FILE: packaging/docker/Dockerfile.debian-multiarch
DOCKER_IMAGE: ${CI_REGISTRY_IMAGE}/debian
needs: []
# Stage: deploy
##############################################################################
deploy:docker:
stage: deploy
image: docker:20.10
variables:
DOCKER_CLI_EXPERIMENTAL: enabled
before_script:
- docker login -u ${CI_REGISTRY_USER} -p ${CI_REGISTRY_PASSWORD} ${CI_REGISTRY}
script:
- docker push ${DOCKER_IMAGE}/dev:${DOCKER_TAG}
- docker manifest create ${DOCKER_IMAGE}:${DOCKER_TAG}
${DOCKER_IMAGE}:${DOCKER_TAG}-amd64
${DOCKER_IMAGE}:${DOCKER_TAG}-arm64
${DOCKER_IMAGE}:${DOCKER_TAG}-armv6
${DOCKER_IMAGE}:${DOCKER_TAG}-armv7
- docker manifest push ${DOCKER_IMAGE}:${DOCKER_TAG}
tags:
- docker
needs:
- job: "pkg:docker: [alpine, linux/amd64, amd64, x86_64-alpine-linux-musl]"
- job: "pkg:docker: [alpine, linux/arm64/v8, arm64, aarch64-alpine-linux-musl]"
- job: "pkg:docker: [alpine, linux/arm/v6, armv6, armv6-alpine-linux-musleabihf]"
- job: "pkg:docker: [alpine, linux/arm/v7, armv7, armv7-alpine-linux-musleabihf]"
- job: "prepare:docker: [fedora, --tag ${DOCKER_IMAGE}/dev:${CI_COMMIT_REF_NAME}]"
# Stage: latest
##############################################################################
.latest:docker:latest: &deploy_latest_docker
stage: latest
image: docker:20.10
before_script:
- docker login -u ${CI_REGISTRY_USER} -p ${CI_REGISTRY_PASSWORD} ${CI_REGISTRY}
script:
- docker manifest create ${DOCKER_IMAGE}:latest
${DOCKER_IMAGE}:${DOCKER_TAG}-amd64
${DOCKER_IMAGE}:${DOCKER_TAG}-arm64
${DOCKER_IMAGE}:${DOCKER_TAG}-armv6
${DOCKER_IMAGE}:${DOCKER_TAG}-armv7
- docker manifest push ${DOCKER_IMAGE}:latest
- docker tag ${DOCKER_IMAGE}/dev:${DOCKER_TAG} ${DOCKER_IMAGE}/dev:latest
- docker push ${DOCKER_IMAGE}/dev:latest
tags:
- docker
needs:
- job: deploy:docker
latest:docker:
<<: *deploy_latest_docker
only:
- "/^v\\d+(\\.\\d+)+$/" # Only on version tags
latest:docker:manual:
<<: *deploy_latest_docker
when: manual
except:
- "/^v\\d+(\\.\\d+)+$/" # Only on version tags