@Library('eo-jenkins-lib@main') import eo.Utils

UPSTREAM_PROJECTS = BRANCH_NAME == 'main' ? 'gitea/authentic/main,gitea/passerelle/main' : ''

pipeline {
    agent any
    options {
        disableConcurrentBuilds()
        timeout(time: 60, unit: 'MINUTES')
    }
    triggers {
        upstream(upstreamProjects: UPSTREAM_PROJECTS, threshold: hudson.model.Result.SUCCESS)
        cron(BRANCH_NAME == 'main' ? 'H H(0-7) * * *' : '')
    }
    parameters {
        string(name: 'AUTHENTIC_VERSION', defaultValue: 'main')
        string(name: 'DJANGO_TENANT_SCHEMAS_VERSION', defaultValue: 'main')
        string(name: 'PASSERELLE_VERSION', defaultValue: 'main')
    }
    environment {
        AUTHENTIC_VERSION = "${params.AUTHENTIC_VERSION}"
        DJANGO_TENANT_SCHEMAS_VERSION = "${params.DJANGO_TENANT_SCHEMAS_VERSION}"
        PASSERELLE_VERSION = "${params.PASSERELLE_VERSION}"
    }
    stages {
        stage('Unit Tests') {
            parallel {
                stage('Hobo') {
                    steps {
                        sh 'nox --no-reuse-existing-virtualenvs -k "tests and hobo"'
                    }
                }
                stage('Schemas') {
                    steps {
                        sh 'nox --no-reuse-existing-virtualenvs -k "tests and schemas"'
                    }
                }
                stage('Multitenant') {
                    steps {
                        sh 'nox --no-reuse-existing-virtualenvs -k "tests and multitenant"'
                    }
                }
                stage('Multipublik') {
                    steps {
                        sh 'nox --no-reuse-existing-virtualenvs -k "tests and multipublik"'
                    }
                }
                stage('Authentic') {
                    steps {
                        sh 'nox --no-reuse-existing-virtualenvs -k "tests and authentic"'
                    }
                }
                stage('Passerelle') {
                    steps {
                        sh 'nox --no-reuse-existing-virtualenvs -k "tests and passerelle"'
                    }
                }
                stage('Code quality') {
                    steps {
                        sh 'nox --no-reuse-existing-virtualenvs -k "pylint or codestyle or check_manifest"'
                    }
                    post {
                        always {
                            recordIssues enabledForFailure: true, tool: pyLint(pattern: 'pylint.out')
                        }
                    }
                }
            }
            post {
                // do not stop if diff-cover fails
                always {
                    catchError {
                        mergeJunitResults()
                    }
                    catchError {
                        sh 'nox --no-reuse-existing-virtualenvs -k "coverage_report"'
                    }
                    script {
                        def utils = new Utils()
                        utils.publish_coverage('coverage.xml')
                        utils.publish_coverage_native()
                        utils.publish_diff_cover()
                        utils.display_diff_cover_status()
                    }
                }
            }
        }
        stage('Packaging') {
            steps {
                script {
                    env.SHORT_JOB_NAME=sh(
                        returnStdout: true,
                        // given JOB_NAME=gitea/project/PR-46, returns project
                        // given JOB_NAME=project/main, returns project
                        script: '''
                            echo "${JOB_NAME}" | sed "s/gitea\\///" | awk -F/ '{print $1}'
                        '''
                    ).trim()
                    if (env.GIT_BRANCH == 'main' || env.GIT_BRANCH == 'origin/main') {
                        sh "sudo -H -u eobuilder /usr/local/bin/eobuilder -d bookworm,trixie ${SHORT_JOB_NAME}"
                    } else if (env.GIT_BRANCH.startsWith('hotfix/')) {
                        sh "sudo -H -u eobuilder /usr/local/bin/eobuilder -d bookworm,trixie --branch ${env.GIT_BRANCH} --hotfix ${SHORT_JOB_NAME}"
                    }
                }
            }
        }
    }
    post {
        always {
            script {
                def utils = new Utils()
                utils.mail_notify(currentBuild, env, 'ci+jenkins-hobo@entrouvert.org')
            }
        }
        success {
            cleanWs()
        }
    }
}
