197 lines
5.9 KiB
YAML
197 lines
5.9 KiB
YAML
# ~~~~~~~~~~~~~~~~~~~~~ Base image
|
|
image: ubuntu:22.04
|
|
|
|
# ~~~~~~~~~~~~~~~~~~~~~ Caches & Environment variables
|
|
variables:
|
|
PIP_CACHE_DIR: "$CI_PROJECT_DIR/.cache/pip"
|
|
|
|
cache:
|
|
# Share cache among commits on the same branch
|
|
key: ${CI_COMMIT_REF_SLUG}
|
|
paths:
|
|
- .cache/pip
|
|
- .cache/apt
|
|
# cache these such that subsequent invocations test at least the previous examples
|
|
- .hypothesis/examples
|
|
# mypy works incrementally
|
|
- .mypy_cache
|
|
|
|
# ~~~~~~~~~~~~~~~~~~~~~ Config
|
|
stages:
|
|
- Static Code Analysis
|
|
- Automatic Testing
|
|
- Manual Testing
|
|
- Documentation
|
|
- Deploy
|
|
|
|
default:
|
|
timeout: 15 minutes
|
|
|
|
# ~~~~~~~~~~~~~~~~~~~~~ Static Code Analysis
|
|
Pylint:
|
|
image: python:3.10
|
|
stage: Static Code Analysis
|
|
needs: []
|
|
before_script:
|
|
- pip install "pylint~=2.13.4"
|
|
script:
|
|
- pylint -j 0 pyrate tests scripts | awk '!seen[$0]++'
|
|
|
|
Flake8 Linter:
|
|
image: python:3.10
|
|
stage: Static Code Analysis
|
|
needs: []
|
|
before_script:
|
|
- pip install hacking # This also installs flake8, mccabe and others
|
|
script:
|
|
- flake8 | awk '!seen[$0]++'
|
|
|
|
Mypy Static Type Checker:
|
|
stage: Static Code Analysis
|
|
needs: []
|
|
before_script:
|
|
# (This section is partly copied from the Pytest job)
|
|
|
|
# Setup APT cache based on
|
|
# https://gitlab.com/gitlab-org/gitlab-runner/issues/991#note_126864314
|
|
- rm -f /etc/apt/apt.conf.d/docker-clean
|
|
- mkdir -p .cache/apt && mkdir /var/cache/apt/archives && mount --bind .cache/apt /var/cache/apt/archives/
|
|
|
|
# Install Pip & additional requirements that cannot be fulfilled with pip
|
|
- apt-get update -qq
|
|
- apt-get install -qqy python3-pip g++ python3-dev python3-gdal libgdal-dev
|
|
|
|
# Print version information and install Pyrate
|
|
- python3 --version
|
|
- pip3 install .
|
|
script:
|
|
- mypy pyrate tests scripts
|
|
|
|
Black Linter:
|
|
image: python:3.10
|
|
stage: Static Code Analysis
|
|
needs: []
|
|
before_script:
|
|
- pip install black
|
|
script:
|
|
- black --check --diff .
|
|
# Black is allowed to fail since we do not strictly enforce its advice
|
|
allow_failure: true
|
|
|
|
# ~~~~~~~~~~~~~~~~~~~~~ Automatic Testing
|
|
Pytest:
|
|
stage: Automatic Testing
|
|
needs: []
|
|
timeout: 3 hours
|
|
# ~~~~~~~~~~~~~~~~~~~~~ Setup & Installation
|
|
before_script:
|
|
# Setup APT cache based on
|
|
# https://gitlab.com/gitlab-org/gitlab-runner/issues/991#note_126864314
|
|
- rm -f /etc/apt/apt.conf.d/docker-clean
|
|
- mkdir -p .cache/apt && mkdir /var/cache/apt/archives && mount --bind .cache/apt /var/cache/apt/archives/
|
|
|
|
# Install Pip & additional requirements that cannot be fulfilled with pip
|
|
- apt-get update -qq
|
|
- apt-get install software-properties-common -qqy
|
|
- add-apt-repository ppa:antiprism/ppa -y
|
|
- apt-get install -qqy python3-pip g++ python3-dev python3-gdal libgdal-dev libsqlite3-mod-spatialite antiprism
|
|
|
|
# Print version information and install Pyrate
|
|
- python3 --version
|
|
- pip3 install .
|
|
script:
|
|
# Run the tests and collect coverage
|
|
- pytest --junitxml=.test-artifacts.junit.xml
|
|
|
|
# Convert the coverage report extra (instead of with --cov-report xml:coverage.xml) to correct the source paths
|
|
# This is for Gitlab to automatically parse it
|
|
- python3 -m coverage xml
|
|
|
|
# Make sure to crash at less than 100% statement coverage
|
|
- python3 -m coverage json
|
|
- echo Checking for 100.00% statement coverage ...
|
|
- >
|
|
cat coverage.json | python3 -c $'import json, sys; miss = bool(json.load(sys.stdin)["totals"]["missing_lines"])\nif miss: sys.exit("\033[91m\033[01mERROR: Statement Coverage is <100%.\033[0m");'
|
|
coverage: '/^TOTAL\s+\d+\s+\d+\s+\d+\s+\d+\s+(\d+.\d+\%)/'
|
|
artifacts:
|
|
reports:
|
|
junit: .test-artifacts.junit.xml
|
|
cobertura: coverage.xml
|
|
|
|
Mutation Testing:
|
|
extends: Pytest
|
|
stage: Manual Testing
|
|
needs: [Pytest, Mypy Static Type Checker] # Always make sure that the normal tests run fine!
|
|
timeout: 3 days # This can take very long, since the test suite might get run many times
|
|
when: manual
|
|
script:
|
|
- pip3 install mutmut
|
|
- mutmut run --no-progress # Update less regularly
|
|
- mutmut results
|
|
- mutmut html
|
|
artifacts:
|
|
reports: {}
|
|
paths:
|
|
- html/
|
|
expire_in: 500 days
|
|
|
|
# ~~~~~~~~~~~~~~~~~~~~~ Documentation
|
|
|
|
Build Documentation:
|
|
stage: Documentation
|
|
needs: []
|
|
retry: # Needed due to random "std::bad_alloc" occurrences
|
|
max: 2
|
|
when: script_failure
|
|
before_script:
|
|
# Installation as in the "Pytest" job
|
|
# Setup APT cache based on
|
|
# https://gitlab.com/gitlab-org/gitlab-runner/issues/991#note_126864314
|
|
- rm -f /etc/apt/apt.conf.d/docker-clean
|
|
- mkdir -p .cache/apt && mkdir /var/cache/apt/archives && mount --bind .cache/apt /var/cache/apt/archives/
|
|
|
|
# Setup pip
|
|
- apt-get update -qq
|
|
- apt-get install -qqy python3-pip
|
|
|
|
# Install additional requirements that cannot be fulfilled with pip
|
|
- apt-get install -qqy g++ python3-dev python3-gdal libgdal-dev libsqlite3-mod-spatialite
|
|
|
|
# Print version information and install Pyrate
|
|
- python3 --version
|
|
- pip3 install .[docs]
|
|
|
|
# Install additional requirements specifically for the documentation
|
|
- apt-get -qqy install graphviz
|
|
script:
|
|
- cd doc
|
|
- make html # only build HTML as it supports all features, is fast and required for the Gitlab pages website
|
|
artifacts:
|
|
paths:
|
|
- doc/build/html/
|
|
|
|
# ~~~~~~~~~~~~~~~~~~~~~ Deploy
|
|
|
|
# This job is separate from "Build Documentation" job since this one shall only run on the master branch while the other
|
|
# should run as part of all pipelines
|
|
pages:
|
|
image: alpine:latest
|
|
stage: Deploy
|
|
needs: [Build Documentation]
|
|
only:
|
|
- master
|
|
script:
|
|
- mkdir public
|
|
- cp -R doc/build/html/* public/
|
|
artifacts:
|
|
paths:
|
|
- public
|
|
|
|
# This job triggers the pipeline of the ros-nodes repository on changes of the master branch
|
|
Trigger Downstream Pipelines:
|
|
# needs: [] although this does not really require other jobs, it shall only be run at the end if all others succeeded
|
|
stage: Deploy
|
|
only:
|
|
- master
|
|
trigger: informatik/ros-nodes
|