def CleanBuildAndTest(String cmakeArgs) {
    sh """
    export CCACHE_DIR=/ccache
    rm -rf build
    mkdir build
    cd build
    cmake .. -G Ninja -DCMAKE_CXX_COMPILER_LAUNCHER=ccache ${cmakeArgs} 
    ninja
    ccache -s
    """
    catchError {
        sh '''
        cd build
        ctest --no-compress-output --test-output-size-passed 100000 --test-output-size-failed 100000 -T Test -j `nproc` --timeout 90 > /dev/null
        zstd Testing/*/Test.xml
        '''
    }
    xunit tools: [CTest(pattern: 'build/Testing/*/Test.xml')], skipPublishingChecks: false
    minio bucket: 'jenkins', credentialsId: 'jenkins-minio', excludes: '', host: 'minio.weaselab.dev', includes: 'build/Testing/*/Test.xml.zst', targetFolder: '${JOB_NAME}/${BUILD_NUMBER}/${STAGE_NAME}/'
}

pipeline {
    agent any
    stages {
        stage('Pre-commit') {
            agent {
                dockerfile {
                    args '-v /home/jenkins/ccache:/ccache'
                    reuseNode true
                }
            }
            steps {
                script {
                    env.HOME = env.WORKSPACE
                }
                sh 'pre-commit run --all-files --show-diff-on-failure'
            }
        }
        stage('64 bit versions') {
            agent {
                dockerfile {
                    args '-v /home/jenkins/ccache:/ccache'
                    reuseNode true
                }
            }
            steps {
                CleanBuildAndTest("-DCMAKE_CXX_FLAGS=-DUSE_64_BIT=1")
            }
        }
        stage('Debug') {
            agent {
                dockerfile {
                    args '-v /home/jenkins/ccache:/ccache'
                    reuseNode true
                }
            }
            steps {
                CleanBuildAndTest("-DCMAKE_BUILD_TYPE=Debug")
            }
        }
        stage('SIMD fallback') {
            agent {
                dockerfile {
                    args '-v /home/jenkins/ccache:/ccache'
                    reuseNode true
                }
            }
            steps {
                CleanBuildAndTest("-DUSE_SIMD_FALLBACK=ON")
            }
        }
        stage('Release [clang]') {
            agent {
                dockerfile {
                    args '-v /home/jenkins/ccache:/ccache'
                    reuseNode true
                }
            }
            steps {
                CleanBuildAndTest("-DCMAKE_CXX_FLAGS=-DNVALGRIND")
                recordIssues(tools: [clang()])
                sh '''
                cd build
                cpack -G DEB
                cpack -G RPM
                '''
                sh '''
                cd paper
                make
                '''
                minio bucket: 'jenkins', credentialsId: 'jenkins-minio', excludes: '', host: 'minio.weaselab.dev', includes: 'build/*.deb,build/*.rpm,paper/*.pdf', targetFolder: '${JOB_NAME}/${BUILD_NUMBER}/${STAGE_NAME}/'
            }
        }
        stage('gcc') {
            agent {
                dockerfile {
                    args '-v /home/jenkins/ccache:/ccache'
                    reuseNode true
                }
            }
            steps {
                CleanBuildAndTest("-DCMAKE_C_COMPILER=gcc -DCMAKE_CXX_COMPILER=g++")
                recordIssues(tools: [gcc()])
            }
        }
        stage('Release [clang,aarch64]') {
            agent {
                dockerfile {
                    args '-v /home/jenkins/ccache:/ccache'
                    reuseNode true
                }
            }
            steps {
                CleanBuildAndTest("-DCMAKE_TOOLCHAIN_FILE=../aarch64-toolchain.cmake -DCMAKE_CXX_FLAGS=-DNVALGRIND")
                sh '''
                cd build
                cpack -G DEB
                cpack -G RPM
                '''
                minio bucket: 'jenkins', credentialsId: 'jenkins-minio', excludes: '', host: 'minio.weaselab.dev', includes: 'build/*.deb,build/*.rpm', targetFolder: '${JOB_NAME}/${BUILD_NUMBER}/${STAGE_NAME}'
            }
        }
        stage('Coverage') {
            agent {
                dockerfile {
                    args '-v /home/jenkins/ccache:/ccache'
                    reuseNode true
                }
            }
            steps {
                script {
                    gcov_args = "-f ConflictSet.cpp -f LongestCommonPrefix.h -f Metrics.h --gcov-executable 'llvm-cov gcov' --exclude-noncode-lines"
                }
                CleanBuildAndTest("-DCMAKE_C_FLAGS=--coverage -DCMAKE_CXX_FLAGS=--coverage -DCMAKE_BUILD_TYPE=Debug -DDISABLE_TSAN=ON")
                sh """
                gcovr ${gcov_args} --cobertura > build/coverage.xml
                """
                recordCoverage qualityGates: [[criticality: 'NOTE', metric: 'MODULE']], tools: [[parser: 'COBERTURA', pattern: 'build/coverage.xml']]
                sh """
                gcovr ${gcov_args}
                gcovr ${gcov_args} --fail-under-line 100 > /dev/null
                """
            }
        }
    }
    post {
        always {
            emailext mimeType: 'text/html', body: '${SCRIPT, template="groovy-html.template"}', subject: "${env.JOB_NAME} - Build# ${env.BUILD_NUMBER} - ${currentBuild.currentResult}", to: 'andrew@weaselab.dev'
        }
    }
}
