diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index d0d525d32..0e7897b78 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -15,10 +15,9 @@ variables: stages: - prepare - build - - build2 - test + - packaging - deploy - - docker # For some reason, GitLab CI prunes the contents of the submodules so we need to restore them. before_script: @@ -28,7 +27,7 @@ before_script: ############################################################################## # Build docker image which is used to build & test VILLASnode -docker-dev: +prepare:fedora:docker-dev: stage: prepare script: - docker build @@ -38,10 +37,60 @@ docker-dev: - shell - linux +prepare:raspbian:docker-dev: + stage: prepare + script: + - docker build + --file packaging/docker/Dockerfile.dev-raspbian + --tag ${DOCKER_IMAGE_DEV}-raspbian:${DOCKER_TAG} . + tags: + - shell + - linux + +prepare:ubuntu:docker-dev: + stage: prepare + script: + - docker build + --file packaging/docker/Dockerfile.dev-ubuntu + --tag ${DOCKER_IMAGE_DEV}-ubuntu:${DOCKER_TAG} . + tags: + - shell + - linux + # Stage: build ############################################################################## -build:source: +build:fedora:x86_64: + stage: build + script: + - mkdir -p build && cd build + - cmake .. + - make ${MAKE_OPTS} + artifacts: + expire_in: 1 week + name: ${CI_PROJECT_NAME}-${CI_BUILD_REF} + paths: + - build/ + image: ${DOCKER_IMAGE_DEV}:${DOCKER_TAG} + tags: + - docker + +build:fedora-minimal:x86_64: + stage: build + script: + - mkdir -p build && cd build + - cmake .. -DWITH_HOOKS=OFF -DWITH_IO=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 + - make ${MAKE_OPTS} + artifacts: + expire_in: 1 week + name: ${CI_PROJECT_NAME}-${CI_BUILD_REF} + paths: + - build/ + image: ${DOCKER_IMAGE_DEV}:${DOCKER_TAG} + tags: + - docker + +build:raspbian:armv6l: stage: build script: - mkdir -p build && cd build @@ -73,8 +122,57 @@ build:docs: - tags - master -build2:packages: - stage: build2 + +# Stage: test +############################################################################## + +test:unit: + stage: test + dependencies: + - build:fedora:x86_64 + script: + - mkdir -p build && cd build + - cmake .. && make ${MAKE_OPTS} unit-tests + - "tests/unit/unit-tests || true" + image: ${DOCKER_IMAGE_DEV}:${DOCKER_TAG} + tags: + - docker + +test:integration: + stage: test + dependencies: + - build:fedora:x86_64 + script: + - mkdir -p build && cd build + - cmake .. + - 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 + script: + - docker build + --build-arg BUILDER_IMAGE=${DOCKER_IMAGE_DEV}:${DOCKER_TAG} + --file packaging/docker/Dockerfile.app + --tag ${DOCKER_IMAGE}:${DOCKER_TAG} . + - docker push ${DOCKER_IMAGE}:${DOCKER_TAG} + - docker push ${DOCKER_IMAGE_DEV}:${DOCKER_TAG} + tags: + - shell + - linux + +packaging:rpm: + stage: packaging dependencies: - build:docs script: @@ -94,39 +192,6 @@ build2:packages: - tags - master - -# Stage: test -############################################################################## - -test:unit: - stage: test - dependencies: - - build:source - script: - - mkdir -p build && cd build - - cmake .. && make ${MAKE_OPTS} unit-tests - - "tests/unit/unit-tests || true" - image: ${DOCKER_IMAGE_DEV}:${DOCKER_TAG} - tags: - - docker - -test:integration: - stage: test - dependencies: - - build:source - script: - - mkdir -p build && cd build - - cmake .. - - 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: deploy ############################################################################## @@ -134,8 +199,8 @@ deploy:web: stage: deploy script: - ssh ${DEPLOY_USER}@${DEPLOY_HOST} mkdir -p ${DEPLOY_PATH}/{coverage,doc}/${CI_BUILD_REF_NAME}/ - - rsync ${RSYNC_OPTS} build/doc/html/ ${DEPLOY_USER}@${DEPLOY_HOST}:${DEPLOY_PATH}/doc/$CI_BUILD_REF_NAME/ - - rsync ${RSYNC_OPTS} web/ ${DEPLOY_USER}@${DEPLOY_HOST}:${DEPLOY_PATH}/ + - rsync ${RSYNC_OPTS} build/doc/html/ ${DEPLOY_USER}@${DEPLOY_HOST}:${DEPLOY_PATH}/doc/$CI_BUILD_REF_NAME/ + - rsync ${RSYNC_OPTS} web/ ${DEPLOY_USER}@${DEPLOY_HOST}:${DEPLOY_PATH}/ dependencies: - build:docs only: @@ -151,24 +216,8 @@ deploy:packages: - rsync ${RSYNC_OPTS} build/*.tar.gz ${DEPLOY_USER}@${DEPLOY_HOST}:${DEPLOY_PATH}/dist/ - ssh ${DEPLOY_USER}@${DEPLOY_HOST} createrepo ${DEPLOY_PATH}/../packages dependencies: - - build2:packages + - packaging:rpm tags: - villas-deploy only: - tags - -# Stage: docker -############################################################################## - -docker: - stage: docker - script: - - docker build - --build-arg BUILDER_IMAGE=${DOCKER_IMAGE_DEV}:${DOCKER_TAG} - --file packaging/docker/Dockerfile.app - --tag ${DOCKER_IMAGE}:${DOCKER_TAG} . - - docker push ${DOCKER_IMAGE}:${DOCKER_TAG} - - docker push ${DOCKER_IMAGE_DEV}:${DOCKER_TAG} - tags: - - shell - - linux diff --git a/packaging/docker/Dockerfile.app-raspbian b/packaging/docker/Dockerfile.app-raspbian new file mode 100644 index 000000000..5778a4061 --- /dev/null +++ b/packaging/docker/Dockerfile.app-raspbian @@ -0,0 +1,64 @@ +# Dockerfile +# +# This image can be used for running VILLASnode +# by running: +# make docker +# +# @author Steffen Vogel +# @copyright 2014-2019, Institute for Automation of Complex Power Systems, EONERC +# @license GNU General Public License (version 3) +# +# VILLASnode +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +################################################################################### + +ARG BUILDER_IMAGE=villas/node-dev-raspbian +ARG DOCKER_TAG=latest +ARG GIT_REV=unknown +ARG GIT_BRANCH=unknown +ARG VERSION=unknown +ARG VARIANT=unknown + +# This image is built by villas-node-git/packaging/docker/Dockerfile.dev +FROM $BUILDER_IMAGE + +COPY . /villas/ + +RUN rm -rf /villas/build && mkdir /villas/build +WORKDIR /villas/build +RUN cmake -DCPACK_GENERATOR=RPM .. +RUN make -j$(nproc) install + +# For WebSocket / API access +EXPOSE 80 +EXPOSE 443 + +ENTRYPOINT ["villas"] + +LABEL \ + org.label-schema.schema-version = "1.0" \ + org.label-schema.name = "VILLASnode" \ + org.label-schema.license = "GPL-3.0" \ + org.label-schema.vcs-ref="$GIT_REV" \ + org.label-schema.vcs-branch="$GIT_BRANCH" \ + org.label-schema.version="$VERSION" \ + org.label-schema.variant="$VARIANT" \ + org.label-schema.vendor = "Institute for Automation of Complex Power Systems, RWTH Aachen University" \ + org.label-schema.author.name = "Steffen Vogel" \ + org.label-schema.author.email = "stvogel@eonerc.rwth-aachen.de" \ + org.label-schema.description = "A image containing for VILLASnode based on Fedora" \ + org.label-schema.url = "http://fein-aachen.org/projects/villas-framework/" \ + org.label-schema.vcs-url = "https://git.rwth-aachen.de/VILLASframework/VILLASnode" \ + org.label-schema.usage = "https://villas.fein-aachen.org/doc/node-installation.html#node-installation-docker" diff --git a/packaging/docker/Dockerfile.dev-raspbian b/packaging/docker/Dockerfile.dev-raspbian new file mode 100644 index 000000000..a35dd269b --- /dev/null +++ b/packaging/docker/Dockerfile.dev-raspbian @@ -0,0 +1,115 @@ +# Dockerfile for VILLASnode development. +# +# This Dockerfile builds an image which contains all library dependencies +# and tools to build VILLASnode. +# However, VILLASnode itself it not part of the image. +# +# This image can be used for developing VILLASnode +# by running: +# make docker +# +# @author Steffen Vogel +# @copyright 2014-2019, Institute for Automation of Complex Power Systems, EONERC +# @license GNU General Public License (version 3) +# +# VILLASnode +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +################################################################################### + +FROM balenalib/rpi-raspbian + +ARG GIT_REV=unknown +ARG GIT_BRANCH=unknown +ARG VERSION=unknown +ARG VARIANT=unknown + +# Toolchain +RUN apt-get update && apt-get install -y \ + gcc g++ \ + pkg-config cmake make ninja-build \ + texinfo git curl tar \ + protobuf-compiler protobuf-c-compiler + +# Several tools only needed for developement and testing +RUN apt-get install -y \ + doxygen dia graphviz \ + openssh-client \ + jq netcat \ + iproute2 \ + python-pip \ + valgrind gdb gdbserver \ + xmlto asciidoctor \ + rabbitmq-server mosquitto + +# Dependencies +RUN apt-get install -y \ + libssl-dev \ + libprotobuf-dev \ + libprotobuf-c-dev \ + uuid-dev \ + libconfig-dev \ + libnl-3-dev libnl-route-3-dev \ + libcurl4-openssl-dev \ + libjansson-dev \ + libzmq3-dev \ + libnanomsg-dev \ + librabbitmq-dev \ + libmosquitto-dev \ + libcomedi-dev \ + libibverbs-dev \ + librdmacm-dev \ + libre-dev + +# Build & Install libwebsockets +RUN cd /tmp && \ + git clone -b v3.1-stable https://github.com/warmcat/libwebsockets && \ + mkdir -p libwebsockets/build && cd libwebsockets/build && \ + cmake .. && make -j$(nproc) install && \ + rm -rf /tmp/* + +# Build & Install libiec61850 +RUN cd /tmp && \ + git clone -b v1.3.1 https://github.com/mz-automation/libiec61850 && \ + mkdir -p libiec61850/build && cd libiec61850/build && \ + cmake .. && make -j$(nproc) install && \ + rm -rf /tmp/* + +# Expose ports for HTTP and WebSocket frontend +EXPOSE 80 +EXPOSE 443 + +ENV LD_LIBRARY_PATH /usr/local/lib:/usr/local/lib64 + +# Workaround for libnl3's search path for netem distributions +RUN ln -s /usr/lib64/tc /usr/lib/tc + +WORKDIR /villas +ENTRYPOINT bash + +LABEL \ + org.label-schema.schema-version="1.0" \ + org.label-schema.name="VILLASnode" \ + org.label-schema.license="GPL-3.0" \ + org.label-schema.vcs-ref="$GIT_REV" \ + org.label-schema.vcs-branch="$GIT_BRANCH" \ + org.label-schema.version="$VERSION" \ + org.label-schema.variant="$VARIANT" \ + org.label-schema.vendor="Institute for Automation of Complex Power Systems, RWTH Aachen University" \ + org.label-schema.author.name="Steffen Vogel" \ + org.label-schema.author.email="stvogel@eonerc.rwth-aachen.de" \ + org.label-schema.description="A image containing all build-time dependencies for VILLASnode based on Ubuntu" \ + org.label-schema.url="http://fein-aachen.org/projects/villas-framework/" \ + org.label-schema.vcs-url="https://git.rwth-aachen.de/VILLASframework/VILLASnode" \ + org.label-schema.usage="https://villas.fein-aachen.org/doc/node-installation.html#node-installation-docker"