diff --git a/Jenkinsfile b/Jenkinsfile new file mode 100644 index 0000000..542cdc4 --- /dev/null +++ b/Jenkinsfile @@ -0,0 +1,219 @@ +#!groovy +@Library('jenkins-libraries') _ + +pipeline { + agent { + node { + label 'jenkins-node-label-1' + } + } + + environment { + PROJECT_NAME = 'fed-mgr' + DOCKERFILE = './docker/Dockerfile' + SRC_DIR = 'fed_mgr' + TESTS_DIR = 'tests' + POETRY_VERSION = '2.1' + TARGET_PYTHON = '3.13' + } + + triggers { + cron("${myCron.periodicTrigger(env.BRANCH_NAME)}") + } + + stages { + stage('Linting and format') { + agent { + docker { + label 'jenkins-node-label-1' + image "python:${env.TARGET_PYTHON}" + args '-u root:root' + reuseNode true + } + } + when { + expression { return env.CHANGE_ID != null || env.BRANCH_NAME == 'main' } // It is a PR or main branch + } + steps { + script { + ruffChecks(env.SRC_DIR) + } + } + } + stage('Tests execution') { + matrix { + axes { + axis { + name 'PYTHON_VERSION' + values '3.12', '3.13' + } + } + stages { + stage('Test'){ + agent { + docker { + label 'jenkins-node-label-1' + image "python:${env.PYTHON_VERSION}" + args '-u root:root' + reuseNode true + } + } + stages{ + stage('Install dependencies') { + steps { + script { + installDependencies(env.PYTHON_VERSION, env.POETRY_VERSION) + } + } + } + stage('Run Tests') { + steps { + script { + runTests(env.SRC_DIR, env.PYTHON_VERSION) + } + } + post { + always { + script { + archiveArtifacts artifacts: 'coverage-reports/**/*', fingerprint: true + } + } + } + } + } + } + } + } + } + stage('Combine coverages') { + agent { + docker { + label 'jenkins-node-label-1' + image "python:${env.TARGET_PYTHON}" + args '-u root:root' + reuseNode true + } + } + steps { + script { + combineCovReports() + } + } + post { + success { + script { + archiveArtifacts artifacts: 'coverage.xml', fingerprint: true + } + } + } + } + stage('Notify SonarCloud') { + agent { + docker { + label 'jenkins-node-label-1' + image 'sonarsource/sonar-scanner-cli' + args "-u root:root -v ${env.WORKSPACE}:/usr/src" + reuseNode true + } + } + steps { + script { + notifySonar(env.PROJECT_NAME, env.SRC_DIR, env.TESTS_DIR, env.TARGET_PYTHON) + } + } + } + stage('Build images') { + when { + allOf { + expression { return currentBuild.currentResult != 'UNSTABLE' } + expression { return currentBuild.result != 'UNSTABLE' } + expression { return env.CHANGE_ID != null || env.TAG_NAME != null || env.BRANCH_NAME == 'main' } // It is a PR or tag or main branch + } + } + matrix { + axes { + axis { + name 'PYTHON_VERSION' + values '3.12', '3.13' + } + } + stages { + stage('Build') { + steps { + script { + buildDockerImage(env.PROJECT_NAME, env.PYTHON_VERSION, env.POETRY_VERSION) + } + } + } + } + } + } + stage('Push images') { + when { + allOf { + expression { return currentBuild.currentResult != 'UNSTABLE' } + expression { return currentBuild.result != 'UNSTABLE' } + expression { return env.CHANGE_ID != null || env.TAG_NAME != null || env.BRANCH_NAME == 'main' } // It is a PR or tag or main branch + } + } + matrix { + axes { + axis { + name 'PYTHON_VERSION' + values '3.12', '3.13' + } + axis { + name 'DOCKER_REGISTRY' + values 'harbor2', 'dockerhub' + } + } + stages { + stage('Push') { + steps { + script { + pushDockerImage( + env.PROJECT_NAME, + env.DOCKER_REGISTRY, + env.PYTHON_VERSION, + env.PYTHON_VERSION == env.TARGET_PYTHON + ) + } + } + } + } + } + } + stage('Update docker description') { + when { + allOf { + expression { return currentBuild.currentResult != 'UNSTABLE' } + expression { return currentBuild.result != 'UNSTABLE' } + expression { return env.CHANGE_ID != null || env.TAG_NAME != null || env.BRANCH_NAME == 'main' } // It is a PR or tag or main branch + } + } + matrix { + axes { + axis { + name 'DOCKER_REGISTRY' + values 'harbor2', 'dockerhub' + } + } + stages { + stage('Update description') { + steps { + script { + updateDockerRegistryDoc(env.PROJECT_NAME, env.DOCKER_REGISTRY) + } + } + } + } + } + } + } + post { + always { + echo 'Cleaning up Docker images...' + sh 'docker system prune -af || true' + } + } +} diff --git a/jenkins/docker.Jenkinsfile b/jenkins/docker.Jenkinsfile deleted file mode 100644 index d04bc30..0000000 --- a/jenkins/docker.Jenkinsfile +++ /dev/null @@ -1,72 +0,0 @@ -#!groovy -@Library('jenkins-libraries') _ - -pipeline { - agent { - node { label 'jenkins-node-label-1' } - } - - environment { - PROJECT_NAME = 'fed-mgr' - DOCKERFILE = './docker/Dockerfile' - } - - triggers { - cron("${dockerRepository.periodicTrigger(env.BRANCH_NAME)}") - } - - stages { - stage('Create and push images') { - parallel { - stage('Image with python 3.12 published on Harbor') { - steps { - script { - dockerRepository.buildAndPushImage( - imageName: "${PROJECT_NAME}", - dockerfile: "${DOCKERFILE}", - registryType: 'harbor2', - pythonVersion: '3.12' - ) - } - } - } - stage('Image with python 3.13 published on Harbor') { - steps { - script { - dockerRepository.buildAndPushImage( - imageName: "${PROJECT_NAME}", - dockerfile: "${DOCKERFILE}", - registryType: 'harbor2', - pythonVersion: '3.13' - ) - } - } - } - stage('Image with python 3.12 published on DockerHub') { - steps { - script { - dockerRepository.buildAndPushImage( - imageName: "${PROJECT_NAME}", - dockerfile: "${DOCKERFILE}", - registryType: 'dockerhub', - pythonVersion: '3.12' - ) - } - } - } - stage('Image with python 3.13 published on DockerHub') { - steps { - script { - dockerRepository.buildAndPushImage( - imageName: "${PROJECT_NAME}", - dockerfile: "${DOCKERFILE}", - registryType: 'dockerhub', - pythonVersion: '3.13' - ) - } - } - } - } - } - } -} diff --git a/jenkins/tests.Jenkinsfile b/jenkins/tests.Jenkinsfile deleted file mode 100644 index a320831..0000000 --- a/jenkins/tests.Jenkinsfile +++ /dev/null @@ -1,55 +0,0 @@ -#!groovy -@Library('jenkins-libraries') _ - -void runTests(String pythonVersion) { - // Run in backgound a dockerized neo4j DB instance. - // Install dependencies for the specified python version. - // Run tests. - script { - pythonProject.testCode( - pythonVersion: "${pythonVersion}", - coveragercId: '.coveragerc', - coverageDir: "${COVERAGE_DIR}", - ) - } -} - -pipeline { - agent { label 'jenkins-node-label-1' } - - environment { - COVERAGE_DIR = 'coverage-reports' - SONAR_HOST = 'https://sonarcloud.io' - SONAR_ORGANIZATION = 'infn-datacloud' - SONAR_PROJECT = 'fed-mgr' - SONAR_TOKEN = credentials('sonar-token') - } - - stages { - stage('Run tests on multiple python versions') { - parallel { - stage('Run tests on python3.12') { - steps { - runTests('3.12') - } - } - } - } - } - post { - always { - script { - sonar.analysis( - sonarToken: '${SONAR_TOKEN}', - sonarProject: "${SONAR_PROJECT}", - sonarOrganization: "${SONAR_ORGANIZATION}", - sonarHost: "${SONAR_HOST}", - coverageDir: "${COVERAGE_DIR}", - srcDir: 'fed-mgr', - testsDir: 'tests', - pythonVersions: '3.12' - ) - } - } - } -}