From a5cd221aee336a720f43d55d1d234c829ef859b0 Mon Sep 17 00:00:00 2001 From: Andre Anjos <andre.dos.anjos@gmail.com> Date: Tue, 30 Apr 2024 10:48:25 +0200 Subject: [PATCH] [ci] Use central biosignal CI file --- .gitlab-ci.yml | 250 +------------------------------------------------ 1 file changed, 4 insertions(+), 246 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 89bdd7aa..56a767b7 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -2,249 +2,7 @@ # # SPDX-License-Identifier: GPL-3.0-or-later -workflow: - rules: - - if: '$CI_PIPELINE_SOURCE == "merge_request_event"' - - if: '$CI_PIPELINE_SOURCE == "web"' - - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH' - - if: $CI_COMMIT_TAG - -variables: - PYTHONUNBUFFERED: "1" - OMP_NUM_THREADS: 1 # for pytorch CI tests on docker platform - GIT_SUBMODULE_STRATEGY: normal - GIT_SUBMODULE_DEPTH: 1 - XDG_CACHE_HOME: "${CI_PROJECT_DIR}/_cache" - XDG_CONFIG_HOME: "${CI_PROJECT_DIR}/_config" - PIXI_HOME: "${CI_PROJECT_DIR}/_pixi" - PIXI_FROZEN: true - -.snippets: - - setup-pixi: - - mkdir -p ${XDG_CACHE_HOME}/pixi - - mkdir -p ${XDG_CONFIG_HOME}/pixi - # global configuration for pixi - # https://pixi.sh/latest/advanced/global_configuration/#reference - - | - cat << 'EOF' > ${XDG_CONFIG_HOME}/pixi/config.toml - change_ps1 = false - tls_no_verify = true - [mirrors] - "https://conda.anaconda.org/conda-forge" = [ "http://bobconda.lab.idiap.ch:8080/conda-forge" ] - EOF - - pixi info - - export PATH=${PIXI_HOME}/bin:${PATH} - - pixi global install git - - # returns a comma-separated list of supported environments - - | - function pixi_environments() { \ - local array=($(pixi --color=never info | sed -e '/Environment:/!d;s/^ *Environment: //')); \ - printf -v joined '%s,' "${array[@]}"; \ - echo "${joined%,}"; \ - } - - # returns a comma-separated list of supported tasks - - | - function pixi_tasks() { \ - local array=($(pixi --color=never task list | sed 's/* //;/^$/d')); \ - printf -v joined '%s,' "${array[@]}"; \ - echo "${joined%,}"; \ - } - - # returns the first occurence of a string in an array, or not-found - # usage: has_any_string arr1,arr2,arr3 arr1,arr2 -> arr1 - # usage: has_any_string arr1,arr2,arr3 arr3,arr2 -> arr3 - # usage: has_any_string arr1,arr2,arr3 arr -> not-found - - | - function has_any_string() { \ - local array=(`echo ${1//,/ }`); \ - local matches=(`echo ${2//,/ }`); \ - for i in "${matches[@]}"; do \ - if [[ " ${array[*]} " =~ [[:space:]]${i}[[:space:]] ]]; then \ - echo $i; \ - return; \ - fi; \ - done; \ - echo "not-found"; \ - } - - # declare pixi_run function to run a task on a given environment, with - # multiple choices. It emits a green coloured output to the logs if both - # the environmetn and the task exist, otherwise it complains with a red - # log. - # usage: pixi_run env1,env2,env3 task1,task2,task3 - - | - function pixi_run { \ - local _env=$(has_any_string $(pixi_environments) "$1"); \ - local _task=$(has_any_string $(pixi_tasks) "$2"); \ - if [[ ${_env} == "not-found" || ${_task} == "not-found" ]]; then \ - echo -e "\e[1m--> missing environment or task for: \e[31mpixi run -e $1 $2\e[0m"; \ - exit 1; \ - else \ - echo -e "\e[1m--> \e[32mpixi run -e ${_env} ${_task}\e[0m"; \ - pixi run -e ${_env} ${_task}; \ - fi \ - } - - # declare pixi_run_if_exists function to run a task on a given - # environment, with multiple choices, if the function exists. It emits a - # green coloured output to the logs if both the environmetn and the task - # exist, otherwise it warns with an yellow log. - # usage: pixi_run env1,env2,env3 task1,task2,task3 - - | - function pixi_run_if_exists { \ - local _env=$(has_any_string $(pixi_environments) "$1"); \ - local _task=$(has_any_string $(pixi_tasks) "$2"); \ - if [[ ${_env} == "not-found" || ${_task} == "not-found" ]]; then \ - echo -e "\e[1m--> missing environment or task for: \e[33mpixi run -e $1 $2\e[0m"; \ - else \ - echo -e "\e[1m--> \e[32mpixi run -e ${_env} ${_task}\e[0m"; \ - pixi run -e ${_env} ${_task}; \ - fi \ - } - - apt-install-libgl: - # apt install libgl1-mesa-glx for grad-cam - - | - if [[ ${CI_RUNNER_TAGS} =~ '"docker"' ]]; then \ - apt update; \ - apt install -y libgl1-mesa-glx > /dev/null; \ - fi - -default: - tags: - - bob - - docker - image: ghcr.io/prefix-dev/pixi:latest - # do not cache pixi installs as we already have a reverse proxying cache - # cache: - # key: - # files: - # - pixi.lock - # paths: - # - .pixi # project packages - before_script: - - !reference [.snippets, setup-pixi] - -stages: - - qa - - test - - doc - - dist - - deploy - -quality: - stage: qa - rules: - - exists: - - .pre-commit-config.yaml - cache: - key: pre-commit - paths: - - _cache/pre-commit - script: - - pixi_run qa-ci,default qa-ci,qa - -tests: - stage: test - parallel: - matrix: - - PYTHON: ["3.12", "3.11"] - TAG: ["docker", "macos-arm"] - tags: - - bob - - ${TAG} - needs: - - job: quality - optional: true - before_script: - - !reference [.snippets, setup-pixi] - - !reference [.snippets, apt-install-libgl] - script: - - pixi_run test-ci-${PYTHON//\./},default test-ci,test-cov,test - coverage: '/(?:TOTAL|total|Total).*? (100(?:\.0+)?\%|[1-9]?\d(?:\.\d+)?\%)$/' - artifacts: - paths: - - html - reports: - junit: junit-coverage.xml - coverage_report: - coverage_format: cobertura - path: coverage.xml - -documentation: - stage: doc - rules: - - exists: - - doc/conf.py - needs: - - job: quality - optional: true - before_script: - - !reference [.snippets, setup-pixi] - - !reference [.snippets, apt-install-libgl] - script: - - pixi_run doc-ci,default doc-ci,doc - - pixi_run_if_exists doc-ci,default doctest-ci,doctest - artifacts: - paths: - - html - -python-package: - stage: dist - needs: - - tests - script: - - pixi_run build-ci,default build-ci,build - - pixi_run_if_exists build-ci,default check-ci,check - artifacts: - paths: - - dist - -docker-image: - stage: dist - needs: - - tests - image: docker:latest - services: - - docker:dind - rules: - # conditions: - # - the variable $CI_REGISTRY must be defined (package has a container - # image registry) - # - a file named "Dockerfile" exists on the root of the repository - - if: ($CI_REGISTRY != null) - exists: - - Dockerfile - before_script: - - docker info - script: - - docker login -u ${CI_REGISTRY_USER} -p ${CI_REGISTRY_PASSWORD} ${CI_REGISTRY} - - docker build -t ${CI_REGISTRY_IMAGE}:latest . - - > - # upload image to registry if on main dev branch or tag - if [ "${CI_COMMIT_BRANCH}" == "${CI_DEFAULT_BRANCH}" ]; then \ - docker push ${CI_REGISTRY_IMAGE}:latest; \ - if [ -n "${CI_COMMIT_TAG}" ]; then \ - docker build -t ${CI_REGISTRY_IMAGE}:${CI_COMMIT_TAG} .; \ - docker push ${CI_REGISTRY_IMAGE}:${CI_COMMIT_TAG}; \ - fi \ - fi - -pypi: - stage: deploy - needs: - - python-package - rules: - # conditions: - # - only for tags in PEP-440 style (on any branch) - # - only for public packages - # - the variable $PYPI_TOKEN must be defined - - if: ($CI_COMMIT_TAG =~ /^v\d+\.\d+\.\d+([abc]\d*)?$/ && $CI_PROJECT_VISIBILITY == "public" && $PYPI_TOKEN != null) - variables: - TWINE_USERNAME: "__token__" - TWINE_PASSWORD: "${PYPI_TOKEN}" - script: - - pixi_run build-ci,default upload-ci,upload +include: + - project: 'biosignal/templates/ci' + ref: main + file: 'python.yml' -- GitLab