blob: f392fa7aecc80fb7dea165c9c952a72df3af337c [file] [log] [blame]
// -*- 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/
// This job executes a "generic" (CD) release job.
// The pipeline to be executed is defined by the "RELEASE_JOB_TYPE" pipeline parameter.
// This is the path (relative to the CD directory) to a directory containing the following file groovy script
// `Jenkins_pipeline.groovy`.
// See `cd` directory README for more details.
// timeout of each step in minutes
max_time = 180
pipeline {
agent {
label 'restricted-utility'
}
parameters {
// Release parameters
string(defaultValue: "Generic release job", description: "Optional Job name", name: "RELEASE_JOB_NAME")
string(defaultValue: "master", description: "Git Commit to Build", name: "COMMIT_ID")
// Using string instead of choice parameter to keep the changes to the parameters minimal to avoid
// any disruption caused by different COMMIT_ID values chaning the job parameter configuration on
// Jenkins.
string(defaultValue: "mxnet_lib", description: "Pipeline to build", name: "RELEASE_JOB_TYPE")
string(defaultValue: "cpu,native,cu101,cu102,cu110,cu112", description: "Comma separated list of variants", name: "MXNET_VARIANTS")
booleanParam(defaultValue: false, description: 'Whether this is a release build or not', name: "RELEASE_BUILD")
string(defaultValue: "nightly", description: "String used for naming docker images", name: "VERSION")
}
stages {
stage("Init") {
steps {
script {
cd_utils = load('cd/Jenkinsfile_utils.groovy')
ci_utils = load('ci/Jenkinsfile_utils.groovy')
ci_utils.assign_node_labels(
utility: 'restricted-utility',
linux_cpu: 'restricted-mxnetlinux-cpu',
linux_gpu: 'restricted-mxnetlinux-gpu',
linux_gpu_p3: 'restricted-mxnetlinux-gpu-p3',
windows_cpu: 'restricted-mxnetwindows-cpu',
windows_gpu: 'restricted-mxnetwindows-gpu'
)
// Skip Jenkins state update jobs
if (env.RELEASE_JOB_TYPE == cd_utils.STATE_UPDATE) {
echo """\
|Job Type: ${env.RELEASE_JOB_TYPE}
|Commit Id: ${env.GIT_COMMIT}""".stripMargin()
} else {
echo """\
|Job Name: ${env.RELEASE_JOB_NAME}
|Job Type: ${env.RELEASE_JOB_TYPE}
|Release Build: ${params.RELEASE_BUILD}
|Commit Id: ${env.GIT_COMMIT}
|Branch: ${env.GIT_BRANCH}
|Version: ${VERSION}
|Variants: ${params.MXNET_VARIANTS}""".stripMargin()
}
}
}
}
stage("Release Job") {
steps {
script {
// Skip builds for state update job
if (env.RELEASE_JOB_TYPE == cd_utils.STATE_UPDATE) {
currentBuild.result = "SUCCESS"
return
}
// Add new job types here
def valid_job_types = [
"mxnet_lib",
"python/pypi",
"python/docker"
]
// Convert mxnet variants to a list
def mxnet_variants = params.MXNET_VARIANTS.trim().split(',').inject([]) { list, item ->
list << item.trim()
}.findAll { item -> ! (item == null || item.isEmpty()) }
// Exit successfully if there are no variants to build
if (mxnet_variants.size() == 0) {
error "No variants to build..."
}
// Only execute from allowed release job types
if (! (valid_job_types.contains(params.RELEASE_JOB_TYPE))) {
error "Unknown release job type '${params.RELEASE_JOB_TYPE}'"
}
// Load script for the supplied job type
def custom_steps = load("cd/${params.RELEASE_JOB_TYPE}/Jenkins_pipeline.groovy")
// Extract the pipelines for the variants
def pipelines = [:]
for (variant in mxnet_variants) {
pipelines << ["${variant}": custom_steps.get_pipeline(variant)]
}
// Execute them in parallel
// The build result will be set to:
// - SUCCESS if all pipelines succeed
// - UNSTABLE if some (but not all) pipelines fail
// - FAILURE if all pipelines fail
cd_utils.error_checked_parallel(pipelines)
}
}
}
}
}