Spaces:
Paused
Paused
| ('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-")) | |
| } | |