blob: cf703c5ef62d69709f1b3b376e13484308fe2144 [file] [log] [blame]
#!groovy
// -*- mode: groovy -*-
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
// Jenkins pipeline
// See documents at https://jenkins.io/doc/book/pipeline/jenkinsfile/
// Docker env used for testing
// Different image may have different version tag
// because some of them are more stable than anoter.
//
// Docker images are maintained by PMC, cached in dockerhub
// and remains relatively stable over the time.
// Flow for upgrading docker env(need commiter)
//
// - Send PR to upgrade build script in the repo
// - Build the new docker image
// - Tag the docker image with a new version and push to a binary cache.
// - Update the version in the Jenkinsfile, send a PR
// - Fix any issues wrt to the new image version in the PR
// - Merge the PR and now we are in new version
// - Tag the new version as the lates
// - Periodically cleanup the old versions on local workers
//
// ============================= IMPORTANT NOTE =============================
// This file is generated by 'jenkins/generate.py'. Do not edit this file directly!
// Make edits to 'jenkins/Jenkinsfile.j2' and regenerate this with
// 'python3 jenkins/generate.py'
// Note: This timestamp is here to ensure that updates to the Jenkinsfile are
// always rebased on main before merging:
// Generated at 2022-07-11T10:48:20.696436
import org.jenkinsci.plugins.pipeline.modeldefinition.Utils
// NOTE: these lines are scanned by docker/dev_common.sh. Please update the regex as needed. -->
ci_lint = 'tlcpack/ci-lint:20220513-055910-fa834f67e'
ci_gpu = 'tlcpack/ci-gpu:20220619-055908-9bba7580b'
ci_cpu = 'tlcpack/ci-cpu:20220519-055908-ddfa1da69'
ci_wasm = 'tlcpack/ci-wasm:20220513-055910-fa834f67e'
ci_i386 = 'tlcpack/ci-i386:20220513-055910-fa834f67e'
ci_qemu = 'tlcpack/ci-qemu:20220517-094028-de21c8f2e'
ci_arm = 'tlcpack/ci-arm:20220513-055910-fa834f67e'
ci_hexagon = 'tlcpack/ci-hexagon:20220603-203325-cee74c9f8'
// <--- End of regex-scanned config.
// Parameters to allow overriding (in Jenkins UI), the images
// to be used by a given build. When provided, they take precedence
// over default values above.
properties([
parameters([
string(name: 'ci_arm_param', defaultValue: ''),
string(name: 'ci_cpu_param', defaultValue: ''),
string(name: 'ci_gpu_param', defaultValue: ''),
string(name: 'ci_hexagon_param', defaultValue: ''),
string(name: 'ci_i386_param', defaultValue: ''),
string(name: 'ci_lint_param', defaultValue: ''),
string(name: 'ci_qemu_param', defaultValue: ''),
string(name: 'ci_wasm_param', defaultValue: ''),
])
])
// Global variable assigned during Sanity Check that holds the sha1 which should be
// merged into the PR in all branches.
upstream_revision = null
// command to start a docker container
docker_run = 'docker/bash.sh --env CI --env TVM_SHARD_INDEX --env TVM_NUM_SHARDS --env RUN_DISPLAY_URL --env PLATFORM'
docker_build = 'docker/build.sh'
// timeout in minutes
max_time = 180
rebuild_docker_images = false
// skips builds from branch indexing; sourced from https://www.jvt.me/posts/2020/02/23/jenkins-multibranch-skip-branch-index/
// execute this before anything else, including requesting any time on an agent
if (currentBuild.getBuildCauses().toString().contains('BranchIndexingCause')) {
print "INFO: Build skipped due to trigger being Branch Indexing"
currentBuild.result = 'ABORTED' // optional, gives a better hint to the user that it's been skipped, rather than the default which shows it's successful
return
}
// Filenames for stashing between build and test steps
s3_prefix = "tvm-jenkins-artifacts-prod/tvm/${env.BRANCH_NAME}/${env.BUILD_NUMBER}"
// General note: Jenkins has limits on the size of a method (or top level code)
// that are pretty strict, so most usage of groovy methods in these templates
// are purely to satisfy the JVM
def per_exec_ws(folder) {
return "workspace/exec_${env.EXECUTOR_NUMBER}/" + folder
}
// initialize source codes
def init_git() {
checkout scm
// Add more info about job node
sh (
script: './tests/scripts/task_show_node_info.sh',
label: 'Show executor node info',
)
// Determine merge commit to use for all stages
sh (
script: 'git fetch origin v0.9.0',
label: 'Fetch upstream',
)
if (upstream_revision == null) {
upstream_revision = sh(
script: 'git log -1 FETCH_HEAD --format=\'%H\'',
label: 'Determine upstream revision',
returnStdout: true,
).trim()
}
sh (
script: "git -c user.name=TVM-Jenkins -c user.email=jenkins@tvm.apache.org merge ${upstream_revision}",
label: 'Merge to origin/v0.9.0'
)
sh(
script: '''
set -eux
n=0
max_retries=3
backoff_max=30
until [ "$n" -ge $max_retries ]
do
timeout 5m git submodule update --init -f --jobs 0 && break
n=$((n+1))
if [ "$n" -eq $max_retries ]; then
echo "failed to update $n / $max_retries, giving up"
exit 1
fi
WAIT=$((RANDOM % "$backoff_max"))
echo "failed to update $n / $max_retries, waiting $WAIT to try again"
sleep $WAIT
done
''',
label: 'Update git submodules',
)
}
def docker_init(image) {
// Clear out all Docker images that aren't going to be used
sh(
script: """
set -eux
docker image ls --all
IMAGES=\$(docker image ls --all --format '{{.Repository}}:{{.Tag}} {{.ID}}')
echo -e "Found images:\\n\$IMAGES"
echo "\$IMAGES" | { grep -vE '${image}' || test \$? = 1; } | { xargs docker rmi || test \$? = 123; }
docker image ls --all
""",
label: 'Clean old Docker images',
)
if (image.contains("amazonaws.com")) {
// If this string is in the image name it's from ECR and needs to be pulled
// with the right credentials
ecr_pull(image)
} else {
sh(
script: "docker pull ${image}",
label: 'Pull docker image',
)
}
}
def should_skip_slow_tests(pr_number) {
withCredentials([string(
credentialsId: 'tvm-bot-jenkins-reader',
variable: 'GITHUB_TOKEN',
)]) {
// Exit code of 1 means run slow tests, exit code of 0 means skip slow tests
result = sh (
returnStatus: true,
script: "./tests/scripts/should_run_slow_tests.py --pr '${pr_number}'",
label: 'Check if CI should run slow tests',
)
}
return result == 0
}
def cancel_previous_build() {
// cancel previous build if it is not on v0.9.0.
if (env.BRANCH_NAME != 'v0.9.0') {
def buildNumber = env.BUILD_NUMBER as int
// Milestone API allows us to cancel previous build
// with the same milestone number
if (buildNumber > 1) milestone(buildNumber - 1)
milestone(buildNumber)
}
}
def should_skip_ci(pr_number) {
if (env.BRANCH_NAME == null || !env.BRANCH_NAME.startsWith('PR-')) {
// never skip CI on build sourced from a branch
return false
}
glob_skip_ci_code = sh (
returnStatus: true,
script: "./tests/scripts/git_skip_ci_globs.py",
label: 'Check if CI should be skipped due to changed files',
)
if (glob_skip_ci_code == 0) {
return true
}
withCredentials([string(
credentialsId: 'tvm-bot-jenkins-reader',
variable: 'TOKEN',
)]) {
// Exit code of 1 means run full CI (or the script had an error, so run
// full CI just in case). Exit code of 0 means skip CI.
git_skip_ci_code = sh (
returnStatus: true,
script: "./tests/scripts/git_skip_ci.py --pr '${pr_number}'",
label: 'Check if CI should be skipped',
)
}
return git_skip_ci_code == 0
}
def prepare() {
stage('Prepare') {
node('CPU-SMALL') {
ws("workspace/exec_${env.EXECUTOR_NUMBER}/tvm/prepare") {
init_git()
if (env.DETERMINE_DOCKER_IMAGES == 'yes') {
sh(
script: "./tests/scripts/determine_docker_images.py ci_arm=${ci_arm} ci_cpu=${ci_cpu} ci_gpu=${ci_gpu} ci_hexagon=${ci_hexagon} ci_i386=${ci_i386} ci_lint=${ci_lint} ci_qemu=${ci_qemu} ci_wasm=${ci_wasm} ",
label: 'Decide whether to use tlcpack or tlcpackstaging for Docker images',
)
// Pull image names from the results of should_rebuild_docker.py
ci_arm = sh(
script: "cat .docker-image-names/ci_arm",
label: "Find docker image name for ci_arm",
returnStdout: true,
).trim()
ci_cpu = sh(
script: "cat .docker-image-names/ci_cpu",
label: "Find docker image name for ci_cpu",
returnStdout: true,
).trim()
ci_gpu = sh(
script: "cat .docker-image-names/ci_gpu",
label: "Find docker image name for ci_gpu",
returnStdout: true,
).trim()
ci_hexagon = sh(
script: "cat .docker-image-names/ci_hexagon",
label: "Find docker image name for ci_hexagon",
returnStdout: true,
).trim()
ci_i386 = sh(
script: "cat .docker-image-names/ci_i386",
label: "Find docker image name for ci_i386",
returnStdout: true,
).trim()
ci_lint = sh(
script: "cat .docker-image-names/ci_lint",
label: "Find docker image name for ci_lint",
returnStdout: true,
).trim()
ci_qemu = sh(
script: "cat .docker-image-names/ci_qemu",
label: "Find docker image name for ci_qemu",
returnStdout: true,
).trim()
ci_wasm = sh(
script: "cat .docker-image-names/ci_wasm",
label: "Find docker image name for ci_wasm",
returnStdout: true,
).trim()
}
ci_arm = params.ci_arm_param ?: ci_arm
ci_cpu = params.ci_cpu_param ?: ci_cpu
ci_gpu = params.ci_gpu_param ?: ci_gpu
ci_hexagon = params.ci_hexagon_param ?: ci_hexagon
ci_i386 = params.ci_i386_param ?: ci_i386
ci_lint = params.ci_lint_param ?: ci_lint
ci_qemu = params.ci_qemu_param ?: ci_qemu
ci_wasm = params.ci_wasm_param ?: ci_wasm
sh (script: """
echo "Docker images being used in this build:"
echo " ci_arm = ${ci_arm}"
echo " ci_cpu = ${ci_cpu}"
echo " ci_gpu = ${ci_gpu}"
echo " ci_hexagon = ${ci_hexagon}"
echo " ci_i386 = ${ci_i386}"
echo " ci_lint = ${ci_lint}"
echo " ci_qemu = ${ci_qemu}"
echo " ci_wasm = ${ci_wasm}"
""", label: 'Docker image names')
is_docs_only_build = sh (
returnStatus: true,
script: './tests/scripts/git_change_docs.sh',
label: 'Check for docs only changes',
)
skip_ci = should_skip_ci(env.CHANGE_ID)
skip_slow_tests = should_skip_slow_tests(env.CHANGE_ID)
rebuild_docker_images = sh (
returnStatus: true,
script: './tests/scripts/git_change_docker.sh',
label: 'Check for any docker changes',
)
if (skip_ci) {
// Don't rebuild when skipping CI
rebuild_docker_images = false
}
}
}
}
}
def ecr_push(full_name) {
aws_account_id = sh(
returnStdout: true,
script: 'aws sts get-caller-identity | grep Account | cut -f4 -d\\"',
label: 'Get AWS ID'
).trim()
def ecr_name = "${aws_account_id}.dkr.ecr.us-west-2.amazonaws.com/${full_name}"
try {
withEnv([
"AWS_ACCOUNT_ID=${aws_account_id}",
'AWS_DEFAULT_REGION=us-west-2',
"AWS_ECR_REPO=${aws_account_id}.dkr.ecr.us-west-2.amazonaws.com"]) {
sh(
script: '''
set -eux
aws ecr get-login-password --region $AWS_DEFAULT_REGION | docker login --username AWS --password-stdin $AWS_ECR_REPO
''',
label: 'Log in to ECR'
)
sh(
script: """
set -x
docker tag ${full_name} \$AWS_ECR_REPO/${full_name}
docker push \$AWS_ECR_REPO/${full_name}
""",
label: 'Upload image to ECR'
)
}
} finally {
withEnv([
"AWS_ACCOUNT_ID=${aws_account_id}",
'AWS_DEFAULT_REGION=us-west-2',
"AWS_ECR_REPO=${aws_account_id}.dkr.ecr.us-west-2.amazonaws.com"]) {
sh(
script: 'docker logout $AWS_ECR_REPO',
label: 'Clean up login credentials'
)
}
}
return ecr_name
}
def ecr_pull(full_name) {
aws_account_id = sh(
returnStdout: true,
script: 'aws sts get-caller-identity | grep Account | cut -f4 -d\\"',
label: 'Get AWS ID'
).trim()
try {
withEnv([
"AWS_ACCOUNT_ID=${aws_account_id}",
'AWS_DEFAULT_REGION=us-west-2',
"AWS_ECR_REPO=${aws_account_id}.dkr.ecr.us-west-2.amazonaws.com"]) {
sh(
script: '''
set -eux
aws ecr get-login-password --region $AWS_DEFAULT_REGION | docker login --username AWS --password-stdin $AWS_ECR_REPO
''',
label: 'Log in to ECR'
)
sh(
script: """
set -eux
docker pull ${full_name}
""",
label: 'Pull image from ECR'
)
}
} finally {
withEnv([
"AWS_ACCOUNT_ID=${aws_account_id}",
'AWS_DEFAULT_REGION=us-west-2',
"AWS_ECR_REPO=${aws_account_id}.dkr.ecr.us-west-2.amazonaws.com"]) {
sh(
script: 'docker logout $AWS_ECR_REPO',
label: 'Clean up login credentials'
)
}
}
}
def build_image(image_name) {
hash = sh(
returnStdout: true,
script: 'git log -1 --format=\'%h\''
).trim()
def full_name = "${image_name}:${env.BRANCH_NAME}-${hash}-${env.BUILD_NUMBER}"
sh(
script: "${docker_build} ${image_name} --spec ${full_name}",
label: 'Build docker image'
)
return ecr_push(full_name)
}
def build_docker_images() {
stage('Docker Image Build') {
parallel(
'ci_arm': {
node('ARM') {
timeout(time: max_time, unit: 'MINUTES') {
init_git()
// We're purposefully not setting the built image here since they
// are not yet being uploaded to tlcpack
// ci_arm = build_image('ci_arm')
build_image('ci_arm')
}
}
},
'ci_cpu': {
node('CPU') {
timeout(time: max_time, unit: 'MINUTES') {
init_git()
// We're purposefully not setting the built image here since they
// are not yet being uploaded to tlcpack
// ci_cpu = build_image('ci_cpu')
build_image('ci_cpu')
}
}
},
'ci_gpu': {
node('CPU') {
timeout(time: max_time, unit: 'MINUTES') {
init_git()
// We're purposefully not setting the built image here since they
// are not yet being uploaded to tlcpack
// ci_gpu = build_image('ci_gpu')
build_image('ci_gpu')
}
}
},
'ci_hexagon': {
node('CPU') {
timeout(time: max_time, unit: 'MINUTES') {
init_git()
// We're purposefully not setting the built image here since they
// are not yet being uploaded to tlcpack
// ci_hexagon = build_image('ci_hexagon')
build_image('ci_hexagon')
}
}
},
'ci_i386': {
node('CPU') {
timeout(time: max_time, unit: 'MINUTES') {
init_git()
// We're purposefully not setting the built image here since they
// are not yet being uploaded to tlcpack
// ci_i386 = build_image('ci_i386')
build_image('ci_i386')
}
}
},
'ci_lint': {
node('CPU') {
timeout(time: max_time, unit: 'MINUTES') {
init_git()
// We're purposefully not setting the built image here since they
// are not yet being uploaded to tlcpack
// ci_lint = build_image('ci_lint')
build_image('ci_lint')
}
}
},
'ci_qemu': {
node('CPU') {
timeout(time: max_time, unit: 'MINUTES') {
init_git()
// We're purposefully not setting the built image here since they
// are not yet being uploaded to tlcpack
// ci_qemu = build_image('ci_qemu')
build_image('ci_qemu')
}
}
},
'ci_wasm': {
node('CPU') {
timeout(time: max_time, unit: 'MINUTES') {
init_git()
// We're purposefully not setting the built image here since they
// are not yet being uploaded to tlcpack
// ci_wasm = build_image('ci_wasm')
build_image('ci_wasm')
}
}
},
)
}
}
def lint() {
stage('Lint') {
parallel(
'Lint 1 of 2': {
node('CPU-SMALL') {
ws("workspace/exec_${env.EXECUTOR_NUMBER}/tvm/lint") {
docker_init(ci_lint)
init_git()
timeout(time: max_time, unit: 'MINUTES') {
withEnv([
'TVM_NUM_SHARDS=2',
'TVM_SHARD_INDEX=0'], {
sh (
script: "${docker_run} ${ci_lint} ./tests/scripts/task_lint.sh",
label: 'Run lint',
)
})
}
}
}
},
'Lint 2 of 2': {
node('CPU-SMALL') {
ws("workspace/exec_${env.EXECUTOR_NUMBER}/tvm/lint") {
docker_init(ci_lint)
init_git()
timeout(time: max_time, unit: 'MINUTES') {
withEnv([
'TVM_NUM_SHARDS=2',
'TVM_SHARD_INDEX=1'], {
sh (
script: "${docker_run} ${ci_lint} ./tests/scripts/task_lint.sh",
label: 'Run lint',
)
})
}
}
}
},
)
}
}
def ci_setup(image) {
sh (
script: "${docker_run} ${image} ./tests/scripts/task_ci_setup.sh",
label: 'Set up CI environment',
)
}
def python_unittest(image) {
sh (
script: "${docker_run} ${image} ./tests/scripts/task_python_unittest.sh",
label: 'Run Python unit tests',
)
}
def fsim_test(image) {
// sh (
// script: "${docker_run} ${image} ./tests/scripts/task_python_vta_fsim.sh",
// label: 'Run VTA tests in FSIM',
// )
}
def cmake_build(image, path, make_flag) {
sh (
script: "${docker_run} --env CI_NUM_EXECUTORS ${image} ./tests/scripts/task_build.py --sccache-bucket tvm-sccache-prod",
label: 'Run cmake build',
)
}
def cpp_unittest(image) {
sh (
script: "${docker_run} --env CI_NUM_EXECUTORS ${image} ./tests/scripts/task_cpp_unittest.sh",
label: 'Build and run C++ tests',
)
}
def add_microtvm_permissions() {
sh(
script: 'find build/microtvm_template_projects -type f | grep qemu-hack | xargs chmod +x',
label: 'Add execute permissions for microTVM files',
)
}
def add_hexagon_permissions() {
sh(
script: 'find build/hexagon_api_output -type f | xargs chmod +x',
label: 'Add execute permissions for hexagon files',
)
}
// Run make. First try to do an incremental make from a previous workspace in hope to
// accelerate the compilation. If something is wrong, clean the workspace and then
// build from scratch.
def make(docker_type, path, make_flag) {
timeout(time: max_time, unit: 'MINUTES') {
try {
cmake_build(docker_type, path, make_flag)
} catch (hudson.AbortException ae) {
// script exited due to user abort, directly throw instead of retry
if (ae.getMessage().contains('script returned exit code 143')) {
throw ae
}
echo 'Incremental compilation failed. Fall back to build from scratch'
sh (
script: "${docker_run} ${docker_type} ./tests/scripts/task_clean.sh ${path}",
label: 'Clear old cmake workspace',
)
cmake_build(docker_type, path, make_flag)
}
}
}
def build() {
stage('Build') {
environment {
SKIP_SLOW_TESTS = "${skip_slow_tests}"
}
parallel(
'BUILD: GPU': {
if (!skip_ci) {
node('CPU-SMALL') {
ws("workspace/exec_${env.EXECUTOR_NUMBER}/tvm/build-gpu") {
docker_init(ci_gpu)
init_git()
sh "${docker_run} --no-gpu ${ci_gpu} ./tests/scripts/task_config_build_gpu.sh build"
make("${ci_gpu} --no-gpu", 'build', '-j2')
sh(
script: """
set -eux
md5sum build/libtvm.so
aws s3 cp --no-progress build/libtvm.so s3://${s3_prefix}/gpu/build/libtvm.so
md5sum build/libtvm_runtime.so
aws s3 cp --no-progress build/libtvm_runtime.so s3://${s3_prefix}/gpu/build/libtvm_runtime.so
md5sum build/config.cmake
aws s3 cp --no-progress build/config.cmake s3://${s3_prefix}/gpu/build/config.cmake
aws s3 cp --no-progress build/microtvm_template_projects s3://${s3_prefix}/gpu/build/microtvm_template_projects --recursive
""",
label: 'Upload artifacts to S3',
)
// compiler test
sh "${docker_run} --no-gpu ${ci_gpu} ./tests/scripts/task_config_build_gpu_other.sh build2"
make("${ci_gpu} --no-gpu", 'build2', '-j2')
sh(
script: """
set -eux
md5sum build/libtvm.so
aws s3 cp --no-progress build/libtvm.so s3://${s3_prefix}/gpu2/build/libtvm.so
md5sum build/libtvm_runtime.so
aws s3 cp --no-progress build/libtvm_runtime.so s3://${s3_prefix}/gpu2/build/libtvm_runtime.so
md5sum build/config.cmake
aws s3 cp --no-progress build/config.cmake s3://${s3_prefix}/gpu2/build/config.cmake
""",
label: 'Upload artifacts to S3',
)
}
}
}
},
'BUILD: CPU': {
if (!skip_ci && is_docs_only_build != 1) {
node('CPU-SMALL') {
ws("workspace/exec_${env.EXECUTOR_NUMBER}/tvm/build-cpu") {
docker_init(ci_cpu)
init_git()
sh (
script: "${docker_run} ${ci_cpu} ./tests/scripts/task_config_build_cpu.sh build",
label: 'Create CPU cmake config',
)
make(ci_cpu, 'build', '-j2')
sh(
script: """
set -eux
md5sum build/libtvm.so
aws s3 cp --no-progress build/libtvm.so s3://${s3_prefix}/cpu/build/libtvm.so
md5sum build/libtvm_runtime.so
aws s3 cp --no-progress build/libtvm_runtime.so s3://${s3_prefix}/cpu/build/libtvm_runtime.so
md5sum build/config.cmake
aws s3 cp --no-progress build/config.cmake s3://${s3_prefix}/cpu/build/config.cmake
""",
label: 'Upload artifacts to S3',
)
timeout(time: max_time, unit: 'MINUTES') {
ci_setup(ci_cpu)
// sh "${docker_run} ${ci_cpu} ./tests/scripts/task_golang.sh"
// TODO(@jroesch): need to resolve CI issue will turn back on in follow up patch
sh (script: "${docker_run} ${ci_cpu} ./tests/scripts/task_rust.sh", label: 'Rust build and test')
}
}
}
} else {
Utils.markStageSkippedForConditional('BUILD: CPU')
}
},
'BUILD: WASM': {
if (!skip_ci && is_docs_only_build != 1) {
node('CPU-SMALL') {
ws("workspace/exec_${env.EXECUTOR_NUMBER}/tvm/build-wasm") {
docker_init(ci_wasm)
init_git()
sh (
script: "${docker_run} ${ci_wasm} ./tests/scripts/task_config_build_wasm.sh build",
label: 'Create WASM cmake config',
)
make(ci_wasm, 'build', '-j2')
cpp_unittest(ci_wasm)
timeout(time: max_time, unit: 'MINUTES') {
ci_setup(ci_wasm)
sh (
script: "${docker_run} ${ci_wasm} ./tests/scripts/task_web_wasm.sh",
label: 'Run WASM lint and tests',
)
}
}
}
} else {
Utils.markStageSkippedForConditional('BUILD: WASM')
}
},
'BUILD: i386': {
if (!skip_ci && is_docs_only_build != 1) {
node('CPU-SMALL') {
ws("workspace/exec_${env.EXECUTOR_NUMBER}/tvm/build-i386") {
docker_init(ci_i386)
init_git()
sh (
script: "${docker_run} ${ci_i386} ./tests/scripts/task_config_build_i386.sh build",
label: 'Create i386 cmake config',
)
make(ci_i386, 'build', '-j2')
sh(
script: """
set -eux
md5sum build/libtvm.so
aws s3 cp --no-progress build/libtvm.so s3://${s3_prefix}/i386/build/libtvm.so
md5sum build/libtvm_runtime.so
aws s3 cp --no-progress build/libtvm_runtime.so s3://${s3_prefix}/i386/build/libtvm_runtime.so
md5sum build/config.cmake
aws s3 cp --no-progress build/config.cmake s3://${s3_prefix}/i386/build/config.cmake
""",
label: 'Upload artifacts to S3',
)
}
}
} else {
Utils.markStageSkippedForConditional('BUILD: i386')
}
},
'BUILD: arm': {
if (!skip_ci && is_docs_only_build != 1) {
node('ARM-SMALL') {
ws("workspace/exec_${env.EXECUTOR_NUMBER}/tvm/build-arm") {
docker_init(ci_arm)
init_git()
sh (
script: "${docker_run} ${ci_arm} ./tests/scripts/task_config_build_arm.sh build",
label: 'Create ARM cmake config',
)
make(ci_arm, 'build', '-j4')
sh(
script: """
set -eux
md5sum build/libtvm.so
aws s3 cp --no-progress build/libtvm.so s3://${s3_prefix}/arm/build/libtvm.so
md5sum build/libtvm_runtime.so
aws s3 cp --no-progress build/libtvm_runtime.so s3://${s3_prefix}/arm/build/libtvm_runtime.so
md5sum build/config.cmake
aws s3 cp --no-progress build/config.cmake s3://${s3_prefix}/arm/build/config.cmake
""",
label: 'Upload artifacts to S3',
)
}
}
} else {
Utils.markStageSkippedForConditional('BUILD: arm')
}
},
'BUILD: QEMU': {
if (!skip_ci && is_docs_only_build != 1) {
node('CPU-SMALL') {
ws("workspace/exec_${env.EXECUTOR_NUMBER}/tvm/build-qemu") {
docker_init(ci_qemu)
init_git()
sh (
script: "${docker_run} ${ci_qemu} ./tests/scripts/task_config_build_qemu.sh build",
label: 'Create QEMU cmake config',
)
make(ci_qemu, 'build', '-j2')
sh(
script: """
set -eux
md5sum build/libtvm.so
aws s3 cp --no-progress build/libtvm.so s3://${s3_prefix}/qemu/build/libtvm.so
md5sum build/libtvm_runtime.so
aws s3 cp --no-progress build/libtvm_runtime.so s3://${s3_prefix}/qemu/build/libtvm_runtime.so
md5sum build/config.cmake
aws s3 cp --no-progress build/config.cmake s3://${s3_prefix}/qemu/build/config.cmake
aws s3 cp --no-progress build/microtvm_template_projects s3://${s3_prefix}/qemu/build/microtvm_template_projects --recursive
""",
label: 'Upload artifacts to S3',
)
}
}
} else {
Utils.markStageSkippedForConditional('BUILD: QEMU')
}
},
'BUILD: Hexagon': {
if (!skip_ci && is_docs_only_build != 1) {
node('CPU-SMALL') {
ws("workspace/exec_${env.EXECUTOR_NUMBER}/tvm/build-hexagon") {
docker_init(ci_hexagon)
init_git()
sh (
script: "${docker_run} ${ci_hexagon} ./tests/scripts/task_config_build_hexagon.sh build",
label: 'Create Hexagon cmake config',
)
make(ci_hexagon, 'build', '-j2')
sh (
script: "${docker_run} ${ci_hexagon} ./tests/scripts/task_build_hexagon_api.sh",
label: 'Build Hexagon API',
)
sh(
script: """
set -eux
md5sum build/libtvm.so
aws s3 cp --no-progress build/libtvm.so s3://${s3_prefix}/hexagon/build/libtvm.so
md5sum build/libtvm_runtime.so
aws s3 cp --no-progress build/libtvm_runtime.so s3://${s3_prefix}/hexagon/build/libtvm_runtime.so
md5sum build/config.cmake
aws s3 cp --no-progress build/config.cmake s3://${s3_prefix}/hexagon/build/config.cmake
aws s3 cp --no-progress build/hexagon_api_output s3://${s3_prefix}/hexagon/build/hexagon_api_output --recursive
""",
label: 'Upload artifacts to S3',
)
}
}
} else {
Utils.markStageSkippedForConditional('BUILD: Hexagon')
}
},
)
}
}
// We have to do this whacky split of the code from where it's used since the
// JVM limits method length to 64k and we easily exceed that with all this
// autogenerated code. This makes it so each test step is in its own method so
// that each individual method isn't too big.
def shard_run_unittest_GPU_1_of_3() {
if (!skip_ci && is_docs_only_build != 1) {
node('GPU') {
ws("workspace/exec_${env.EXECUTOR_NUMBER}/tvm/ut-python-gpu") {
try {
docker_init(ci_gpu)
init_git()
timeout(time: max_time, unit: 'MINUTES') {
withEnv([
'PLATFORM=gpu',
'TVM_NUM_SHARDS=3',
'TVM_SHARD_INDEX=0'], {
sh(
script: """
set -eux
aws s3 cp --no-progress s3://${s3_prefix}/gpu2/build/libtvm.so build/libtvm.so
md5sum build/libtvm.so
aws s3 cp --no-progress s3://${s3_prefix}/gpu2/build/libtvm_runtime.so build/libtvm_runtime.so
md5sum build/libtvm_runtime.so
aws s3 cp --no-progress s3://${s3_prefix}/gpu2/build/config.cmake build/config.cmake
md5sum build/config.cmake
""",
label: 'Download artifacts from S3',
)
cpp_unittest(ci_gpu)
sh(
script: """
set -eux
aws s3 cp --no-progress s3://${s3_prefix}/gpu/build/libtvm.so build/libtvm.so
md5sum build/libtvm.so
aws s3 cp --no-progress s3://${s3_prefix}/gpu/build/libtvm_runtime.so build/libtvm_runtime.so
md5sum build/libtvm_runtime.so
aws s3 cp --no-progress s3://${s3_prefix}/gpu/build/config.cmake build/config.cmake
md5sum build/config.cmake
""",
label: 'Download artifacts from S3',
)
ci_setup(ci_gpu)
cpp_unittest(ci_gpu)
sh (
script: "${docker_run} ${ci_gpu} ./tests/scripts/task_python_unittest_gpuonly.sh",
label: 'Run Python GPU unit tests',
)
sh (
script: "${docker_run} ${ci_gpu} ./tests/scripts/task_python_integration_gpuonly.sh",
label: 'Run Python GPU integration tests',
)
})
}
} finally {
sh(
script: """
set -eux
aws s3 cp --no-progress build/pytest-results s3://${s3_prefix}/pytest-results --recursive
""",
label: 'Upload JUnits to S3',
)
junit 'build/pytest-results/*.xml'
}
}
}
} else {
Utils.markStageSkippedForConditional('unittest: GPU 1 of 3')
}
}
def shard_run_unittest_GPU_2_of_3() {
if (!skip_ci && is_docs_only_build != 1) {
node('GPU') {
ws("workspace/exec_${env.EXECUTOR_NUMBER}/tvm/ut-python-gpu") {
try {
docker_init(ci_gpu)
init_git()
timeout(time: max_time, unit: 'MINUTES') {
withEnv([
'PLATFORM=gpu',
'TVM_NUM_SHARDS=3',
'TVM_SHARD_INDEX=1'], {
sh(
script: """
set -eux
aws s3 cp --no-progress s3://${s3_prefix}/gpu/build/libtvm.so build/libtvm.so
md5sum build/libtvm.so
aws s3 cp --no-progress s3://${s3_prefix}/gpu/build/libtvm_runtime.so build/libtvm_runtime.so
md5sum build/libtvm_runtime.so
aws s3 cp --no-progress s3://${s3_prefix}/gpu/build/config.cmake build/config.cmake
md5sum build/config.cmake
""",
label: 'Download artifacts from S3',
)
ci_setup(ci_gpu)
sh (
script: "${docker_run} ${ci_gpu} ./tests/scripts/task_java_unittest.sh",
label: 'Run Java unit tests',
)
sh (
script: "${docker_run} ${ci_gpu} ./tests/scripts/task_python_unittest_gpuonly.sh",
label: 'Run Python GPU unit tests',
)
sh (
script: "${docker_run} ${ci_gpu} ./tests/scripts/task_python_integration_gpuonly.sh",
label: 'Run Python GPU integration tests',
)
})
}
} finally {
sh(
script: """
set -eux
aws s3 cp --no-progress build/pytest-results s3://${s3_prefix}/pytest-results --recursive
""",
label: 'Upload JUnits to S3',
)
junit 'build/pytest-results/*.xml'
}
}
}
} else {
Utils.markStageSkippedForConditional('unittest: GPU 2 of 3')
}
}
def shard_run_unittest_GPU_3_of_3() {
if (!skip_ci && is_docs_only_build != 1) {
node('GPU') {
ws("workspace/exec_${env.EXECUTOR_NUMBER}/tvm/ut-python-gpu") {
try {
docker_init(ci_gpu)
init_git()
timeout(time: max_time, unit: 'MINUTES') {
withEnv([
'PLATFORM=gpu',
'TVM_NUM_SHARDS=3',
'TVM_SHARD_INDEX=2'], {
sh(
script: """
set -eux
aws s3 cp --no-progress s3://${s3_prefix}/gpu/build/libtvm.so build/libtvm.so
md5sum build/libtvm.so
aws s3 cp --no-progress s3://${s3_prefix}/gpu/build/libtvm_runtime.so build/libtvm_runtime.so
md5sum build/libtvm_runtime.so
aws s3 cp --no-progress s3://${s3_prefix}/gpu/build/config.cmake build/config.cmake
md5sum build/config.cmake
""",
label: 'Download artifacts from S3',
)
ci_setup(ci_gpu)
sh (
script: "${docker_run} ${ci_gpu} ./tests/scripts/task_python_unittest_gpuonly.sh",
label: 'Run Python GPU unit tests',
)
sh (
script: "${docker_run} ${ci_gpu} ./tests/scripts/task_python_integration_gpuonly.sh",
label: 'Run Python GPU integration tests',
)
})
}
} finally {
sh(
script: """
set -eux
aws s3 cp --no-progress build/pytest-results s3://${s3_prefix}/pytest-results --recursive
""",
label: 'Upload JUnits to S3',
)
junit 'build/pytest-results/*.xml'
}
}
}
} else {
Utils.markStageSkippedForConditional('unittest: GPU 3 of 3')
}
}
def shard_run_integration_CPU_1_of_6() {
if (!skip_ci && is_docs_only_build != 1) {
node('CPU-SMALL') {
ws("workspace/exec_${env.EXECUTOR_NUMBER}/tvm/integration-python-cpu") {
try {
docker_init(ci_cpu)
init_git()
timeout(time: max_time, unit: 'MINUTES') {
withEnv([
'PLATFORM=cpu',
'TVM_NUM_SHARDS=6',
'TVM_SHARD_INDEX=0'], {
sh(
script: """
set -eux
aws s3 cp --no-progress s3://${s3_prefix}/cpu/build/libtvm.so build/libtvm.so
md5sum build/libtvm.so
aws s3 cp --no-progress s3://${s3_prefix}/cpu/build/libtvm_runtime.so build/libtvm_runtime.so
md5sum build/libtvm_runtime.so
aws s3 cp --no-progress s3://${s3_prefix}/cpu/build/config.cmake build/config.cmake
md5sum build/config.cmake
""",
label: 'Download artifacts from S3',
)
ci_setup(ci_cpu)
sh (
script: "${docker_run} ${ci_cpu} ./tests/scripts/task_python_integration.sh",
label: 'Run CPU integration tests',
)
})
}
} finally {
sh(
script: """
set -eux
aws s3 cp --no-progress build/pytest-results s3://${s3_prefix}/pytest-results --recursive
""",
label: 'Upload JUnits to S3',
)
junit 'build/pytest-results/*.xml'
}
}
}
} else {
Utils.markStageSkippedForConditional('integration: CPU 1 of 6')
}
}
def shard_run_integration_CPU_2_of_6() {
if (!skip_ci && is_docs_only_build != 1) {
node('CPU-SMALL') {
ws("workspace/exec_${env.EXECUTOR_NUMBER}/tvm/integration-python-cpu") {
try {
docker_init(ci_cpu)
init_git()
timeout(time: max_time, unit: 'MINUTES') {
withEnv([
'PLATFORM=cpu',
'TVM_NUM_SHARDS=6',
'TVM_SHARD_INDEX=1'], {
sh(
script: """
set -eux
aws s3 cp --no-progress s3://${s3_prefix}/cpu/build/libtvm.so build/libtvm.so
md5sum build/libtvm.so
aws s3 cp --no-progress s3://${s3_prefix}/cpu/build/libtvm_runtime.so build/libtvm_runtime.so
md5sum build/libtvm_runtime.so
aws s3 cp --no-progress s3://${s3_prefix}/cpu/build/config.cmake build/config.cmake
md5sum build/config.cmake
""",
label: 'Download artifacts from S3',
)
ci_setup(ci_cpu)
sh (
script: "${docker_run} ${ci_cpu} ./tests/scripts/task_python_integration.sh",
label: 'Run CPU integration tests',
)
})
}
} finally {
sh(
script: """
set -eux
aws s3 cp --no-progress build/pytest-results s3://${s3_prefix}/pytest-results --recursive
""",
label: 'Upload JUnits to S3',
)
junit 'build/pytest-results/*.xml'
}
}
}
} else {
Utils.markStageSkippedForConditional('integration: CPU 2 of 6')
}
}
def shard_run_integration_CPU_3_of_6() {
if (!skip_ci && is_docs_only_build != 1) {
node('CPU-SMALL') {
ws("workspace/exec_${env.EXECUTOR_NUMBER}/tvm/integration-python-cpu") {
try {
docker_init(ci_cpu)
init_git()
timeout(time: max_time, unit: 'MINUTES') {
withEnv([
'PLATFORM=cpu',
'TVM_NUM_SHARDS=6',
'TVM_SHARD_INDEX=2'], {
sh(
script: """
set -eux
aws s3 cp --no-progress s3://${s3_prefix}/cpu/build/libtvm.so build/libtvm.so
md5sum build/libtvm.so
aws s3 cp --no-progress s3://${s3_prefix}/cpu/build/libtvm_runtime.so build/libtvm_runtime.so
md5sum build/libtvm_runtime.so
aws s3 cp --no-progress s3://${s3_prefix}/cpu/build/config.cmake build/config.cmake
md5sum build/config.cmake
""",
label: 'Download artifacts from S3',
)
ci_setup(ci_cpu)
sh (
script: "${docker_run} ${ci_cpu} ./tests/scripts/task_python_integration.sh",
label: 'Run CPU integration tests',
)
})
}
} finally {
sh(
script: """
set -eux
aws s3 cp --no-progress build/pytest-results s3://${s3_prefix}/pytest-results --recursive
""",
label: 'Upload JUnits to S3',
)
junit 'build/pytest-results/*.xml'
}
}
}
} else {
Utils.markStageSkippedForConditional('integration: CPU 3 of 6')
}
}
def shard_run_integration_CPU_4_of_6() {
if (!skip_ci && is_docs_only_build != 1) {
node('CPU-SMALL') {
ws("workspace/exec_${env.EXECUTOR_NUMBER}/tvm/integration-python-cpu") {
try {
docker_init(ci_cpu)
init_git()
timeout(time: max_time, unit: 'MINUTES') {
withEnv([
'PLATFORM=cpu',
'TVM_NUM_SHARDS=6',
'TVM_SHARD_INDEX=3'], {
sh(
script: """
set -eux
aws s3 cp --no-progress s3://${s3_prefix}/cpu/build/libtvm.so build/libtvm.so
md5sum build/libtvm.so
aws s3 cp --no-progress s3://${s3_prefix}/cpu/build/libtvm_runtime.so build/libtvm_runtime.so
md5sum build/libtvm_runtime.so
aws s3 cp --no-progress s3://${s3_prefix}/cpu/build/config.cmake build/config.cmake
md5sum build/config.cmake
""",
label: 'Download artifacts from S3',
)
ci_setup(ci_cpu)
sh (
script: "${docker_run} ${ci_cpu} ./tests/scripts/task_python_integration.sh",
label: 'Run CPU integration tests',
)
})
}
} finally {
sh(
script: """
set -eux
aws s3 cp --no-progress build/pytest-results s3://${s3_prefix}/pytest-results --recursive
""",
label: 'Upload JUnits to S3',
)
junit 'build/pytest-results/*.xml'
}
}
}
} else {
Utils.markStageSkippedForConditional('integration: CPU 4 of 6')
}
}
def shard_run_integration_CPU_5_of_6() {
if (!skip_ci && is_docs_only_build != 1) {
node('CPU-SMALL') {
ws("workspace/exec_${env.EXECUTOR_NUMBER}/tvm/integration-python-cpu") {
try {
docker_init(ci_cpu)
init_git()
timeout(time: max_time, unit: 'MINUTES') {
withEnv([
'PLATFORM=cpu',
'TVM_NUM_SHARDS=6',
'TVM_SHARD_INDEX=4'], {
sh(
script: """
set -eux
aws s3 cp --no-progress s3://${s3_prefix}/cpu/build/libtvm.so build/libtvm.so
md5sum build/libtvm.so
aws s3 cp --no-progress s3://${s3_prefix}/cpu/build/libtvm_runtime.so build/libtvm_runtime.so
md5sum build/libtvm_runtime.so
aws s3 cp --no-progress s3://${s3_prefix}/cpu/build/config.cmake build/config.cmake
md5sum build/config.cmake
""",
label: 'Download artifacts from S3',
)
ci_setup(ci_cpu)
sh (
script: "${docker_run} ${ci_cpu} ./tests/scripts/task_python_integration.sh",
label: 'Run CPU integration tests',
)
})
}
} finally {
sh(
script: """
set -eux
aws s3 cp --no-progress build/pytest-results s3://${s3_prefix}/pytest-results --recursive
""",
label: 'Upload JUnits to S3',
)
junit 'build/pytest-results/*.xml'
}
}
}
} else {
Utils.markStageSkippedForConditional('integration: CPU 5 of 6')
}
}
def shard_run_integration_CPU_6_of_6() {
if (!skip_ci && is_docs_only_build != 1) {
node('CPU-SMALL') {
ws("workspace/exec_${env.EXECUTOR_NUMBER}/tvm/integration-python-cpu") {
try {
docker_init(ci_cpu)
init_git()
timeout(time: max_time, unit: 'MINUTES') {
withEnv([
'PLATFORM=cpu',
'TVM_NUM_SHARDS=6',
'TVM_SHARD_INDEX=5'], {
sh(
script: """
set -eux
aws s3 cp --no-progress s3://${s3_prefix}/cpu/build/libtvm.so build/libtvm.so
md5sum build/libtvm.so
aws s3 cp --no-progress s3://${s3_prefix}/cpu/build/libtvm_runtime.so build/libtvm_runtime.so
md5sum build/libtvm_runtime.so
aws s3 cp --no-progress s3://${s3_prefix}/cpu/build/config.cmake build/config.cmake
md5sum build/config.cmake
""",
label: 'Download artifacts from S3',
)
ci_setup(ci_cpu)
sh (
script: "${docker_run} ${ci_cpu} ./tests/scripts/task_python_integration.sh",
label: 'Run CPU integration tests',
)
})
}
} finally {
sh(
script: """
set -eux
aws s3 cp --no-progress build/pytest-results s3://${s3_prefix}/pytest-results --recursive
""",
label: 'Upload JUnits to S3',
)
junit 'build/pytest-results/*.xml'
}
}
}
} else {
Utils.markStageSkippedForConditional('integration: CPU 6 of 6')
}
}
def shard_run_python_i386_1_of_5() {
if (!skip_ci && is_docs_only_build != 1) {
node('CPU-SMALL') {
ws("workspace/exec_${env.EXECUTOR_NUMBER}/tvm/integration-python-i386") {
try {
docker_init(ci_i386)
init_git()
timeout(time: max_time, unit: 'MINUTES') {
withEnv([
'PLATFORM=i386',
'TVM_NUM_SHARDS=5',
'TVM_SHARD_INDEX=0'], {
sh(
script: """
set -eux
aws s3 cp --no-progress s3://${s3_prefix}/i386/build/libtvm.so build/libtvm.so
md5sum build/libtvm.so
aws s3 cp --no-progress s3://${s3_prefix}/i386/build/libtvm_runtime.so build/libtvm_runtime.so
md5sum build/libtvm_runtime.so
aws s3 cp --no-progress s3://${s3_prefix}/i386/build/config.cmake build/config.cmake
md5sum build/config.cmake
""",
label: 'Download artifacts from S3',
)
ci_setup(ci_i386)
cpp_unittest(ci_i386)
python_unittest(ci_i386)
sh (
script: "${docker_run} ${ci_i386} ./tests/scripts/task_python_integration_i386only.sh",
label: 'Run i386 integration tests',
)
})
}
} finally {
sh(
script: """
set -eux
aws s3 cp --no-progress build/pytest-results s3://${s3_prefix}/pytest-results --recursive
""",
label: 'Upload JUnits to S3',
)
junit 'build/pytest-results/*.xml'
}
}
}
} else {
Utils.markStageSkippedForConditional('python: i386 1 of 5')
}
}
def shard_run_python_i386_2_of_5() {
if (!skip_ci && is_docs_only_build != 1) {
node('CPU-SMALL') {
ws("workspace/exec_${env.EXECUTOR_NUMBER}/tvm/integration-python-i386") {
try {
docker_init(ci_i386)
init_git()
timeout(time: max_time, unit: 'MINUTES') {
withEnv([
'PLATFORM=i386',
'TVM_NUM_SHARDS=5',
'TVM_SHARD_INDEX=1'], {
sh(
script: """
set -eux
aws s3 cp --no-progress s3://${s3_prefix}/i386/build/libtvm.so build/libtvm.so
md5sum build/libtvm.so
aws s3 cp --no-progress s3://${s3_prefix}/i386/build/libtvm_runtime.so build/libtvm_runtime.so
md5sum build/libtvm_runtime.so
aws s3 cp --no-progress s3://${s3_prefix}/i386/build/config.cmake build/config.cmake
md5sum build/config.cmake
""",
label: 'Download artifacts from S3',
)
ci_setup(ci_i386)
python_unittest(ci_i386)
sh (
script: "${docker_run} ${ci_i386} ./tests/scripts/task_python_integration_i386only.sh",
label: 'Run i386 integration tests',
)
fsim_test(ci_i386)
})
}
} finally {
sh(
script: """
set -eux
aws s3 cp --no-progress build/pytest-results s3://${s3_prefix}/pytest-results --recursive
""",
label: 'Upload JUnits to S3',
)
junit 'build/pytest-results/*.xml'
}
}
}
} else {
Utils.markStageSkippedForConditional('python: i386 2 of 5')
}
}
def shard_run_python_i386_3_of_5() {
if (!skip_ci && is_docs_only_build != 1) {
node('CPU-SMALL') {
ws("workspace/exec_${env.EXECUTOR_NUMBER}/tvm/integration-python-i386") {
try {
docker_init(ci_i386)
init_git()
timeout(time: max_time, unit: 'MINUTES') {
withEnv([
'PLATFORM=i386',
'TVM_NUM_SHARDS=5',
'TVM_SHARD_INDEX=2'], {
sh(
script: """
set -eux
aws s3 cp --no-progress s3://${s3_prefix}/i386/build/libtvm.so build/libtvm.so
md5sum build/libtvm.so
aws s3 cp --no-progress s3://${s3_prefix}/i386/build/libtvm_runtime.so build/libtvm_runtime.so
md5sum build/libtvm_runtime.so
aws s3 cp --no-progress s3://${s3_prefix}/i386/build/config.cmake build/config.cmake
md5sum build/config.cmake
""",
label: 'Download artifacts from S3',
)
ci_setup(ci_i386)
python_unittest(ci_i386)
sh (
script: "${docker_run} ${ci_i386} ./tests/scripts/task_python_integration_i386only.sh",
label: 'Run i386 integration tests',
)
})
}
} finally {
sh(
script: """
set -eux
aws s3 cp --no-progress build/pytest-results s3://${s3_prefix}/pytest-results --recursive
""",
label: 'Upload JUnits to S3',
)
junit 'build/pytest-results/*.xml'
}
}
}
} else {
Utils.markStageSkippedForConditional('python: i386 3 of 5')
}
}
def shard_run_python_i386_4_of_5() {
if (!skip_ci && is_docs_only_build != 1) {
node('CPU-SMALL') {
ws("workspace/exec_${env.EXECUTOR_NUMBER}/tvm/integration-python-i386") {
try {
docker_init(ci_i386)
init_git()
timeout(time: max_time, unit: 'MINUTES') {
withEnv([
'PLATFORM=i386',
'TVM_NUM_SHARDS=5',
'TVM_SHARD_INDEX=3'], {
sh(
script: """
set -eux
aws s3 cp --no-progress s3://${s3_prefix}/i386/build/libtvm.so build/libtvm.so
md5sum build/libtvm.so
aws s3 cp --no-progress s3://${s3_prefix}/i386/build/libtvm_runtime.so build/libtvm_runtime.so
md5sum build/libtvm_runtime.so
aws s3 cp --no-progress s3://${s3_prefix}/i386/build/config.cmake build/config.cmake
md5sum build/config.cmake
""",
label: 'Download artifacts from S3',
)
ci_setup(ci_i386)
python_unittest(ci_i386)
sh (
script: "${docker_run} ${ci_i386} ./tests/scripts/task_python_integration_i386only.sh",
label: 'Run i386 integration tests',
)
})
}
} finally {
sh(
script: """
set -eux
aws s3 cp --no-progress build/pytest-results s3://${s3_prefix}/pytest-results --recursive
""",
label: 'Upload JUnits to S3',
)
junit 'build/pytest-results/*.xml'
}
}
}
} else {
Utils.markStageSkippedForConditional('python: i386 4 of 5')
}
}
def shard_run_python_i386_5_of_5() {
if (!skip_ci && is_docs_only_build != 1) {
node('CPU-SMALL') {
ws("workspace/exec_${env.EXECUTOR_NUMBER}/tvm/integration-python-i386") {
try {
docker_init(ci_i386)
init_git()
timeout(time: max_time, unit: 'MINUTES') {
withEnv([
'PLATFORM=i386',
'TVM_NUM_SHARDS=5',
'TVM_SHARD_INDEX=4'], {
sh(
script: """
set -eux
aws s3 cp --no-progress s3://${s3_prefix}/i386/build/libtvm.so build/libtvm.so
md5sum build/libtvm.so
aws s3 cp --no-progress s3://${s3_prefix}/i386/build/libtvm_runtime.so build/libtvm_runtime.so
md5sum build/libtvm_runtime.so
aws s3 cp --no-progress s3://${s3_prefix}/i386/build/config.cmake build/config.cmake
md5sum build/config.cmake
""",
label: 'Download artifacts from S3',
)
ci_setup(ci_i386)
python_unittest(ci_i386)
sh (
script: "${docker_run} ${ci_i386} ./tests/scripts/task_python_integration_i386only.sh",
label: 'Run i386 integration tests',
)
})
}
} finally {
sh(
script: """
set -eux
aws s3 cp --no-progress build/pytest-results s3://${s3_prefix}/pytest-results --recursive
""",
label: 'Upload JUnits to S3',
)
junit 'build/pytest-results/*.xml'
}
}
}
} else {
Utils.markStageSkippedForConditional('python: i386 5 of 5')
}
}
def shard_run_test_Hexagon_1_of_7() {
if (!skip_ci && is_docs_only_build != 1) {
node('CPU-SMALL') {
ws("workspace/exec_${env.EXECUTOR_NUMBER}/tvm/test-hexagon") {
try {
docker_init(ci_hexagon)
init_git()
timeout(time: max_time, unit: 'MINUTES') {
withEnv([
'PLATFORM=hexagon',
'TVM_NUM_SHARDS=7',
'TVM_SHARD_INDEX=0'], {
sh(
script: """
set -eux
aws s3 cp --no-progress s3://${s3_prefix}/hexagon/build/libtvm.so build/libtvm.so
md5sum build/libtvm.so
aws s3 cp --no-progress s3://${s3_prefix}/hexagon/build/libtvm_runtime.so build/libtvm_runtime.so
md5sum build/libtvm_runtime.so
aws s3 cp --no-progress s3://${s3_prefix}/hexagon/build/config.cmake build/config.cmake
md5sum build/config.cmake
aws s3 cp --no-progress s3://${s3_prefix}/hexagon/build/hexagon_api_output build/hexagon_api_output --recursive
""",
label: 'Download artifacts from S3',
)
add_hexagon_permissions()
ci_setup(ci_hexagon)
cpp_unittest(ci_hexagon)
sh (
script: "${docker_run} ${ci_hexagon} ./tests/scripts/task_python_hexagon.sh",
label: 'Run Hexagon tests',
)
})
}
} finally {
sh(
script: """
set -eux
aws s3 cp --no-progress build/pytest-results s3://${s3_prefix}/pytest-results --recursive
""",
label: 'Upload JUnits to S3',
)
junit 'build/pytest-results/*.xml'
}
}
}
} else {
Utils.markStageSkippedForConditional('test: Hexagon 1 of 7')
}
}
def shard_run_test_Hexagon_2_of_7() {
if (!skip_ci && is_docs_only_build != 1) {
node('CPU-SMALL') {
ws("workspace/exec_${env.EXECUTOR_NUMBER}/tvm/test-hexagon") {
try {
docker_init(ci_hexagon)
init_git()
timeout(time: max_time, unit: 'MINUTES') {
withEnv([
'PLATFORM=hexagon',
'TVM_NUM_SHARDS=7',
'TVM_SHARD_INDEX=1'], {
sh(
script: """
set -eux
aws s3 cp --no-progress s3://${s3_prefix}/hexagon/build/libtvm.so build/libtvm.so
md5sum build/libtvm.so
aws s3 cp --no-progress s3://${s3_prefix}/hexagon/build/libtvm_runtime.so build/libtvm_runtime.so
md5sum build/libtvm_runtime.so
aws s3 cp --no-progress s3://${s3_prefix}/hexagon/build/config.cmake build/config.cmake
md5sum build/config.cmake
aws s3 cp --no-progress s3://${s3_prefix}/hexagon/build/hexagon_api_output build/hexagon_api_output --recursive
""",
label: 'Download artifacts from S3',
)
add_hexagon_permissions()
ci_setup(ci_hexagon)
sh (
script: "${docker_run} ${ci_hexagon} ./tests/scripts/task_python_hexagon.sh",
label: 'Run Hexagon tests',
)
})
}
} finally {
sh(
script: """
set -eux
aws s3 cp --no-progress build/pytest-results s3://${s3_prefix}/pytest-results --recursive
""",
label: 'Upload JUnits to S3',
)
junit 'build/pytest-results/*.xml'
}
}
}
} else {
Utils.markStageSkippedForConditional('test: Hexagon 2 of 7')
}
}
def shard_run_test_Hexagon_3_of_7() {
if (!skip_ci && is_docs_only_build != 1) {
node('CPU-SMALL') {
ws("workspace/exec_${env.EXECUTOR_NUMBER}/tvm/test-hexagon") {
try {
docker_init(ci_hexagon)
init_git()
timeout(time: max_time, unit: 'MINUTES') {
withEnv([
'PLATFORM=hexagon',
'TVM_NUM_SHARDS=7',
'TVM_SHARD_INDEX=2'], {
sh(
script: """
set -eux
aws s3 cp --no-progress s3://${s3_prefix}/hexagon/build/libtvm.so build/libtvm.so
md5sum build/libtvm.so
aws s3 cp --no-progress s3://${s3_prefix}/hexagon/build/libtvm_runtime.so build/libtvm_runtime.so
md5sum build/libtvm_runtime.so
aws s3 cp --no-progress s3://${s3_prefix}/hexagon/build/config.cmake build/config.cmake
md5sum build/config.cmake
aws s3 cp --no-progress s3://${s3_prefix}/hexagon/build/hexagon_api_output build/hexagon_api_output --recursive
""",
label: 'Download artifacts from S3',
)
add_hexagon_permissions()
ci_setup(ci_hexagon)
sh (
script: "${docker_run} ${ci_hexagon} ./tests/scripts/task_python_hexagon.sh",
label: 'Run Hexagon tests',
)
})
}
} finally {
sh(
script: """
set -eux
aws s3 cp --no-progress build/pytest-results s3://${s3_prefix}/pytest-results --recursive
""",
label: 'Upload JUnits to S3',
)
junit 'build/pytest-results/*.xml'
}
}
}
} else {
Utils.markStageSkippedForConditional('test: Hexagon 3 of 7')
}
}
def shard_run_test_Hexagon_4_of_7() {
if (!skip_ci && is_docs_only_build != 1) {
node('CPU-SMALL') {
ws("workspace/exec_${env.EXECUTOR_NUMBER}/tvm/test-hexagon") {
try {
docker_init(ci_hexagon)
init_git()
timeout(time: max_time, unit: 'MINUTES') {
withEnv([
'PLATFORM=hexagon',
'TVM_NUM_SHARDS=7',
'TVM_SHARD_INDEX=3'], {
sh(
script: """
set -eux
aws s3 cp --no-progress s3://${s3_prefix}/hexagon/build/libtvm.so build/libtvm.so
md5sum build/libtvm.so
aws s3 cp --no-progress s3://${s3_prefix}/hexagon/build/libtvm_runtime.so build/libtvm_runtime.so
md5sum build/libtvm_runtime.so
aws s3 cp --no-progress s3://${s3_prefix}/hexagon/build/config.cmake build/config.cmake
md5sum build/config.cmake
aws s3 cp --no-progress s3://${s3_prefix}/hexagon/build/hexagon_api_output build/hexagon_api_output --recursive
""",
label: 'Download artifacts from S3',
)
add_hexagon_permissions()
ci_setup(ci_hexagon)
sh (
script: "${docker_run} ${ci_hexagon} ./tests/scripts/task_python_hexagon.sh",
label: 'Run Hexagon tests',
)
})
}
} finally {
sh(
script: """
set -eux
aws s3 cp --no-progress build/pytest-results s3://${s3_prefix}/pytest-results --recursive
""",
label: 'Upload JUnits to S3',
)
junit 'build/pytest-results/*.xml'
}
}
}
} else {
Utils.markStageSkippedForConditional('test: Hexagon 4 of 7')
}
}
def shard_run_test_Hexagon_5_of_7() {
if (!skip_ci && is_docs_only_build != 1) {
node('CPU-SMALL') {
ws("workspace/exec_${env.EXECUTOR_NUMBER}/tvm/test-hexagon") {
try {
docker_init(ci_hexagon)
init_git()
timeout(time: max_time, unit: 'MINUTES') {
withEnv([
'PLATFORM=hexagon',
'TVM_NUM_SHARDS=7',
'TVM_SHARD_INDEX=4'], {
sh(
script: """
set -eux
aws s3 cp --no-progress s3://${s3_prefix}/hexagon/build/libtvm.so build/libtvm.so
md5sum build/libtvm.so
aws s3 cp --no-progress s3://${s3_prefix}/hexagon/build/libtvm_runtime.so build/libtvm_runtime.so
md5sum build/libtvm_runtime.so
aws s3 cp --no-progress s3://${s3_prefix}/hexagon/build/config.cmake build/config.cmake
md5sum build/config.cmake
aws s3 cp --no-progress s3://${s3_prefix}/hexagon/build/hexagon_api_output build/hexagon_api_output --recursive
""",
label: 'Download artifacts from S3',
)
add_hexagon_permissions()
ci_setup(ci_hexagon)
sh (
script: "${docker_run} ${ci_hexagon} ./tests/scripts/task_python_hexagon.sh",
label: 'Run Hexagon tests',
)
})
}
} finally {
sh(
script: """
set -eux
aws s3 cp --no-progress build/pytest-results s3://${s3_prefix}/pytest-results --recursive
""",
label: 'Upload JUnits to S3',
)
junit 'build/pytest-results/*.xml'
}
}
}
} else {
Utils.markStageSkippedForConditional('test: Hexagon 5 of 7')
}
}
def shard_run_test_Hexagon_6_of_7() {
if (!skip_ci && is_docs_only_build != 1) {
node('CPU-SMALL') {
ws("workspace/exec_${env.EXECUTOR_NUMBER}/tvm/test-hexagon") {
try {
docker_init(ci_hexagon)
init_git()
timeout(time: max_time, unit: 'MINUTES') {
withEnv([
'PLATFORM=hexagon',
'TVM_NUM_SHARDS=7',
'TVM_SHARD_INDEX=5'], {
sh(
script: """
set -eux
aws s3 cp --no-progress s3://${s3_prefix}/hexagon/build/libtvm.so build/libtvm.so
md5sum build/libtvm.so
aws s3 cp --no-progress s3://${s3_prefix}/hexagon/build/libtvm_runtime.so build/libtvm_runtime.so
md5sum build/libtvm_runtime.so
aws s3 cp --no-progress s3://${s3_prefix}/hexagon/build/config.cmake build/config.cmake
md5sum build/config.cmake
aws s3 cp --no-progress s3://${s3_prefix}/hexagon/build/hexagon_api_output build/hexagon_api_output --recursive
""",
label: 'Download artifacts from S3',
)
add_hexagon_permissions()
ci_setup(ci_hexagon)
sh (
script: "${docker_run} ${ci_hexagon} ./tests/scripts/task_python_hexagon.sh",
label: 'Run Hexagon tests',
)
})
}
} finally {
sh(
script: """
set -eux
aws s3 cp --no-progress build/pytest-results s3://${s3_prefix}/pytest-results --recursive
""",
label: 'Upload JUnits to S3',
)
junit 'build/pytest-results/*.xml'
}
}
}
} else {
Utils.markStageSkippedForConditional('test: Hexagon 6 of 7')
}
}
def shard_run_test_Hexagon_7_of_7() {
if (!skip_ci && is_docs_only_build != 1) {
node('CPU-SMALL') {
ws("workspace/exec_${env.EXECUTOR_NUMBER}/tvm/test-hexagon") {
try {
docker_init(ci_hexagon)
init_git()
timeout(time: max_time, unit: 'MINUTES') {
withEnv([
'PLATFORM=hexagon',
'TVM_NUM_SHARDS=7',
'TVM_SHARD_INDEX=6'], {
sh(
script: """
set -eux
aws s3 cp --no-progress s3://${s3_prefix}/hexagon/build/libtvm.so build/libtvm.so
md5sum build/libtvm.so
aws s3 cp --no-progress s3://${s3_prefix}/hexagon/build/libtvm_runtime.so build/libtvm_runtime.so
md5sum build/libtvm_runtime.so
aws s3 cp --no-progress s3://${s3_prefix}/hexagon/build/config.cmake build/config.cmake
md5sum build/config.cmake
aws s3 cp --no-progress s3://${s3_prefix}/hexagon/build/hexagon_api_output build/hexagon_api_output --recursive
""",
label: 'Download artifacts from S3',
)
add_hexagon_permissions()
ci_setup(ci_hexagon)
sh (
script: "${docker_run} ${ci_hexagon} ./tests/scripts/task_python_hexagon.sh",
label: 'Run Hexagon tests',
)
})
}
} finally {
sh(
script: """
set -eux
aws s3 cp --no-progress build/pytest-results s3://${s3_prefix}/pytest-results --recursive
""",
label: 'Upload JUnits to S3',
)
junit 'build/pytest-results/*.xml'
}
}
}
} else {
Utils.markStageSkippedForConditional('test: Hexagon 7 of 7')
}
}
def shard_run_integration_aarch64_1_of_4() {
if (!skip_ci && is_docs_only_build != 1) {
node('ARM-SMALL') {
ws("workspace/exec_${env.EXECUTOR_NUMBER}/tvm/ut-python-arm") {
try {
docker_init(ci_arm)
init_git()
timeout(time: max_time, unit: 'MINUTES') {
withEnv([
'PLATFORM=arm',
'TVM_NUM_SHARDS=4',
'TVM_SHARD_INDEX=0'], {
sh(
script: """
set -eux
aws s3 cp --no-progress s3://${s3_prefix}/arm/build/libtvm.so build/libtvm.so
md5sum build/libtvm.so
aws s3 cp --no-progress s3://${s3_prefix}/arm/build/libtvm_runtime.so build/libtvm_runtime.so
md5sum build/libtvm_runtime.so
aws s3 cp --no-progress s3://${s3_prefix}/arm/build/config.cmake build/config.cmake
md5sum build/config.cmake
""",
label: 'Download artifacts from S3',
)
ci_setup(ci_arm)
python_unittest(ci_arm)
sh (
script: "${docker_run} ${ci_arm} ./tests/scripts/task_python_integration.sh",
label: 'Run CPU integration tests',
)
})
}
} finally {
sh(
script: """
set -eux
aws s3 cp --no-progress build/pytest-results s3://${s3_prefix}/pytest-results --recursive
""",
label: 'Upload JUnits to S3',
)
junit 'build/pytest-results/*.xml'
}
}
}
} else {
Utils.markStageSkippedForConditional('integration: aarch64 1 of 4')
}
}
def shard_run_integration_aarch64_2_of_4() {
if (!skip_ci && is_docs_only_build != 1) {
node('ARM-SMALL') {
ws("workspace/exec_${env.EXECUTOR_NUMBER}/tvm/ut-python-arm") {
try {
docker_init(ci_arm)
init_git()
timeout(time: max_time, unit: 'MINUTES') {
withEnv([
'PLATFORM=arm',
'TVM_NUM_SHARDS=4',
'TVM_SHARD_INDEX=1'], {
sh(
script: """
set -eux
aws s3 cp --no-progress s3://${s3_prefix}/arm/build/libtvm.so build/libtvm.so
md5sum build/libtvm.so
aws s3 cp --no-progress s3://${s3_prefix}/arm/build/libtvm_runtime.so build/libtvm_runtime.so
md5sum build/libtvm_runtime.so
aws s3 cp --no-progress s3://${s3_prefix}/arm/build/config.cmake build/config.cmake
md5sum build/config.cmake
""",
label: 'Download artifacts from S3',
)
ci_setup(ci_arm)
python_unittest(ci_arm)
sh (
script: "${docker_run} ${ci_arm} ./tests/scripts/task_python_integration.sh",
label: 'Run CPU integration tests',
)
})
}
} finally {
sh(
script: """
set -eux
aws s3 cp --no-progress build/pytest-results s3://${s3_prefix}/pytest-results --recursive
""",
label: 'Upload JUnits to S3',
)
junit 'build/pytest-results/*.xml'
}
}
}
} else {
Utils.markStageSkippedForConditional('integration: aarch64 2 of 4')
}
}
def shard_run_integration_aarch64_3_of_4() {
if (!skip_ci && is_docs_only_build != 1) {
node('ARM-SMALL') {
ws("workspace/exec_${env.EXECUTOR_NUMBER}/tvm/ut-python-arm") {
try {
docker_init(ci_arm)
init_git()
timeout(time: max_time, unit: 'MINUTES') {
withEnv([
'PLATFORM=arm',
'TVM_NUM_SHARDS=4',
'TVM_SHARD_INDEX=2'], {
sh(
script: """
set -eux
aws s3 cp --no-progress s3://${s3_prefix}/arm/build/libtvm.so build/libtvm.so
md5sum build/libtvm.so
aws s3 cp --no-progress s3://${s3_prefix}/arm/build/libtvm_runtime.so build/libtvm_runtime.so
md5sum build/libtvm_runtime.so
aws s3 cp --no-progress s3://${s3_prefix}/arm/build/config.cmake build/config.cmake
md5sum build/config.cmake
""",
label: 'Download artifacts from S3',
)
ci_setup(ci_arm)
python_unittest(ci_arm)
sh (
script: "${docker_run} ${ci_arm} ./tests/scripts/task_python_integration.sh",
label: 'Run CPU integration tests',
)
})
}
} finally {
sh(
script: """
set -eux
aws s3 cp --no-progress build/pytest-results s3://${s3_prefix}/pytest-results --recursive
""",
label: 'Upload JUnits to S3',
)
junit 'build/pytest-results/*.xml'
}
}
}
} else {
Utils.markStageSkippedForConditional('integration: aarch64 3 of 4')
}
}
def shard_run_integration_aarch64_4_of_4() {
if (!skip_ci && is_docs_only_build != 1) {
node('ARM-SMALL') {
ws("workspace/exec_${env.EXECUTOR_NUMBER}/tvm/ut-python-arm") {
try {
docker_init(ci_arm)
init_git()
timeout(time: max_time, unit: 'MINUTES') {
withEnv([
'PLATFORM=arm',
'TVM_NUM_SHARDS=4',
'TVM_SHARD_INDEX=3'], {
sh(
script: """
set -eux
aws s3 cp --no-progress s3://${s3_prefix}/arm/build/libtvm.so build/libtvm.so
md5sum build/libtvm.so
aws s3 cp --no-progress s3://${s3_prefix}/arm/build/libtvm_runtime.so build/libtvm_runtime.so
md5sum build/libtvm_runtime.so
aws s3 cp --no-progress s3://${s3_prefix}/arm/build/config.cmake build/config.cmake
md5sum build/config.cmake
""",
label: 'Download artifacts from S3',
)
ci_setup(ci_arm)
python_unittest(ci_arm)
sh (
script: "${docker_run} ${ci_arm} ./tests/scripts/task_python_integration.sh",
label: 'Run CPU integration tests',
)
})
}
} finally {
sh(
script: """
set -eux
aws s3 cp --no-progress build/pytest-results s3://${s3_prefix}/pytest-results --recursive
""",
label: 'Upload JUnits to S3',
)
junit 'build/pytest-results/*.xml'
}
}
}
} else {
Utils.markStageSkippedForConditional('integration: aarch64 4 of 4')
}
}
def shard_run_topi_GPU_1_of_4() {
if (!skip_ci && is_docs_only_build != 1) {
node('GPU') {
ws("workspace/exec_${env.EXECUTOR_NUMBER}/tvm/topi-python-gpu") {
try {
docker_init(ci_gpu)
init_git()
timeout(time: max_time, unit: 'MINUTES') {
withEnv([
'PLATFORM=gpu',
'TVM_NUM_SHARDS=4',
'TVM_SHARD_INDEX=0'], {
sh(
script: """
set -eux
aws s3 cp --no-progress s3://${s3_prefix}/gpu/build/libtvm.so build/libtvm.so
md5sum build/libtvm.so
aws s3 cp --no-progress s3://${s3_prefix}/gpu/build/libtvm_runtime.so build/libtvm_runtime.so
md5sum build/libtvm_runtime.so
aws s3 cp --no-progress s3://${s3_prefix}/gpu/build/config.cmake build/config.cmake
md5sum build/config.cmake
""",
label: 'Download artifacts from S3',
)
ci_setup(ci_gpu)
sh (
script: "${docker_run} ${ci_gpu} ./tests/scripts/task_python_topi.sh",
label: 'Run TOPI tests',
)
})
}
} finally {
sh(
script: """
set -eux
aws s3 cp --no-progress build/pytest-results s3://${s3_prefix}/pytest-results --recursive
""",
label: 'Upload JUnits to S3',
)
junit 'build/pytest-results/*.xml'
}
}
}
} else {
Utils.markStageSkippedForConditional('topi: GPU 1 of 4')
}
}
def shard_run_topi_GPU_2_of_4() {
if (!skip_ci && is_docs_only_build != 1) {
node('GPU') {
ws("workspace/exec_${env.EXECUTOR_NUMBER}/tvm/topi-python-gpu") {
try {
docker_init(ci_gpu)
init_git()
timeout(time: max_time, unit: 'MINUTES') {
withEnv([
'PLATFORM=gpu',
'TVM_NUM_SHARDS=4',
'TVM_SHARD_INDEX=1'], {
sh(
script: """
set -eux
aws s3 cp --no-progress s3://${s3_prefix}/gpu/build/libtvm.so build/libtvm.so
md5sum build/libtvm.so
aws s3 cp --no-progress s3://${s3_prefix}/gpu/build/libtvm_runtime.so build/libtvm_runtime.so
md5sum build/libtvm_runtime.so
aws s3 cp --no-progress s3://${s3_prefix}/gpu/build/config.cmake build/config.cmake
md5sum build/config.cmake
""",
label: 'Download artifacts from S3',
)
ci_setup(ci_gpu)
sh (
script: "${docker_run} ${ci_gpu} ./tests/scripts/task_python_topi.sh",
label: 'Run TOPI tests',
)
})
}
} finally {
sh(
script: """
set -eux
aws s3 cp --no-progress build/pytest-results s3://${s3_prefix}/pytest-results --recursive
""",
label: 'Upload JUnits to S3',
)
junit 'build/pytest-results/*.xml'
}
}
}
} else {
Utils.markStageSkippedForConditional('topi: GPU 2 of 4')
}
}
def shard_run_topi_GPU_3_of_4() {
if (!skip_ci && is_docs_only_build != 1) {
node('GPU') {
ws("workspace/exec_${env.EXECUTOR_NUMBER}/tvm/topi-python-gpu") {
try {
docker_init(ci_gpu)
init_git()
timeout(time: max_time, unit: 'MINUTES') {
withEnv([
'PLATFORM=gpu',
'TVM_NUM_SHARDS=4',
'TVM_SHARD_INDEX=2'], {
sh(
script: """
set -eux
aws s3 cp --no-progress s3://${s3_prefix}/gpu/build/libtvm.so build/libtvm.so
md5sum build/libtvm.so
aws s3 cp --no-progress s3://${s3_prefix}/gpu/build/libtvm_runtime.so build/libtvm_runtime.so
md5sum build/libtvm_runtime.so
aws s3 cp --no-progress s3://${s3_prefix}/gpu/build/config.cmake build/config.cmake
md5sum build/config.cmake
""",
label: 'Download artifacts from S3',
)
ci_setup(ci_gpu)
sh (
script: "${docker_run} ${ci_gpu} ./tests/scripts/task_python_topi.sh",
label: 'Run TOPI tests',
)
})
}
} finally {
sh(
script: """
set -eux
aws s3 cp --no-progress build/pytest-results s3://${s3_prefix}/pytest-results --recursive
""",
label: 'Upload JUnits to S3',
)
junit 'build/pytest-results/*.xml'
}
}
}
} else {
Utils.markStageSkippedForConditional('topi: GPU 3 of 4')
}
}
def shard_run_topi_GPU_4_of_4() {
if (!skip_ci && is_docs_only_build != 1) {
node('GPU') {
ws("workspace/exec_${env.EXECUTOR_NUMBER}/tvm/topi-python-gpu") {
try {
docker_init(ci_gpu)
init_git()
timeout(time: max_time, unit: 'MINUTES') {
withEnv([
'PLATFORM=gpu',
'TVM_NUM_SHARDS=4',
'TVM_SHARD_INDEX=3'], {
sh(
script: """
set -eux
aws s3 cp --no-progress s3://${s3_prefix}/gpu/build/libtvm.so build/libtvm.so
md5sum build/libtvm.so
aws s3 cp --no-progress s3://${s3_prefix}/gpu/build/libtvm_runtime.so build/libtvm_runtime.so
md5sum build/libtvm_runtime.so
aws s3 cp --no-progress s3://${s3_prefix}/gpu/build/config.cmake build/config.cmake
md5sum build/config.cmake
""",
label: 'Download artifacts from S3',
)
ci_setup(ci_gpu)
sh (
script: "${docker_run} ${ci_gpu} ./tests/scripts/task_python_topi.sh",
label: 'Run TOPI tests',
)
})
}
} finally {
sh(
script: """
set -eux
aws s3 cp --no-progress build/pytest-results s3://${s3_prefix}/pytest-results --recursive
""",
label: 'Upload JUnits to S3',
)
junit 'build/pytest-results/*.xml'
}
}
}
} else {
Utils.markStageSkippedForConditional('topi: GPU 4 of 4')
}
}
def shard_run_frontend_GPU_1_of_6() {
if (!skip_ci && is_docs_only_build != 1) {
node('GPU') {
ws("workspace/exec_${env.EXECUTOR_NUMBER}/tvm/frontend-python-gpu") {
try {
docker_init(ci_gpu)
init_git()
timeout(time: max_time, unit: 'MINUTES') {
withEnv([
'PLATFORM=gpu',
'TVM_NUM_SHARDS=6',
'TVM_SHARD_INDEX=0'], {
sh(
script: """
set -eux
aws s3 cp --no-progress s3://${s3_prefix}/gpu/build/libtvm.so build/libtvm.so
md5sum build/libtvm.so
aws s3 cp --no-progress s3://${s3_prefix}/gpu/build/libtvm_runtime.so build/libtvm_runtime.so
md5sum build/libtvm_runtime.so
aws s3 cp --no-progress s3://${s3_prefix}/gpu/build/config.cmake build/config.cmake
md5sum build/config.cmake
""",
label: 'Download artifacts from S3',
)
ci_setup(ci_gpu)
sh (
script: "${docker_run} ${ci_gpu} ./tests/scripts/task_python_frontend.sh",
label: 'Run Python frontend tests',
)
})
}
} finally {
sh(
script: """
set -eux
aws s3 cp --no-progress build/pytest-results s3://${s3_prefix}/pytest-results --recursive
""",
label: 'Upload JUnits to S3',
)
junit 'build/pytest-results/*.xml'
}
}
}
} else {
Utils.markStageSkippedForConditional('frontend: GPU 1 of 6')
}
}
def shard_run_frontend_GPU_2_of_6() {
if (!skip_ci && is_docs_only_build != 1) {
node('GPU') {
ws("workspace/exec_${env.EXECUTOR_NUMBER}/tvm/frontend-python-gpu") {
try {
docker_init(ci_gpu)
init_git()
timeout(time: max_time, unit: 'MINUTES') {
withEnv([
'PLATFORM=gpu',
'TVM_NUM_SHARDS=6',
'TVM_SHARD_INDEX=1'], {
sh(
script: """
set -eux
aws s3 cp --no-progress s3://${s3_prefix}/gpu/build/libtvm.so build/libtvm.so
md5sum build/libtvm.so
aws s3 cp --no-progress s3://${s3_prefix}/gpu/build/libtvm_runtime.so build/libtvm_runtime.so
md5sum build/libtvm_runtime.so
aws s3 cp --no-progress s3://${s3_prefix}/gpu/build/config.cmake build/config.cmake
md5sum build/config.cmake
""",
label: 'Download artifacts from S3',
)
ci_setup(ci_gpu)
sh (
script: "${docker_run} ${ci_gpu} ./tests/scripts/task_python_frontend.sh",
label: 'Run Python frontend tests',
)
})
}
} finally {
sh(
script: """
set -eux
aws s3 cp --no-progress build/pytest-results s3://${s3_prefix}/pytest-results --recursive
""",
label: 'Upload JUnits to S3',
)
junit 'build/pytest-results/*.xml'
}
}
}
} else {
Utils.markStageSkippedForConditional('frontend: GPU 2 of 6')
}
}
def shard_run_frontend_GPU_3_of_6() {
if (!skip_ci && is_docs_only_build != 1) {
node('GPU') {
ws("workspace/exec_${env.EXECUTOR_NUMBER}/tvm/frontend-python-gpu") {
try {
docker_init(ci_gpu)
init_git()
timeout(time: max_time, unit: 'MINUTES') {
withEnv([
'PLATFORM=gpu',
'TVM_NUM_SHARDS=6',
'TVM_SHARD_INDEX=2'], {
sh(
script: """
set -eux
aws s3 cp --no-progress s3://${s3_prefix}/gpu/build/libtvm.so build/libtvm.so
md5sum build/libtvm.so
aws s3 cp --no-progress s3://${s3_prefix}/gpu/build/libtvm_runtime.so build/libtvm_runtime.so
md5sum build/libtvm_runtime.so
aws s3 cp --no-progress s3://${s3_prefix}/gpu/build/config.cmake build/config.cmake
md5sum build/config.cmake
""",
label: 'Download artifacts from S3',
)
ci_setup(ci_gpu)
sh (
script: "${docker_run} ${ci_gpu} ./tests/scripts/task_python_frontend.sh",
label: 'Run Python frontend tests',
)
})
}
} finally {
sh(
script: """
set -eux
aws s3 cp --no-progress build/pytest-results s3://${s3_prefix}/pytest-results --recursive
""",
label: 'Upload JUnits to S3',
)
junit 'build/pytest-results/*.xml'
}
}
}
} else {
Utils.markStageSkippedForConditional('frontend: GPU 3 of 6')
}
}
def shard_run_frontend_GPU_4_of_6() {
if (!skip_ci && is_docs_only_build != 1) {
node('GPU') {
ws("workspace/exec_${env.EXECUTOR_NUMBER}/tvm/frontend-python-gpu") {
try {
docker_init(ci_gpu)
init_git()
timeout(time: max_time, unit: 'MINUTES') {
withEnv([
'PLATFORM=gpu',
'TVM_NUM_SHARDS=6',
'TVM_SHARD_INDEX=3'], {
sh(
script: """
set -eux
aws s3 cp --no-progress s3://${s3_prefix}/gpu/build/libtvm.so build/libtvm.so
md5sum build/libtvm.so
aws s3 cp --no-progress s3://${s3_prefix}/gpu/build/libtvm_runtime.so build/libtvm_runtime.so
md5sum build/libtvm_runtime.so
aws s3 cp --no-progress s3://${s3_prefix}/gpu/build/config.cmake build/config.cmake
md5sum build/config.cmake
""",
label: 'Download artifacts from S3',
)
ci_setup(ci_gpu)
sh (
script: "${docker_run} ${ci_gpu} ./tests/scripts/task_python_frontend.sh",
label: 'Run Python frontend tests',
)
})
}
} finally {
sh(
script: """
set -eux
aws s3 cp --no-progress build/pytest-results s3://${s3_prefix}/pytest-results --recursive
""",
label: 'Upload JUnits to S3',
)
junit 'build/pytest-results/*.xml'
}
}
}
} else {
Utils.markStageSkippedForConditional('frontend: GPU 4 of 6')
}
}
def shard_run_frontend_GPU_5_of_6() {
if (!skip_ci && is_docs_only_build != 1) {
node('GPU') {
ws("workspace/exec_${env.EXECUTOR_NUMBER}/tvm/frontend-python-gpu") {
try {
docker_init(ci_gpu)
init_git()
timeout(time: max_time, unit: 'MINUTES') {
withEnv([
'PLATFORM=gpu',
'TVM_NUM_SHARDS=6',
'TVM_SHARD_INDEX=4'], {
sh(
script: """
set -eux
aws s3 cp --no-progress s3://${s3_prefix}/gpu/build/libtvm.so build/libtvm.so
md5sum build/libtvm.so
aws s3 cp --no-progress s3://${s3_prefix}/gpu/build/libtvm_runtime.so build/libtvm_runtime.so
md5sum build/libtvm_runtime.so
aws s3 cp --no-progress s3://${s3_prefix}/gpu/build/config.cmake build/config.cmake
md5sum build/config.cmake
""",
label: 'Download artifacts from S3',
)
ci_setup(ci_gpu)
sh (
script: "${docker_run} ${ci_gpu} ./tests/scripts/task_python_frontend.sh",
label: 'Run Python frontend tests',
)
})
}
} finally {
sh(
script: """
set -eux
aws s3 cp --no-progress build/pytest-results s3://${s3_prefix}/pytest-results --recursive
""",
label: 'Upload JUnits to S3',
)
junit 'build/pytest-results/*.xml'
}
}
}
} else {
Utils.markStageSkippedForConditional('frontend: GPU 5 of 6')
}
}
def shard_run_frontend_GPU_6_of_6() {
if (!skip_ci && is_docs_only_build != 1) {
node('GPU') {
ws("workspace/exec_${env.EXECUTOR_NUMBER}/tvm/frontend-python-gpu") {
try {
docker_init(ci_gpu)
init_git()
timeout(time: max_time, unit: 'MINUTES') {
withEnv([
'PLATFORM=gpu',
'TVM_NUM_SHARDS=6',
'TVM_SHARD_INDEX=5'], {
sh(
script: """
set -eux
aws s3 cp --no-progress s3://${s3_prefix}/gpu/build/libtvm.so build/libtvm.so
md5sum build/libtvm.so
aws s3 cp --no-progress s3://${s3_prefix}/gpu/build/libtvm_runtime.so build/libtvm_runtime.so
md5sum build/libtvm_runtime.so
aws s3 cp --no-progress s3://${s3_prefix}/gpu/build/config.cmake build/config.cmake
md5sum build/config.cmake
""",
label: 'Download artifacts from S3',
)
ci_setup(ci_gpu)
sh (
script: "${docker_run} ${ci_gpu} ./tests/scripts/task_python_frontend.sh",
label: 'Run Python frontend tests',
)
})
}
} finally {
sh(
script: """
set -eux
aws s3 cp --no-progress build/pytest-results s3://${s3_prefix}/pytest-results --recursive
""",
label: 'Upload JUnits to S3',
)
junit 'build/pytest-results/*.xml'
}
}
}
} else {
Utils.markStageSkippedForConditional('frontend: GPU 6 of 6')
}
}
def shard_run_topi_aarch64_1_of_2() {
if (!skip_ci && is_docs_only_build != 1) {
node('ARM-SMALL') {
ws("workspace/exec_${env.EXECUTOR_NUMBER}/tvm/ut-python-arm") {
try {
docker_init(ci_arm)
init_git()
timeout(time: max_time, unit: 'MINUTES') {
withEnv([
'PLATFORM=arm',
'TVM_NUM_SHARDS=2',
'TVM_SHARD_INDEX=0'], {
sh(
script: """
set -eux
aws s3 cp --no-progress s3://${s3_prefix}/arm/build/libtvm.so build/libtvm.so
md5sum build/libtvm.so
aws s3 cp --no-progress s3://${s3_prefix}/arm/build/libtvm_runtime.so build/libtvm_runtime.so
md5sum build/libtvm_runtime.so
aws s3 cp --no-progress s3://${s3_prefix}/arm/build/config.cmake build/config.cmake
md5sum build/config.cmake
""",
label: 'Download artifacts from S3',
)
ci_setup(ci_arm)
cpp_unittest(ci_arm)
sh (
script: "${docker_run} ${ci_arm} ./tests/scripts/task_python_arm_compute_library.sh",
label: 'Run test_arm_compute_lib test',
)
sh (
script: "${docker_run} ${ci_arm} ./tests/scripts/task_python_topi.sh",
label: 'Run TOPI tests',
)
})
}
} finally {
sh(
script: """
set -eux
aws s3 cp --no-progress build/pytest-results s3://${s3_prefix}/pytest-results --recursive
""",
label: 'Upload JUnits to S3',
)
junit 'build/pytest-results/*.xml'
}
}
}
} else {
Utils.markStageSkippedForConditional('topi: aarch64 1 of 2')
}
}
def shard_run_topi_aarch64_2_of_2() {
if (!skip_ci && is_docs_only_build != 1) {
node('ARM-SMALL') {
ws("workspace/exec_${env.EXECUTOR_NUMBER}/tvm/ut-python-arm") {
try {
docker_init(ci_arm)
init_git()
timeout(time: max_time, unit: 'MINUTES') {
withEnv([
'PLATFORM=arm',
'TVM_NUM_SHARDS=2',
'TVM_SHARD_INDEX=1'], {
sh(
script: """
set -eux
aws s3 cp --no-progress s3://${s3_prefix}/arm/build/libtvm.so build/libtvm.so
md5sum build/libtvm.so
aws s3 cp --no-progress s3://${s3_prefix}/arm/build/libtvm_runtime.so build/libtvm_runtime.so
md5sum build/libtvm_runtime.so
aws s3 cp --no-progress s3://${s3_prefix}/arm/build/config.cmake build/config.cmake
md5sum build/config.cmake
""",
label: 'Download artifacts from S3',
)
ci_setup(ci_arm)
sh (
script: "${docker_run} ${ci_arm} ./tests/scripts/task_python_arm_compute_library.sh",
label: 'Run test_arm_compute_lib test',
)
sh (
script: "${docker_run} ${ci_arm} ./tests/scripts/task_python_topi.sh",
label: 'Run TOPI tests',
)
})
}
} finally {
sh(
script: """
set -eux
aws s3 cp --no-progress build/pytest-results s3://${s3_prefix}/pytest-results --recursive
""",
label: 'Upload JUnits to S3',
)
junit 'build/pytest-results/*.xml'
}
}
}
} else {
Utils.markStageSkippedForConditional('topi: aarch64 2 of 2')
}
}
def shard_run_frontend_aarch64_1_of_2() {
if (!skip_ci && is_docs_only_build != 1) {
node('ARM-SMALL') {
ws("workspace/exec_${env.EXECUTOR_NUMBER}/tvm/frontend-python-arm") {
try {
docker_init(ci_arm)
init_git()
timeout(time: max_time, unit: 'MINUTES') {
withEnv([
'PLATFORM=arm',
'TVM_NUM_SHARDS=2',
'TVM_SHARD_INDEX=0'], {
sh(
script: """
set -eux
aws s3 cp --no-progress s3://${s3_prefix}/arm/build/libtvm.so build/libtvm.so
md5sum build/libtvm.so
aws s3 cp --no-progress s3://${s3_prefix}/arm/build/libtvm_runtime.so build/libtvm_runtime.so
md5sum build/libtvm_runtime.so
aws s3 cp --no-progress s3://${s3_prefix}/arm/build/config.cmake build/config.cmake
md5sum build/config.cmake
""",
label: 'Download artifacts from S3',
)
ci_setup(ci_arm)
sh (
script: "${docker_run} ${ci_arm} ./tests/scripts/task_python_frontend_cpu.sh",
label: 'Run Python frontend tests',
)
})
}
} finally {
sh(
script: """
set -eux
aws s3 cp --no-progress build/pytest-results s3://${s3_prefix}/pytest-results --recursive
""",
label: 'Upload JUnits to S3',
)
junit 'build/pytest-results/*.xml'
}
}
}
} else {
Utils.markStageSkippedForConditional('frontend: aarch64 1 of 2')
}
}
def shard_run_frontend_aarch64_2_of_2() {
if (!skip_ci && is_docs_only_build != 1) {
node('ARM-SMALL') {
ws("workspace/exec_${env.EXECUTOR_NUMBER}/tvm/frontend-python-arm") {
try {
docker_init(ci_arm)
init_git()
timeout(time: max_time, unit: 'MINUTES') {
withEnv([
'PLATFORM=arm',
'TVM_NUM_SHARDS=2',
'TVM_SHARD_INDEX=1'], {
sh(
script: """
set -eux
aws s3 cp --no-progress s3://${s3_prefix}/arm/build/libtvm.so build/libtvm.so
md5sum build/libtvm.so
aws s3 cp --no-progress s3://${s3_prefix}/arm/build/libtvm_runtime.so build/libtvm_runtime.so
md5sum build/libtvm_runtime.so
aws s3 cp --no-progress s3://${s3_prefix}/arm/build/config.cmake build/config.cmake
md5sum build/config.cmake
""",
label: 'Download artifacts from S3',
)
ci_setup(ci_arm)
sh (
script: "${docker_run} ${ci_arm} ./tests/scripts/task_python_frontend_cpu.sh",
label: 'Run Python frontend tests',
)
})
}
} finally {
sh(
script: """
set -eux
aws s3 cp --no-progress build/pytest-results s3://${s3_prefix}/pytest-results --recursive
""",
label: 'Upload JUnits to S3',
)
junit 'build/pytest-results/*.xml'
}
}
}
} else {
Utils.markStageSkippedForConditional('frontend: aarch64 2 of 2')
}
}
def test() {
stage('Test') {
environment {
SKIP_SLOW_TESTS = "${skip_slow_tests}"
}
parallel(
'unittest: GPU 1 of 3': {
shard_run_unittest_GPU_1_of_3()
},
'unittest: GPU 2 of 3': {
shard_run_unittest_GPU_2_of_3()
},
'unittest: GPU 3 of 3': {
shard_run_unittest_GPU_3_of_3()
},
'integration: CPU 1 of 6': {
shard_run_integration_CPU_1_of_6()
},
'integration: CPU 2 of 6': {
shard_run_integration_CPU_2_of_6()
},
'integration: CPU 3 of 6': {
shard_run_integration_CPU_3_of_6()
},
'integration: CPU 4 of 6': {
shard_run_integration_CPU_4_of_6()
},
'integration: CPU 5 of 6': {
shard_run_integration_CPU_5_of_6()
},
'integration: CPU 6 of 6': {
shard_run_integration_CPU_6_of_6()
},
'python: i386 1 of 5': {
shard_run_python_i386_1_of_5()
},
'python: i386 2 of 5': {
shard_run_python_i386_2_of_5()
},
'python: i386 3 of 5': {
shard_run_python_i386_3_of_5()
},
'python: i386 4 of 5': {
shard_run_python_i386_4_of_5()
},
'python: i386 5 of 5': {
shard_run_python_i386_5_of_5()
},
'test: Hexagon 1 of 7': {
shard_run_test_Hexagon_1_of_7()
},
'test: Hexagon 2 of 7': {
shard_run_test_Hexagon_2_of_7()
},
'test: Hexagon 3 of 7': {
shard_run_test_Hexagon_3_of_7()
},
'test: Hexagon 4 of 7': {
shard_run_test_Hexagon_4_of_7()
},
'test: Hexagon 5 of 7': {
shard_run_test_Hexagon_5_of_7()
},
'test: Hexagon 6 of 7': {
shard_run_test_Hexagon_6_of_7()
},
'test: Hexagon 7 of 7': {
shard_run_test_Hexagon_7_of_7()
},
'integration: aarch64 1 of 4': {
shard_run_integration_aarch64_1_of_4()
},
'integration: aarch64 2 of 4': {
shard_run_integration_aarch64_2_of_4()
},
'integration: aarch64 3 of 4': {
shard_run_integration_aarch64_3_of_4()
},
'integration: aarch64 4 of 4': {
shard_run_integration_aarch64_4_of_4()
},
'topi: GPU 1 of 4': {
shard_run_topi_GPU_1_of_4()
},
'topi: GPU 2 of 4': {
shard_run_topi_GPU_2_of_4()
},
'topi: GPU 3 of 4': {
shard_run_topi_GPU_3_of_4()
},
'topi: GPU 4 of 4': {
shard_run_topi_GPU_4_of_4()
},
'frontend: GPU 1 of 6': {
shard_run_frontend_GPU_1_of_6()
},
'frontend: GPU 2 of 6': {
shard_run_frontend_GPU_2_of_6()
},
'frontend: GPU 3 of 6': {
shard_run_frontend_GPU_3_of_6()
},
'frontend: GPU 4 of 6': {
shard_run_frontend_GPU_4_of_6()
},
'frontend: GPU 5 of 6': {
shard_run_frontend_GPU_5_of_6()
},
'frontend: GPU 6 of 6': {
shard_run_frontend_GPU_6_of_6()
},
'topi: aarch64 1 of 2': {
shard_run_topi_aarch64_1_of_2()
},
'topi: aarch64 2 of 2': {
shard_run_topi_aarch64_2_of_2()
},
'frontend: aarch64 1 of 2': {
shard_run_frontend_aarch64_1_of_2()
},
'frontend: aarch64 2 of 2': {
shard_run_frontend_aarch64_2_of_2()
},
'unittest: CPU': {
if (!skip_ci && is_docs_only_build != 1) {
node('CPU-SMALL') {
ws("workspace/exec_${env.EXECUTOR_NUMBER}/tvm/ut-python-cpu") {
timeout(time: max_time, unit: 'MINUTES') {
try {
docker_init(ci_cpu)
init_git()
withEnv(['PLATFORM=cpu'], {
sh(
script: """
set -eux
aws s3 cp --no-progress s3://${s3_prefix}/cpu/build/libtvm.so build/libtvm.so
md5sum build/libtvm.so
aws s3 cp --no-progress s3://${s3_prefix}/cpu/build/libtvm_runtime.so build/libtvm_runtime.so
md5sum build/libtvm_runtime.so
aws s3 cp --no-progress s3://${s3_prefix}/cpu/build/config.cmake build/config.cmake
md5sum build/config.cmake
""",
label: 'Download artifacts from S3',
)
ci_setup(ci_cpu)
cpp_unittest(ci_cpu)
python_unittest(ci_cpu)
fsim_test(ci_cpu)
// sh (
// script: "${docker_run} ${ci_cpu} ./tests/scripts/task_python_vta_tsim.sh",
// label: 'Run VTA tests in TSIM',
// )
})
} finally {
sh(
script: """
set -eux
aws s3 cp --no-progress build/pytest-results s3://${s3_prefix}/pytest-results --recursive
""",
label: 'Upload JUnits to S3',
)
junit 'build/pytest-results/*.xml'
}
}
}
}
} else {
Utils.markStageSkippedForConditional('unittest: CPU')
}
},
'test: QEMU': {
if (!skip_ci && is_docs_only_build != 1) {
node('CPU-SMALL') {
ws("workspace/exec_${env.EXECUTOR_NUMBER}/tvm/test-qemu") {
timeout(time: max_time, unit: 'MINUTES') {
try {
docker_init(ci_qemu)
init_git()
withEnv(['PLATFORM=qemu'], {
sh(
script: """
set -eux
aws s3 cp --no-progress s3://${s3_prefix}/qemu/build/libtvm.so build/libtvm.so
md5sum build/libtvm.so
aws s3 cp --no-progress s3://${s3_prefix}/qemu/build/libtvm_runtime.so build/libtvm_runtime.so
md5sum build/libtvm_runtime.so
aws s3 cp --no-progress s3://${s3_prefix}/qemu/build/config.cmake build/config.cmake
md5sum build/config.cmake
aws s3 cp --no-progress s3://${s3_prefix}/qemu/build/microtvm_template_projects build/microtvm_template_projects --recursive
""",
label: 'Download artifacts from S3',
)
add_microtvm_permissions()
ci_setup(ci_qemu)
cpp_unittest(ci_qemu)
sh (
script: "${docker_run} ${ci_qemu} ./tests/scripts/task_python_microtvm.sh",
label: 'Run microTVM tests',
)
sh (
script: "${docker_run} ${ci_qemu} ./tests/scripts/task_demo_microtvm.sh",
label: 'Run microTVM demos',
)
})
} finally {
sh(
script: """
set -eux
aws s3 cp --no-progress build/pytest-results s3://${s3_prefix}/pytest-results --recursive
""",
label: 'Upload JUnits to S3',
)
junit 'build/pytest-results/*.xml'
}
}
}
}
} else {
Utils.markStageSkippedForConditional('test: QEMU')
}
},
'frontend: CPU': {
if (!skip_ci && is_docs_only_build != 1) {
node('CPU-SMALL') {
ws("workspace/exec_${env.EXECUTOR_NUMBER}/tvm/frontend-python-cpu") {
timeout(time: max_time, unit: 'MINUTES') {
try {
docker_init(ci_cpu)
init_git()
withEnv(['PLATFORM=cpu'], {
sh(
script: """
set -eux
aws s3 cp --no-progress s3://${s3_prefix}/cpu/build/libtvm.so build/libtvm.so
md5sum build/libtvm.so
aws s3 cp --no-progress s3://${s3_prefix}/cpu/build/libtvm_runtime.so build/libtvm_runtime.so
md5sum build/libtvm_runtime.so
aws s3 cp --no-progress s3://${s3_prefix}/cpu/build/config.cmake build/config.cmake
md5sum build/config.cmake
""",
label: 'Download artifacts from S3',
)
ci_setup(ci_cpu)
sh (
script: "${docker_run} ${ci_cpu} ./tests/scripts/task_python_frontend_cpu.sh",
label: 'Run Python frontend tests',
)
})
} finally {
sh(
script: """
set -eux
aws s3 cp --no-progress build/pytest-results s3://${s3_prefix}/pytest-results --recursive
""",
label: 'Upload JUnits to S3',
)
junit 'build/pytest-results/*.xml'
}
}
}
}
} else {
Utils.markStageSkippedForConditional('frontend: CPU')
}
},
'docs: GPU': {
if (!skip_ci) {
node('GPU') {
ws("workspace/exec_${env.EXECUTOR_NUMBER}/tvm/docs-python-gpu") {
docker_init(ci_gpu)
init_git()
sh(
script: """
set -eux
aws s3 cp --no-progress s3://${s3_prefix}/gpu/build/libtvm.so build/libtvm.so
md5sum build/libtvm.so
aws s3 cp --no-progress s3://${s3_prefix}/gpu/build/libtvm_runtime.so build/libtvm_runtime.so
md5sum build/libtvm_runtime.so
aws s3 cp --no-progress s3://${s3_prefix}/gpu/build/config.cmake build/config.cmake
md5sum build/config.cmake
aws s3 cp --no-progress s3://${s3_prefix}/gpu/build/microtvm_template_projects build/microtvm_template_projects --recursive
""",
label: 'Download artifacts from S3',
)
add_microtvm_permissions()
timeout(time: 180, unit: 'MINUTES') {
ci_setup(ci_gpu)
sh (
script: "${docker_run} ${ci_gpu} ./tests/scripts/task_python_docs.sh",
label: 'Build docs',
)
}
sh(
script: """
set -eux
md5sum docs.tgz
aws s3 cp --no-progress docs.tgz s3://${s3_prefix}/docs/docs.tgz
""",
label: 'Upload artifacts to S3',
)
sh(
script: "aws s3 cp --no-progress _docs s3://${s3_prefix}/docs --recursive",
label: 'Upload docs to S3',
)
}
}
}
},
)
}
}/*
stage('Build packages') {
parallel 'conda CPU': {
node('CPU') {
sh "${docker_run} tlcpack/conda-cpu ./conda/build_cpu.sh
}
},
'conda cuda': {
node('CPU') {
sh "${docker_run} tlcpack/conda-cuda90 ./conda/build_cuda.sh
sh "${docker_run} tlcpack/conda-cuda100 ./conda/build_cuda.sh
}
}
// Here we could upload the packages to anaconda for releases
// and/or the main branch
}
*/
def update_docker(ecr_image, hub_image) {
if (!ecr_image.contains("amazonaws.com")) {
sh("echo Skipping '${ecr_image}' since it doesn't look like an ECR image")
return
}
docker_init(ecr_image)
sh(
script: """
set -eux
docker tag \
${ecr_image} \
${hub_image}
docker push ${hub_image}
""",
label: "Update ${hub_image} on Docker Hub",
)
}
def deploy_docs() {
// Note: This code must stay in the Jenkinsfile to ensure that it runs
// from a trusted context only
sh(
script: '''
set -eux
rm -rf tvm-site
git clone -b $DOCS_DEPLOY_BRANCH --depth=1 https://github.com/apache/tvm-site
cd tvm-site
git status
git checkout -B $DOCS_DEPLOY_BRANCH
git ls-tree HEAD docs/ --name-only | grep -vP '^docs/v\\d' | xargs rm -rf
mkdir -p docs
tar xf ../docs.tgz -C docs
COMMIT=$(cat docs/commit_hash)
git add .
git config user.name tvm-bot
git config user.email 95660001+tvm-bot@users.noreply.github.com
git commit -m"deploying docs (apache/tvm@$COMMIT)"
git status
''',
label: 'Unpack docs and update tvm-site'
)
withCredentials([string(
credentialsId: 'docs-push-token',
variable: 'GITHUB_TOKEN',
)]) {
sh(
script: '''
cd tvm-site
git remote add deploy https://$GITHUB_TOKEN:x-oauth-basic@github.com/apache/tvm-site.git
git push deploy $DOCS_DEPLOY_BRANCH
''',
label: 'Upload docs to apache/tvm-site'
)
}
}
def deploy() {
stage('Deploy') {
if (env.BRANCH_NAME == 'main' && env.DOCS_DEPLOY_ENABLED == 'yes') {
node('CPU') {
ws("workspace/exec_${env.EXECUTOR_NUMBER}/tvm/deploy-docs") {
sh(
script: """
set -eux
aws s3 cp --no-progress s3://${s3_prefix}/docs/docs.tgz docs.tgz
md5sum docs.tgz
""",
label: 'Download artifacts from S3',
)
deploy_docs()
}
}
}
if (env.BRANCH_NAME == 'main' && env.DEPLOY_DOCKER_IMAGES == 'yes' && rebuild_docker_images && upstream_revision != null) {
node('CPU') {
ws("workspace/exec_${env.EXECUTOR_NUMBER}/tvm/deploy-docker") {
try {
withCredentials([string(
credentialsId: 'dockerhub-tlcpackstaging-key',
variable: 'DOCKERHUB_KEY',
)]) {
sh(
script: 'docker login -u tlcpackstaging -p ${DOCKERHUB_KEY}',
label: 'Log in to Docker Hub',
)
}
def date_Ymd_HMS = sh(
script: 'python3 -c \'import datetime; print(datetime.datetime.now().strftime("%Y%m%d-%H%M%S"))\'',
label: 'Determine date',
returnStdout: true,
).trim()
def tag = "${date_Ymd_HMS}-${upstream_revision.substring(0, 8)}"
update_docker(ci_arm, "tlcpackstaging/ci_arm:${tag}")
update_docker(ci_cpu, "tlcpackstaging/ci_cpu:${tag}")
update_docker(ci_gpu, "tlcpackstaging/ci_gpu:${tag}")
update_docker(ci_hexagon, "tlcpackstaging/ci_hexagon:${tag}")
update_docker(ci_i386, "tlcpackstaging/ci_i386:${tag}")
update_docker(ci_lint, "tlcpackstaging/ci_lint:${tag}")
update_docker(ci_qemu, "tlcpackstaging/ci_qemu:${tag}")
update_docker(ci_wasm, "tlcpackstaging/ci_wasm:${tag}")
} finally {
sh(
script: 'docker logout',
label: 'Clean up login credentials'
)
}
}
}
}
}
}
cancel_previous_build()
prepare()
if (rebuild_docker_images) {
build_docker_images()
}
lint()
build()
test()
deploy()