variables: GIT_STRATEGY: fetch GIT_SUBMODULE_STRATEGY: recursive PREFIX: /usr/ RSYNC_OPTS: --recursive --ignore-missing-args --chown ${DEPLOY_USER}:${DEPLOY_USER} CRITERION_OPTS: --ignore-warnings DOCKER_FILE: packaging/docker/Dockerfile.dev DOCKER_TAG: ${CI_COMMIT_REF_NAME} DOCKER_IMAGE: registry.git.rwth-aachen.de/acs/public/villas/node DOCKER_IMAGE_DEV: ${DOCKER_IMAGE}/dev MAKE_OPTS: -j32 RELEASEVER: '29' stages: - prepare - build - test - packaging - deploy # For some reason, GitLab CI prunes the contents of the submodules so we need to restore them. before_script: - git submodule foreach git checkout . # Stage: prepare ############################################################################## # Build docker image which is used to build & test VILLASnode .prepare:docker-dev: &prepare_docker_dev stage: prepare script: - docker build ${DOCKER_OPTS} --file ${DOCKER_FILE} --tag ${DOCKER_IMAGE_DEV}:${DOCKER_TAG} . tags: - shell - linux prepare:fedora:docker-dev: <<: *prepare_docker_dev variables: DOCKER_FILE: packaging/docker/Dockerfile.dev DOCKER_IMAGE_DEV: ${DOCKER_IMAGE}/dev prepare:fedora:docker-dev-minimal: <<: *prepare_docker_dev variables: DOCKER_FILE: packaging/docker/Dockerfile.dev-minimal DOCKER_IMAGE_DEV: ${DOCKER_IMAGE}/dev-minimal prepare:ubuntu:docker-dev: <<: *prepare_docker_dev variables: DOCKER_FILE: packaging/docker/Dockerfile.dev-ubuntu DOCKER_IMAGE_DEV: ${DOCKER_IMAGE}/dev-ubuntu prepare:centos:docker-dev: <<: *prepare_docker_dev variables: DOCKER_FILE: packaging/docker/Dockerfile.dev-centos DOCKER_IMAGE_DEV: ${DOCKER_IMAGE}/dev-centos prepare:debian-armhf:docker-dev: <<: *prepare_docker_dev variables: DOCKER_FILE: packaging/docker/Dockerfile.dev-debian-multiarch DOCKER_IMAGE_DEV: ${DOCKER_IMAGE}/dev-debian-armhf DOCKER_OPTS: --build-arg ARCH=armhf --build-arg TRIPLET=arm-linux-gnueabihf prepare:debian-arm64:docker-dev: <<: *prepare_docker_dev variables: DOCKER_FILE: packaging/docker/Dockerfile.dev-debian-multiarch DOCKER_IMAGE_DEV: ${DOCKER_IMAGE}/dev-debian-arm64 DOCKER_OPTS: --build-arg ARCH=arm64 --build-arg TRIPLET=aarch64-linux-gnu # Stage: build ############################################################################## .build:fedora:x86_64: &build stage: build script: - mkdir -p build && cd build - cmake ${CMAKE_OPTS} .. - make ${MAKE_OPTS} artifacts: expire_in: 1 week paths: - build/ image: ${DOCKER_IMAGE_DEV}:${DOCKER_TAG} tags: - docker build:fedora:x86_64: <<: *build build:fedora-minimal:x86_64: <<: *build variables: DOCKER_IMAGE_DEV: ${DOCKER_IMAGE}/dev-minimal CMAKE_OPTS: -DWITH_GRAPHVIZ=OFF -DWITH_HOOKS=OFF -DWITH_WEB=OFF -DWITH_API=OFF -DWITH_CONFIG=OFF -DWITH_SRC=OFF -DWITH_TOOLS=OFF -DWITH_TESTS=OFF -DWITH_PLUGINS=OFF -DWITH_CLIENTS=OFF -DWITH_DOC=OFF -DWITH_FPGA=OFF build:fedora-minimal-default:x86_64: <<: *build variables: DOCKER_IMAGE_DEV: ${DOCKER_IMAGE}/dev-minimal build:ubuntu:x86_64: <<: *build variables: DOCKER_IMAGE_DEV: ${DOCKER_IMAGE}/dev-ubuntu CMAKE_OPTS: -DCMAKE_MODULE_PATH=/usr/local/lib64/cmake -DCMAKE_PREFIX_PATH=/usr/local build:centos:x86_64: <<: *build script: - mkdir -p build && cd build - cmake3 ${CMAKE_OPTS} .. - make ${MAKE_OPTS} variables: DOCKER_IMAGE_DEV: ${DOCKER_IMAGE}/dev-centos CMAKE_OPTS: -DCMAKE_MODULE_PATH=/usr/local/lib64/cmake -DCMAKE_PREFIX_PATH=/usr/local build:debian-multiarch:armhf: <<: *build variables: DOCKER_IMAGE_DEV: ${DOCKER_IMAGE}/dev-debian-armhf build:debian-multiarch:arm64: <<: *build variables: DOCKER_IMAGE_DEV: ${DOCKER_IMAGE}/dev-debian-arm64 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 test:unit: stage: test dependencies: - build:fedora:x86_64 variables: LD_PRELOAD: /usr/lib64/libSegFault.so SEGFAULT_SIGNALS: all SEGFAULT_SIGNALS: bus abrt script: - mkdir -p build && cd build - cmake ${CMAKE_OPTS} .. - make ${MAKE_OPTS} run-unit-tests image: ${DOCKER_IMAGE_DEV}:${DOCKER_TAG} tags: - docker test:integration: stage: test allow_failure: true dependencies: - build:fedora:x86_64 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/ image: ${DOCKER_IMAGE_DEV}:${DOCKER_TAG} tags: - docker # Stage: packaging ############################################################################## packaging:docker: stage: packaging image: docker:19.03 before_script: - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY script: - docker build --build-arg BUILDER_IMAGE=${DOCKER_IMAGE_DEV}:${DOCKER_TAG} --file packaging/docker/Dockerfile.app --tag ${DOCKER_IMAGE}:${DOCKER_TAG} . tags: - docker packaging:rpm: stage: packaging dependencies: - build:fedora:x86_64 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 image: ${DOCKER_IMAGE_DEV}:${DOCKER_TAG} tags: - docker # 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} dependencies: - build:docs only: # Only on version tags - "/^v\\d+(\\.\\d+)+$/" tags: - docker .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 dependencies: - packaging:rpm tags: - docker deploy:packages:manual: <<: *deploy_packages when: manual deploy:packages:tags: <<: *deploy_packages only: # Only on version tags - "/^v\\d+(\\.\\d+)+$/" deploy:docker: stage: deploy image: docker:19.03 before_script: - docker login -u ${CI_REGISTRY_USER} -p ${CI_REGISTRY_PASSWORD} ${CI_REGISTRY} script: - docker tag ${DOCKER_IMAGE}:${DOCKER_TAG} ${DOCKER_IMAGE}:latest - docker tag ${DOCKER_IMAGE}/dev:${DOCKER_TAG} ${DOCKER_IMAGE}/dev:latest - docker tag ${DOCKER_IMAGE}/dev-ubuntu:${DOCKER_TAG} ${DOCKER_IMAGE}/dev-ubuntu:latest - docker tag ${DOCKER_IMAGE}/dev-centos:${DOCKER_TAG} ${DOCKER_IMAGE}/dev-centos:latest - docker tag ${DOCKER_IMAGE}/dev-debian-arm64:${DOCKER_TAG} ${DOCKER_IMAGE}/dev-debian-arm64:latest - docker tag ${DOCKER_IMAGE}/dev-debian-armhf:${DOCKER_TAG} ${DOCKER_IMAGE}/dev-debian-armhf:latest - docker push ${DOCKER_IMAGE}:latest - docker push ${DOCKER_IMAGE}/dev:latest - docker push ${DOCKER_IMAGE}/dev-ubuntu:latest - docker push ${DOCKER_IMAGE}/dev-centos:latest - docker push ${DOCKER_IMAGE}/dev-debian-arm64:latest - docker push ${DOCKER_IMAGE}/dev-debian-armhf:latest tags: - docker only: # Only on version tags - "/^v\\d+(\\.\\d+)+$/" deploy:docker:tags: stage: deploy image: docker:19.03 before_script: - docker login -u ${CI_REGISTRY_USER} -p ${CI_REGISTRY_PASSWORD} ${CI_REGISTRY} script: - docker push ${DOCKER_IMAGE}:${DOCKER_TAG} - docker push ${DOCKER_IMAGE}/dev:${DOCKER_TAG} - docker push ${DOCKER_IMAGE}/dev-ubuntu:${DOCKER_TAG} - docker push ${DOCKER_IMAGE}/dev-centos:${DOCKER_TAG} - docker push ${DOCKER_IMAGE}/dev-debian-arm64:${DOCKER_TAG} - docker push ${DOCKER_IMAGE}/dev-debian-armhf:${DOCKER_TAG} tags: - docker only: # Only on version tags - "/^v\\d+(\\.\\d+)+$/"