// SPDX-FileCopyrightText: 2017 Fermi Research Alliance, LLC
// SPDX-License-Identifier: Apache-2.0

pipeline {
    agent { label 'podman' }
    stages{
        stage('DE modules tests') {
            parallel {
                stage('flake8') {
                    agent {
                        node {
                            label 'podman'
                            customWorkspace "${WORKSPACE}/${STAGE_NAME}"
                        }
                    }
                    options {
                        timeout(time: "${STAGE_TIMEOUT}", activity: false, unit: 'MINUTES')
                    }
                    steps {
                        script {
                            // DOCKER_IMAGE is defined through Jenkins project
                            flake8StageDockerImage="${DOCKER_IMAGE}_${BUILD_NUMBER}_${STAGE_NAME}"
                            // Set custom Build Name
                            if (params.GITHUB_PR_NUMBER) {
                                if (params.GITHUB_PR_STATE == 'CLOSED') {
                                    currentBuild.displayName="${BUILD_NUMBER}#${EL_VERSION}#PR#${GITHUB_PR_NUMBER}#CLOSED"
                                } else {
                                    currentBuild.displayName="${BUILD_NUMBER}#${EL_VERSION}#PR#${GITHUB_PR_NUMBER}"
                                }
                            } else {
                                currentBuild.displayName="${BUILD_NUMBER}#${BRANCH}"
                            }
                        }
                        echo "cleanup workspace"
                        sh 'for f in $(ls -A); do rm -rf ${f}; done'
                        // DE_MOD_REPO is defined through Jenkins project
                        echo "clone decisionengine_modules code from ${DE_MOD_REPO}"
                        sh '''
                            git clone ${DE_MOD_REPO}
                            cd decisionengine_modules
                            echo "checkout ${BRANCH} branch"
                            git checkout ${BRANCH}
                            echo GITHUB_PR_NUMBER: ${GITHUB_PR_NUMBER} - GITHUB_PR_STATE: ${GITHUB_PR_STATE}
                            if [[ -n ${GITHUB_PR_NUMBER} && ${GITHUB_PR_STATE} == OPEN ]]; then
                                git fetch origin pull/${GITHUB_PR_NUMBER}/merge:merge${GITHUB_PR_NUMBER}
                                git checkout merge${GITHUB_PR_NUMBER}
                            fi
                            cd ..
                        '''
                        echo "prepare podman image ${flake8StageDockerImage}"
                        sh "podman build --pull --tag ${flake8StageDockerImage} --build-arg BASEIMAGE=docker.io/hepcloud/decision-engine-ci-el9:${BRANCH} --build-arg UID=\$(id -u) --build-arg GID=\$(id -g) -f decisionengine_modules/package/ci/EL9/Dockerfile decisionengine_modules/package/ci/EL9/"
                        echo "Run ${STAGE_NAME} tests"
                        sh "podman run --userns keep-id:uid=\$(id -u),gid=\$(id -g) --rm --env GITHUB_PR_NUMBER=${GITHUB_PR_NUMBER} --env PYTEST_TIMEOUT=${PYTEST_TIMEOUT} -v ${WORKSPACE}/decisionengine_modules:${WORKSPACE}/decisionengine_modules -w ${WORKSPACE}/decisionengine_modules ${flake8StageDockerImage} \"-m flake8\" \"flake8.log\" \"${BRANCH}\""
                    }
                    post {
                        always {
                            archiveArtifacts artifacts: "decisionengine_modules/flake8.log"
                            echo "cleanup podman image ${flake8StageDockerImage}"
                            sh "podman rmi ${flake8StageDockerImage}"
                        }
                    }
                }
                stage('unit_tests') {
                    agent {
                        node {
                            label 'podman'
                            customWorkspace "${WORKSPACE}/${STAGE_NAME}"
                        }
                    }
                    options {
                        timeout(time: "${STAGE_TIMEOUT}", activity: false, unit: 'MINUTES')
                    }
                    steps {
                        script {
                            // DOCKER_IMAGE is defined through Jenkins project
                            unit_testsStageDockerImage="${DOCKER_IMAGE}_${BUILD_NUMBER}_${STAGE_NAME}"
                        }
                        echo "cleanup workspace"
                        sh 'for f in $(ls -A); do rm -rf ${f}; done'
                        // DE_MOD_REPO is defined through Jenkins project
                        echo "clone decisionengine_modules code from ${DE_MOD_REPO}"
                        sh '''
                            git clone ${DE_MOD_REPO}
                            cd decisionengine_modules
                            echo "checkout ${BRANCH} branch"
                            git checkout ${BRANCH}
                            echo GITHUB_PR_NUMBER: ${GITHUB_PR_NUMBER} - GITHUB_PR_STATE: ${GITHUB_PR_STATE}
                            if [[ -n ${GITHUB_PR_NUMBER} && ${GITHUB_PR_STATE} == OPEN ]]; then
                                git fetch origin pull/${GITHUB_PR_NUMBER}/merge:merge${GITHUB_PR_NUMBER}
                                git checkout merge${GITHUB_PR_NUMBER}
                            fi
                            cd ..
                        '''
                        echo "prepare podman image ${unit_testsStageDockerImage}"
                        sh "podman build --pull --tag ${unit_testsStageDockerImage} --build-arg BASEIMAGE=docker.io/hepcloud/decision-engine-ci-el9:${BRANCH} --build-arg UID=\$(id -u) --build-arg GID=\$(id -g) -f decisionengine_modules/package/ci/EL9/Dockerfile decisionengine_modules/package/ci/EL9/"
                        echo "Run ${STAGE_NAME} tests"
                        sh "podman run --userns keep-id:uid=\$(id -u),gid=\$(id -g) --rm --env GITHUB_PR_NUMBER=${GITHUB_PR_NUMBER} --env PYTEST_TIMEOUT=${PYTEST_TIMEOUT} -v ${WORKSPACE}/decisionengine_modules:${WORKSPACE}/decisionengine_modules -w ${WORKSPACE}/decisionengine_modules ${unit_testsStageDockerImage} \"-m pytest --cov-report term --cov=decisionengine_modules --no-cov-on-fail\" \"pytest.log\" \"${BRANCH}\""
                    }
                    post {
                        always {
                            archiveArtifacts artifacts: "decisionengine_modules/pytest.log"
                            echo "cleanup podman image ${unit_testsStageDockerImage}"
                            sh "podman rmi ${unit_testsStageDockerImage}"
                            }
                    }
                }
                stage('rpmbuild') {
                    agent {
                        node {
                            label 'podman'
                            customWorkspace "${WORKSPACE}/${STAGE_NAME}"
                        }
                    }
                    options {
                        timeout(time: "${STAGE_TIMEOUT}", activity: false, unit: 'MINUTES')
                    }
                    steps {
                        script {
                            // DOCKER_IMAGE is defined through Jenkins project
                            rpmbuildStageDockerImage="${DOCKER_IMAGE}_${BUILD_NUMBER}_${STAGE_NAME}"
                        }
                        echo "cleanup workspace"
                        sh 'for f in $(ls -A); do rm -rf ${f}; done'
                        // DE_MOD_REPO is defined through Jenkins project
                        echo "clone decisionengine_modules code from ${DE_MOD_REPO}"
                        sh '''
                            git clone ${DE_MOD_REPO}
                            cd decisionengine_modules
                            echo "checkout ${BRANCH} branch"
                            git checkout ${BRANCH}
                            echo GITHUB_PR_NUMBER: ${GITHUB_PR_NUMBER} - GITHUB_PR_STATE: ${GITHUB_PR_STATE}
                            if [[ -n ${GITHUB_PR_NUMBER} && ${GITHUB_PR_STATE} == OPEN ]]; then
                                git fetch origin pull/${GITHUB_PR_NUMBER}/merge:merge${GITHUB_PR_NUMBER}
                                git checkout merge${GITHUB_PR_NUMBER}
                            fi
                            cd ..
                        '''
                        echo "prepare podman image ${rpmbuildStageDockerImage}"
                        sh "podman build --pull --tag ${rpmbuildStageDockerImage} --build-arg BASEIMAGE=docker.io/hepcloud/decision-engine-ci-el9:${BRANCH} --build-arg UID=\$(id -u) --build-arg GID=\$(id -g) -f decisionengine_modules/package/ci/EL9/Dockerfile decisionengine_modules/package/ci/EL9/"
                        echo "Run ${STAGE_NAME} tests"
                        sh "podman run --userns keep-id:uid=\$(id -u),gid=\$(id -g) --rm --env GITHUB_PR_NUMBER=${GITHUB_PR_NUMBER} --env PYTEST_TIMEOUT=${PYTEST_TIMEOUT} -v ${WORKSPACE}/decisionengine_modules:${WORKSPACE}/decisionengine_modules -w ${WORKSPACE}/decisionengine_modules ${rpmbuildStageDockerImage} \"setup.py bdist_rpm\" \"rpmbuild.log\" \"${BRANCH}\""
                    }
                    post {
                        always {
                            archiveArtifacts artifacts: "decisionengine_modules/rpmbuild.log,decisionengine_modules/dist/*.rpm"
                            echo "cleanup podman image ${rpmbuildStageDockerImage}"
                            sh "podman rmi ${rpmbuildStageDockerImage}"
                        }
                    }
                }
            }
        }
    }
}
