#!/usr/bin/groovy @Library('test-shared-library@dai_pipeline') _ import ai.h2o.ci.buildsummary.StagesSummary import groovy.json.JsonOutput buildSummary('https://github.com/h2oai/h2ogpt', true) buildSummary.get().addStagesSummary(this, new StagesSummary()) def ALL_TESTS = [ "test_osx": [ install_deps: "TRAINING", test_target: "test_imports", node: "osx", test_markers: "not need_tokens and not need_gpu", timeout: 90, use_docker: false, env: ['PYTHON_BINARY=/Users/jenkins/anaconda/envs/h2ogpt-py3.10/bin/python'] ], "test_all": [ install_deps: "TRAINING,WIKI_EXTRA", test_target: "test", test_markers: "not need_tokens and not need_gpu", node: "DAIDEV-GPU || DAIDEV-2GPU", timeout: 90, use_docker: true, env: [] ], ] pipeline { agent none parameters { booleanParam(name: 'skipTesting', defaultValue: false, description: 'Skip testing') text(name: "testTargets", defaultValue: "${ALL_TESTS.keySet().join('\n')}", description: "A select set of tests to run") booleanParam(name: 'publish', defaultValue: false, description: 'Upload to HF') } options { ansiColor('xterm') timestamps() } stages { stage('Build') { agent { label "linux && docker" } steps { script { def shortHash = sh(returnStdout: true, script: 'git rev-parse --short HEAD').trim() def commitMsg = sh(returnStdout: true, script: 'git log -1 --pretty=format:"[%an] %s"').trim() currentBuild.displayName = "${env.BUILD_ID} - [${shortHash}]" currentBuild.description = "${commitMsg}" sh "make docker_build" docker.image("harbor.h2o.ai/library/python:3.10").inside("--entrypoint='' --security-opt seccomp=unconfined -e USE_WHEEL=1 -e HOME=${WORKSPACE}") { sh "make clean dist" } archiveArtifacts allowEmptyArchive: true, artifacts: "dist/h2ogpt-*.whl" stash includes: "dist/h2ogpt-*.whl", name: "wheel_file" } } } stage('Tests') { when { anyOf { expression { return !params.skipTesting } } beforeAgent true } agent { label "linux && docker" } steps { script { def testTargets = [:] params.testTargets.split('\n').findAll{ it.contains("test_") }.each { testName -> testTargets[testName] = { node("${ALL_TESTS[testName].node}") { buildSummary.stageWithSummary("${testName}", "${testName}") { buildSummary.setStageUrl("${testName}") timeout(time: ALL_TESTS[testName].timeout, unit: 'MINUTES') { script { try { dir("${testName}") { withEnv(ALL_TESTS[testName].env + ["PYTEST_TEST_NAME=_${testName}", "IS_PR_BUILD=${isPrBranch()}", "USE_WHEEL=1"]) { // cleanup and force the use of the installed wheel deleteDir() checkout scm unstash "wheel_file" sh "rm -rf *.py spaces models" // pull runtime details def dockerImage = sh(returnStdout: true, script: "make print-DOCKER_TEST_IMAGE").trim() def nvidiaSmiExitCode = sh(returnStdout: false, returnStatus: true, script: "nvidia-smi") // def dockerRuntime = "${nvidiaSmiExitCode}" == "0" ? "--runtime nvidia" : "" def dockerRuntime = "" // TODO: keep until lab machines are upgraded if (ALL_TESTS[testName].use_docker) { docker.image("${dockerImage}").inside("--entrypoint='' --security-opt seccomp=unconfined --ulimit core=-1 --init --pid=host -e USE_WHEEL=1 -e HOME=${WORKSPACE}/${testName} ${dockerRuntime}") { sh "nvidia-smi || true" sh "SKIP_MANUAL_TESTS=1 PYTHON_BINARY=/usr/bin/python3.10 make install" sh "SKIP_MANUAL_TESTS=1 PYTHON_BINARY=/usr/bin/python3.10 make install-${ALL_TESTS[testName].install_deps}" sh """DEFAULT_MARKERS="${ALL_TESTS[testName].test_markers}" SKIP_MANUAL_TESTS=1 PYTHON_BINARY=/usr/bin/python3.10 make ${ALL_TESTS[testName].test_target}""" } } else { sh "make venv" sh "SKIP_MANUAL_TESTS=1 PYTHON_BINARY=${WORKSPACE}/${testName}/venv/bin/python make install" sh "SKIP_MANUAL_TESTS=1 PYTHON_BINARY=${WORKSPACE}/${testName}/venv/bin/python make install-${ALL_TESTS[testName].install_deps}" sh """DEFAULT_MARKERS="${ALL_TESTS[testName].test_markers}" SKIP_MANUAL_TESTS=1 PYTHON_BINARY=${WORKSPACE}/${testName}/venv/bin/python make ${ALL_TESTS[testName].test_target}""" } } } } catch (e) { throw e } finally { sh "mv ${testName}/test_report.xml ${testName}/${testName}_report.xml" archiveArtifacts allowEmptyArchive: true, artifacts: "${testName}/${testName}_report.xml" junit testResults: "${testName}/${testName}_report.xml", keepLongStdio: true, allowEmptyResults: true } } } } } } } parallel(testTargets) } } } stage('Publish') { when { anyOf { expression { return params.publish } } beforeAgent true } agent { label "linux && docker" } steps { script { sh "make IS_PR_BUILD=${isPrBranch()} BUILD_NUMBER=${env.BUILD_ID} BUILD_BASE_NAME=${env.JOB_BASE_NAME} publish" } } } } } def isPrBranch() { return (env.CHANGE_BRANCH != null && env.CHANGE_BRANCH != '') || (env.BRANCH_NAME != null && env.BRANCH_NAME.startsWith("PR-")) }