ophyd_devices/.gitlab-ci.yml

227 lines
6.9 KiB
YAML

# This file is a template, and might need editing before it works on your project.
# Official language image. Look for the different tagged releases at:
# https://hub.docker.com/r/library/python/tags/
image: $CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX/python:3.10
variables:
BEC_CORE_BRANCH: "main"
CHILD_PIPELINE_BRANCH: $CI_DEFAULT_BRANCH
workflow:
rules:
- if: $CI_PIPELINE_SOURCE == "schedule"
- if: $CI_PIPELINE_SOURCE == "web"
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
- if: $CI_PIPELINE_SOURCE == "pipeline"
- if: $CI_PIPELINE_SOURCE == "parent_pipeline"
- if: $CI_COMMIT_BRANCH && $CI_OPEN_MERGE_REQUESTS
when: never
- if: $CI_COMMIT_BRANCH
auto_cancel:
on_new_commit: interruptible
include:
- template: Security/Secret-Detection.gitlab-ci.yml
- project: "bec/awi_utils"
file: "/templates/check-packages-job.yml"
inputs:
stage: test
path: "."
pytest_args: "-v --random-order tests/"
exclude_packages: ""
- project: "bec/awi_utils"
file: "templates/device-list-job.yml"
inputs:
target: $CI_PROJECT_NAME
token: $CI_UPDATES
- project: "bec/awi_utils"
file: "/templates/trigger-beamline-repos.yml"
inputs:
bec_core_branch: $BEC_CORE_BRANCH
ophyd_devices_branch: $CHILD_PIPELINE_BRANCH
#commands to run in the Docker container before starting each job.
before_script:
- if [[ "$CI_PROJECT_PATH" != "bec/ophyd_devices" ]]; then
echo -e "\033[35;1m Using branch $CHILD_PIPELINE_BRANCH of Ophyd Devices \033[0;m";
test -d ophyd_devices || git clone --branch $CHILD_PIPELINE_BRANCH https://gitlab.psi.ch/bec/ophyd_devices.git; cd ophyd_devices;
fi
- pip install -e .[dev]
- git clone --branch $BEC_CORE_BRANCH https://gitlab.psi.ch/bec/bec.git
- pip install -e ./bec/bec_lib[dev]
- pip install -e ./bec/bec_server[dev]
# different stages in the pipeline
stages:
- Formatter
- test # must be called test for security/secret-detection to work
- AdditionalTests
- Deploy
formatter:
stage: Formatter
before_script:
- ""
script:
- pip install black isort
- pip install -e .[dev]
- isort --check --diff ./
- black --check --diff --color ./
rules:
- if: '$CI_PIPELINE_SOURCE == "parent_pipeline"'
when: never
- if: $CI_PROJECT_PATH == "bec/ophyd_devices"
interruptible: true
pylint:
stage: Formatter
script:
- pip install pylint pylint-exit anybadge
- mkdir ./pylint
- pylint ./ophyd_devices --output-format=text --output=./pylint/pylint.log | tee ./pylint/pylint.log || pylint-exit $?
- PYLINT_SCORE=$(sed -n 's/^Your code has been rated at \([-0-9.]*\)\/.*/\1/p' ./pylint/pylint.log)
- anybadge --label=Pylint --file=pylint/pylint.svg --value=$PYLINT_SCORE 2=red 4=orange 8=yellow 10=green
- echo "Pylint score is $PYLINT_SCORE"
artifacts:
paths:
- ./pylint/
expire_in: 1 week
rules:
- if: '$CI_PIPELINE_SOURCE == "parent_pipeline"'
when: never
- if: $CI_PROJECT_PATH == "bec/ophyd_devices"
interruptible: true
pylint-check:
stage: Formatter
needs: []
allow_failure: true
before_script:
- pip install pylint pylint-exit anybadge
- apt-get update
- apt-get install -y bc
script:
# Identify changed Python files
- if [ "$CI_PIPELINE_SOURCE" == "merge_request_event" ]; then
TARGET_BRANCH_COMMIT_SHA=$(git rev-parse $CI_MERGE_REQUEST_TARGET_BRANCH_NAME);
CHANGED_FILES=$(git diff --name-only $SOURCE_BRANCH_COMMIT_SHA $TARGET_BRANCH_COMMIT_SHA | grep '\.py$' || true);
else
CHANGED_FILES=$(git diff --name-only $CI_COMMIT_BEFORE_SHA $CI_COMMIT_SHA | grep '\.py$' || true);
fi
- if [ -z "$CHANGED_FILES" ]; then echo "No Python files changed."; exit 0; fi
# Run pylint only on changed files
- mkdir ./pylint
- pylint $CHANGED_FILES --output-format=text . | tee ./pylint/pylint_changed_files.log || pylint-exit $?
- PYLINT_SCORE=$(sed -n 's/^Your code has been rated at \([-0-9.]*\)\/.*/\1/p' ./pylint/pylint_changed_files.log)
- echo "Pylint score is $PYLINT_SCORE"
# Fail the job if the pylint score is below 9
- if [ "$(echo "$PYLINT_SCORE < 9" | bc)" -eq 1 ]; then echo "Your pylint score is below the acceptable threshold (9)."; exit 1; fi
artifacts:
paths:
- ./pylint/
expire_in: 1 week
rules:
- if: '$CI_PIPELINE_SOURCE == "parent_pipeline"'
when: never
- if: $CI_PROJECT_PATH == "bec/ophyd_devices"
interruptible: true
secret_detection:
before_script:
- ""
rules:
- if: $CI_PROJECT_PATH == "bec/ophyd_devices"
interruptible: true
pytest:
stage: test
script:
- pip install coverage
- coverage run --source=./ophyd_devices -m pytest -v --junitxml=report.xml --random-order --full-trace ./tests
- coverage report
- coverage xml
coverage: '/(?i)total.*? (100(?:\.0+)?\%|[1-9]?\d(?:\.\d+)?\%)$/'
artifacts:
reports:
junit: report.xml
coverage_report:
coverage_format: cobertura
path: coverage.xml
interruptible: true
config_test:
stage: test
script:
- ophyd_test --config ./ophyd_devices/configs/ --output ./config_tests
artifacts:
paths:
- ./config_tests
when: on_failure
expire_in: "30 days"
interruptible: true
tests-3.11:
stage: AdditionalTests
needs:
- job: "formatter"
optional: true
- job: "pylint"
optional: true
image: $CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX/python:3.11
script:
- pytest -v --random-order ./tests
allow_failure: true
interruptible: true
tests-3.12:
extends: "tests-3.11"
stage: AdditionalTests
image: $CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX/python:3.12
allow_failure: true
trigger_bec:
needs: []
trigger:
strategy: depend
include:
- project: bec/bec
ref: $BEC_CORE_BRANCH
file: /.gitlab-ci.yml
variables:
OPHYD_DEVICES_BRANCH: $CI_COMMIT_REF_NAME
CHILD_PIPELINE_BRANCH: $BEC_CORE_BRANCH
rules:
- if: '$CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "main" && $CI_PROJECT_PATH == "bec/ophyd_devices"'
interruptible: true
semver:
stage: Deploy
needs: ["pytest"]
script:
- git config --global user.name "ci_update_bot"
- git config --global user.email "ci_update_bot@bec.ch"
- git checkout "$CI_COMMIT_REF_NAME"
- git reset --hard origin/"$CI_COMMIT_REF_NAME"
# delete all local tags
- git tag -l | xargs git tag -d
- git fetch --tags
- git tag
# build and publish package
- pip install python-semantic-release==9.* wheel build twine
- export GL_TOKEN=$CI_UPDATES
- semantic-release -vv version
# check if any artifacts were created
- if [ ! -d dist ]; then echo No release will be made; exit 0; fi
- twine upload dist/* -u __token__ -p $CI_PYPI_TOKEN --skip-existing
- semantic-release publish
allow_failure: false
rules:
- if: '$CI_COMMIT_REF_NAME == "main" && $CI_PROJECT_PATH == "bec/ophyd_devices"'
interruptible: true