diff --git a/jenkins/generator_DSL.groovy b/jenkins/generator_DSL.groovy index f74275c..7dd10ea 100644 --- a/jenkins/generator_DSL.groovy +++ b/jenkins/generator_DSL.groovy @@ -6,20 +6,9 @@ import org.yaml.snakeyaml.Yaml def yaml = new Yaml() def config = yaml.load(readFileFromWorkspace("manifests/${manifest_file}")) -def job_def_generation_time = new Date() +def job_def_generation_time = new Date() -//----------------------------------------------------------------------- -// Create a folder to contain the jobs which are created below. - -suite_name = "${manifest_file.tokenize(".")[0]}_${label}_py${py_version}" -folder(suite_name) - - -//----------------------------------------------------------------------- -// Generate the dispatch job that will trigger the chain of package -// build jobs. - this.script = "dispatch.groovy" this.build_control_repo = readFileFromWorkspace("VAR-build_control_repo") @@ -27,93 +16,118 @@ this.build_control_repo = this.build_control_repo.trim() this.build_control_branch = readFileFromWorkspace("VAR-build_control_branch") this.build_control_branch= this.build_control_branch.trim() -pipelineJob("${suite_name}/_${script.tokenize(".")[0]}") { - // At trigger-time, allow for setting manifest culling behavior. - parameters { - booleanParam("cull_manifest", - true, - "Whether or not package recipes that would generate a " + - "package file name that already exists in the manfest's" + - " channel archive are removed from the build list.") - } - println("\n" + - "script: ${this.script}\n" + - "MANIFEST_FILE: ${manifest_file}\n" + - "LABEL: ${label}\n" + - "PY_VERSION: ${py_version}\n" + - "BUILD_CONTROL_REPO: ${build_control_repo}\n" + - "BUILD_CONTROL_BRANCH: ${build_control_branch}\n" + - "CONDA_VERSION: ${conda_version}\n" + - "CONDA_BUILD_VERSION: ${conda_build_version}\n" + - "CONDA_BASE_URL: ${conda_base_URL}\n" + - "UTILS_REPO: ${utils_repo}\n") - environmentVariables { - env("JOB_DEF_GENERATION_TIME", job_def_generation_time) - env("SCRIPT", this.script) - env("MANIFEST_FILE", manifest_file) - env("LABEL", label) - env("PY_VERSION", py_version) - env("BUILD_CONTROL_REPO", build_control_repo) - env("BUILD_CONTROL_BRANCH", build_control_branch) - env("CONDA_VERSION", conda_version) - env("CONDA_BUILD_VERSION", conda_build_version) - env("CONDA_BASE_URL", conda_base_URL) - env("UTILS_REPO", utils_repo) - } - definition { - cps { - script(readFileFromWorkspace("jenkins/${this.script}")) - sandbox() +// For each label (OS) in the list provided by the 'labels' job parameter, iterate +// over each python version provided by the 'py_versions' job parameter, to obtain +// every combination of OS and python version. Generate a separate job suite for +// each combination. +for (label in labels.trim().tokenize()) { + for (py_version in py_versions.trim().tokenize()) { + + //----------------------------------------------------------------------- + // Create a folder to contain the jobs which are created below. + + suite_name = "${manifest_file.tokenize(".")[0]}_${label}_py${py_version}" + folder(suite_name) { + description("Build suite generated: ${job_def_generation_time}\n" + + "build control repo: ${build_control_repo}\n" + + "build control branch/tag: ${build_control_branch}\n" + + "conda version: ${conda_version}\n" + + "conda-build version: ${conda_build_version}\n" + + "utils_repo: ${utils_repo}") } - } -} - - -//----------------------------------------------------------------------- -// Generate the series of actual package building jobs. -for(pkg in config.packages) { - - pipelineJob("${suite_name}/${pkg}") { - environmentVariables { - env("JOB_DEF_GENERATION_TIME", job_def_generation_time) - } - parameters { - stringParam("label", - "label-DEFAULTVALUE", - "The node on which to run.") - stringParam("build_control_repo", - "build_control_repo-DEFAULTVALUE", - "Repository containing the build system scripts.") - stringParam("build_control_branch", - "build_control_branch-DEFAULTVALUE", - "Branch checked out to obtain build system scripts.") - stringParam("py_version", - "py_version-DEFAULTVALUE", - "python version to use") - stringParam("numpy_version", - "numpy_version-DEFAULTVALUE", - "Version of numpy to use") - stringParam("parent_workspace", - "parent_workspace-DEFAULTVALUE", - "The workspace dir of the dispatch job") - stringParam("manifest_file", - "manifest_file-DEFAULTVALUE", - "Manifest (release) file to use for the build.") - stringParam("cull_manifest", - "cull_manifest-DEFAULTVALUE", - "Was the manifest culled as part of dispatch?") - stringParam("channel_URL", - "channel_URL-DEFAULTVALUE", - "Publication channel used for culled builds.") - } - definition { - cps { - script(readFileFromWorkspace("jenkins/package_builder.groovy")) - sandbox() + //----------------------------------------------------------------------- + // Generate the dispatch job that will trigger the chain of package + // build jobs. + pipelineJob("${suite_name}/_${script.tokenize(".")[0]}") { + // At trigger-time, allow for setting manifest culling behavior. + parameters { + booleanParam("cull_manifest", + true, + "Whether or not package recipes that would generate a " + + "package file name that already exists in the manfest's" + + " channel archive are removed from the build list.") + } + println("\n" + + "script: ${this.script}\n" + + "MANIFEST_FILE: ${manifest_file}\n" + + "LABEL: ${label}\n" + + "PY_VERSION: ${py_version}\n" + + "BUILD_CONTROL_REPO: ${build_control_repo}\n" + + "BUILD_CONTROL_BRANCH: ${build_control_branch}\n" + + "CONDA_VERSION: ${conda_version}\n" + + "CONDA_BUILD_VERSION: ${conda_build_version}\n" + + "CONDA_BASE_URL: ${conda_base_URL}\n" + + "UTILS_REPO: ${utils_repo}\n") + environmentVariables { + env("JOB_DEF_GENERATION_TIME", job_def_generation_time) + env("SCRIPT", this.script) + env("MANIFEST_FILE", manifest_file) + env("LABEL", label) + env("PY_VERSION", py_version) + env("BUILD_CONTROL_REPO", build_control_repo) + env("BUILD_CONTROL_BRANCH", build_control_branch) + env("CONDA_VERSION", conda_version) + env("CONDA_BUILD_VERSION", conda_build_version) + env("CONDA_BASE_URL", conda_base_URL) + env("UTILS_REPO", utils_repo) + } + definition { + cps { + script(readFileFromWorkspace("jenkins/${this.script}")) + sandbox() + } } } - } // end pipelineJob -} //end for(pkg... + //----------------------------------------------------------------------- + // Generate the series of actual package building jobs. + + for(pkg in config.packages) { + + pipelineJob("${suite_name}/${pkg}") { + environmentVariables { + env("JOB_DEF_GENERATION_TIME", job_def_generation_time) + } + parameters { + stringParam("label", + "label-DEFAULTVALUE", + "The node on which to run.") + stringParam("build_control_repo", + "build_control_repo-DEFAULTVALUE", + "Repository containing the build system scripts.") + stringParam("build_control_branch", + "build_control_branch-DEFAULTVALUE", + "Branch checked out to obtain build system scripts.") + stringParam("py_version", + "py_version-DEFAULTVALUE", + "python version to use") + stringParam("numpy_version", + "numpy_version-DEFAULTVALUE", + "Version of numpy to use") + stringParam("parent_workspace", + "parent_workspace-DEFAULTVALUE", + "The workspace dir of the dispatch job") + stringParam("manifest_file", + "manifest_file-DEFAULTVALUE", + "Manifest (release) file to use for the build.") + stringParam("cull_manifest", + "cull_manifest-DEFAULTVALUE", + "Was the manifest culled as part of dispatch?") + stringParam("channel_URL", + "channel_URL-DEFAULTVALUE", + "Publication channel used for culled builds.") + } + definition { + cps { + script(readFileFromWorkspace("jenkins/package_builder.groovy")) + sandbox() + } + } + } // end pipelineJob + + } //end for(pkg... + + } // end for(py_version +} // end for(label diff --git a/jenkins/job-suite-generator.groovy b/jenkins/job-suite-generator.groovy index 1501b69..c53ec2e 100644 --- a/jenkins/job-suite-generator.groovy +++ b/jenkins/job-suite-generator.groovy @@ -59,8 +59,8 @@ node("master") { "build_control_branch: ${build_control_branch}\n" + " Parameters:\n" + "manifest_file: ${this.manifest_file}\n" + - "label: ${this.label}\n" + - "py_version: ${this.py_version}\n" + + "labels: ${this.labels}\n" + + "py_versions: ${this.py_versions}\n" + "conda_version: ${this.conda_version}\n" + "conda_build_version: ${this.conda_build_version}\n" + "conda_base_URL: ${this.conda_base_URL}\n" +