diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml new file mode 100644 index 0000000..31f62b3 --- /dev/null +++ b/.gitlab-ci.yml @@ -0,0 +1,189 @@ +## +## Copyright (c) 2023 The Johns Hopkins University Applied Physics +## Laboratory LLC. +## +## This file is part of the Asynchronous Network Managment System (ANMS). +## +## Licensed under the Apache License, Version 2.0 (the "License"); +## you may not use this file except in compliance with the License. +## You may obtain a copy of the License at +## http://www.apache.org/licenses/LICENSE-2.0 +## Unless required by applicable law or agreed to in writing, software +## distributed under the License is distributed on an "AS IS" BASIS, +## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +## See the License for the specific language governing permissions and +## limitations under the License. +## +## This work was performed for the Jet Propulsion Laboratory, California +## Institute of Technology, sponsored by the United States Government under +## the prime contract 80NM0018D0004 between the Caltech and NASA under +## subcontract 1658085. +## +default: + # All jobs run within a target-like environment + image: docker-remote.artifactory.jhuapl.edu/ubuntu:20.04 + +include: + # Run pipeline only on branches, not MRs + - template: 'Workflows/Branch-Pipelines.gitlab-ci.yml' + # auto-static-analysis + - template: Security/SAST.gitlab-ci.yml + - template: Code-Quality.gitlab-ci.yml + +variables: + GIT_SUBMODULE_STRATEGY: recursive + DOCKER_BUILDKIT: 1 + DEBIAN_FRONTEND: "noninteractive" + # for Python/PIP + PIP_CERT: /etc/ssl/certs/ca-certificates.crt + PIP_DEFAULT_TIMEOUT: "300" + # for Ruby/bolt + SSL_CERT_FILE: /etc/ssl/certs/ca-certificates.crt + # Project-spcific environment + XDG_CACHE_HOME: "$CI_PROJECT_DIR/.cache" + PIP_CACHE_DIR: "$CI_PROJECT_DIR/.cache/pip" + + +stages: + - build + - test + - deploy + +cache: + paths: + - .cache/pip + +.prep-repos: &prep-repos | + # Use local repo mirrors + sed -i s#http://archive.ubuntu.com/ubuntu/#http://artifactory.jhuapl.edu/artifactory/ubuntu-main-remote/# /etc/apt/sources.list + sed -i s#http://security.ubuntu.com/ubuntu/#http://artifactory.jhuapl.edu/artifactory/ubuntu-security-remote/# /etc/apt/sources.list + +.prep-install-ca: &prep-install-ca | + apt-get update && apt-get install -y ca-certificates curl + mkdir -p /usr/local/share/ca-certificates + curl -svL http://apllinuxdepot.jhuapl.edu/linux/APL-root-cert/JHUAPL-MS-Root-CA-05-21-2038-B64-text.cer -o /usr/local/share/ca-certificates/JHUAPL-MS-Root-CA-05-21-2038-B64-text.crt + update-ca-certificates + +.prep-install-pip: &prep-install-pip | + apt-get update && apt-get install -y git python3 python3-venv python3-pip python3-wheel + pip3 config --global set global.index-url https://artifactory.jhuapl.edu/artifactory/api/pypi/python-remote/simple + pip3 install pip-tools +.prep-wheel-ace: &prep-wheel-ace | + pip3 wheel git+https://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.jhuapl.edu/dtn/ace.git -w ./wheels --no-deps + git clone https://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.jhuapl.edu/dtn/adms.git tests/adms + +build: + stage: build + needs: [] + before_script: + - *prep-repos + - *prep-install-ca + - *prep-install-pip + - *prep-wheel-ace + script: + - pip3 install --find-links ./wheels . + - pip3 show -f anms-CAmp + +unit-test: + stage: test + needs: + - build + allow_failure: true + before_script: + - *prep-repos + - *prep-install-ca + - *prep-install-pip + - *prep-wheel-ace + - pip-compile --find-links ./wheels --extra test pyproject.toml + - pip3 install --find-links ./wheels -r requirements.txt + script: + - PYTHONPATH=src python3 -m pytest --verbose --junitxml=testresults.xml --cov=camp tests + - coverage xml + coverage: /TOTAL\s+\d+\s+\d+\s+(\d+(?:.\d+)?)%/ + artifacts: + when: always + reports: + junit: testresults.xml + coverage_report: + coverage_format: cobertura + path: coverage.xml + +pylint: + stage: test + needs: + - build + allow_failure: true + before_script: + - *prep-repos + - *prep-install-ca + - *prep-install-pip + - *prep-wheel-ace + - pip-compile --find-links ./wheels --extra pylint pyproject.toml + - pip3 install --find-links ./wheels -r requirements.txt + script: + - | + export PYTHONPATH=src + FAIL_SRC=0 + pylint --output-format=junit --output=pylint-src.xml src || FAIL_SRC=$? + FAIL_TESTS=0 + pylint --output-format=junit --output=pylint-tests.xml tests --max-line-length=300 --disable missing-class-docstring,missing-function-docstring,duplicate-code,unbalanced-tuple-unpacking || FAIL_TESTS=$? + if [ $FAIL_SRC -ne 0 -o $FAIL_TESTS -ne 0 ]; then exit 1; fi + artifacts: + when: always + reports: + junit: "pylint-*.xml" + +flake8: + stage: test + needs: + - build + allow_failure: true + before_script: + - *prep-repos + - *prep-install-ca + - *prep-install-pip + - *prep-wheel-ace + - pip-compile --find-links ./wheels --extra flake8 pyproject.toml + - pip3 install --find-links ./wheels -r requirements.txt + script: + - | + FAIL_SRC=0 + flake8 --format=junit-xml --output-file=flake8-src.xml src || FAIL_SRC=$? + FAIL_TESTS=0 + flake8 --format=junit-xml --output-file=flake8-tests.xml tests --max-line-length=300 || FAIL_TESTS=$? + if [ $FAIL_SRC -ne 0 -o $FAIL_TESTS -ne 0 ]; then exit 1; fi + artifacts: + when: always + reports: + junit: "flake8-*.xml" + +docs: + stage: build + needs: [] + before_script: + - *prep-repos + - *prep-install-ca + - *prep-install-pip + - *prep-wheel-ace + - pip-compile --find-links ./wheels --extra docs pyproject.toml + - pip3 install --find-links ./wheels -r requirements.txt + script: + - ./build_docs.sh + - mv docs/_build/html public + artifacts: + paths: + - "public" + +# Job name to use Gitlab Pages feature +pages: + stage: deploy + rules: + - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH + needs: + - job: docs + artifacts: true + script: + - "true" # Just a copy from job:docs + artifacts: + paths: + - "public"