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 DOCKER_PLATFORMS: amd64 armv6 armv7 arm64 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 ] - 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 - DISTRO: debian DOCKER_FILE: packaging/docker/Dockerfile.debian-multiarch DOCKER_IMAGE_DEV: ${DOCKER_IMAGE}/dev-debian-armhf DOCKER_OPTS: --build-arg ARCH=armhf --build-arg TRIPLET=arm-linux-gnueabihf - DISTRO: debian DOCKER_FILE: packaging/docker/Dockerfile.debian-multiarch DOCKER_IMAGE_DEV: ${DOCKER_IMAGE}/dev-debian-arm64 DOCKER_OPTS: --build-arg ARCH=arm64 --build-arg TRIPLET=aarch64-linux-gnu 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, debian-armhf, debian-arm64 ] - 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 - DISTRO: centos CMAKE: cmake3 CMAKE_OPTS: -DCMAKE_MODULE_PATH=/usr/local/lib64/cmake -DCMAKE_PREFIX_PATH=/usr/local - DISTRO: ubuntu CMAKE_OPTS: -DCMAKE_MODULE_PATH=/usr/local/lib64/cmake -DCMAKE_PREFIX_PATH=/usr/local tags: - docker build:docs: stage: build artifacts: name: ${CI_PROJECT_NAME}-doc-${CI_BUILD_REF} paths: - build/doc/ script: - mkdir -p build && cd build - cmake ${CMAKE_OPTS} .. - make ${MAKE_OPTS} doc image: ${DOCKER_IMAGE}/dev:${DOCKER_TAG} 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,information,missingInclude --std=c++11 --suppress=noValidConfiguration -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} allow_failure: true 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: - eclipse-mosquitto - rabbitmq - redis tags: - docker needs: - job: "build:source: [fedora]" artifacts: true # Stage: packaging ############################################################################## pkg:rpm: stage: packaging image: ${DOCKER_IMAGE_DEV}:${DOCKER_TAG} script: - mkdir -p build && cd build - cmake -DWITH_NODE_ETHERCAT=OFF .. - make ${MAKE_OPTS} doc - make ${MAKE_OPTS} package artifacts: expire_in: 1 week name: ${CI_PROJECT_NAME}-packages-${CI_BUILD_REF} paths: - build/*.tar.gz - build/*.rpm needs: - job: "build:source: [fedora]" artifacts: true tags: - docker pkg:alpine: 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.4.2/buildx-v0.4.2.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 app --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} variables: DISTRO: alpine tags: - docker parallel: matrix: - PLATFORM: linux/amd64 ARCH: amd64 TRIPLET: x86_64-alpine-linux-musl - PLATFORM: linux/arm64/v8 ARCH: arm64 TRIPLET: aarch64-alpine-linux-musl - PLATFORM: linux/arm/v6 ARCH: armv6 TRIPLET: armv6-alpine-linux-musleabihf - PLATFORM: linux/arm/v7 ARCH: armv7 TRIPLET: armv7-alpine-linux-musleabihf needs: [] # Stage: deploy ############################################################################## deploy:web: stage: deploy image: name: rclone/rclone:1.50 entrypoint: [""] before_script: - rclone config create fein webdav url ${DEPLOY_PATH} vendor other user ${DEPLOY_USER} pass ${DEPLOY_PASS} script: - rclone copy build/doc/html fein:villas/doc-dev/${CI_BUILD_REF_NAME} needs: - job: build:docs only: - "/^v\\d+(\\.\\d+)+$/" # Only on version tags tags: - docker 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:alpine: [linux/amd64, amd64, x86_64-alpine-linux-musl]" - job: "pkg:alpine: [linux/arm64/v8, arm64, aarch64-alpine-linux-musl]" - job: "pkg:alpine: [linux/arm/v6, armv6, armv6-alpine-linux-musleabihf]" - job: "pkg:alpine: [linux/arm/v7, armv7, armv7-alpine-linux-musleabihf]" - job: "prepare:docker: [fedora, --tag ${DOCKER_IMAGE}/dev:${CI_COMMIT_REF_NAME}]" .deploy:packages: &deploy_packages stage: deploy image: name: rclone/rclone:1.50 entrypoint: [""] before_script: - apk add curl - rclone config create fein webdav url ${DEPLOY_PATH} vendor other user ${DEPLOY_USER} pass ${DEPLOY_PASS} script: - rclone copy --max-depth 1 --include '*.tar.gz' build fein:packages/dist - rclone copy --max-depth 1 --include '*.rpm' build fein:packages/fedora/${RELEASEVER}/x86_64 - curl -L --user ${DEPLOY_USER}:${DEPLOY_PASS} ${DEPLOY_PATH}/hooks/createrepo variables: RELEASEVER: "33" needs: - job: pkg:rpm tags: - docker deploy:packages:manual: <<: *deploy_packages when: manual except: - "/^v\\d+(\\.\\d+)+$/" # Only on version tags deploy:packages:tags: <<: *deploy_packages only: - "/^v\\d+(\\.\\d+)+$/" # Only on version tags # 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