aboutsummaryrefslogtreecommitdiff
path: root/jenkins/dispatch.groovy
diff options
context:
space:
mode:
authorMatt Rendina <rendinam@users.noreply.github.com>2017-04-07 14:37:30 -0400
committerGitHub <noreply@github.com>2017-04-07 14:37:30 -0400
commit6468929daa2a38757b51d4e99a357a47ab3c55c6 (patch)
tree05a41496625a573990d7b6a9a2bad823328791bc /jenkins/dispatch.groovy
parent33f69dbeda8eb277f8485b9d8a3113c41a3e33ad (diff)
parent58a590aa4995d4ab005a0d25a4e6e914d0460c30 (diff)
downloadbuild_control-6468929daa2a38757b51d4e99a357a47ab3c55c6.tar.gz
Merge pull request #4 from rendinam/granularity
Build granularity implementation
Diffstat (limited to 'jenkins/dispatch.groovy')
-rw-r--r--jenkins/dispatch.groovy157
1 files changed, 157 insertions, 0 deletions
diff --git a/jenkins/dispatch.groovy b/jenkins/dispatch.groovy
new file mode 100644
index 0000000..77ceb36
--- /dev/null
+++ b/jenkins/dispatch.groovy
@@ -0,0 +1,157 @@
+// The conda version shown in the conda_installers list below is installed
+// Where to obtain this file and the manifest files
+this.build_control_URL = "https://github.com/astroconda/build_control"
+
+// first, then the version is forced to this value.
+this.conda_version = "4.2.15"
+
+// Conda-build is installed fresh at this version.
+this.conda_build_version = "2.1.1"
+
+// Where to get the conda installer
+this.conda_base_URL = "https://repo.continuum.io/miniconda/"
+
+this.recipes_dir = "conda-recipes"
+
+// Support utilities
+this.utils_URL = "https://github.com/rendinam/rambo"
+this.utils_dir = "utils"
+
+// The conda installer script to use for various <OS><py_version> combinations.
+this.conda_installers = ["Linux-py2.7":"Miniconda2-4.2.12-Linux-x86_64.sh",
+ "Linux-py3.5":"Miniconda3-4.2.12-Linux-x86_64.sh",
+ "MacOSX-py2.7":"Miniconda2-4.2.12-MacOSX-x86_64.sh",
+ "MacOSX-py3.5":"Miniconda3-4.2.12-MacOSX-x86_64.sh"]
+
+node(LABEL) {
+
+ this.OSname = null
+ def uname = sh(script: "uname", returnStdout: true).trim()
+ if (uname == "Darwin") {
+ this.OSname = "MacOSX"
+ env.PATH = "${env.PATH}:/sw/bin"
+ this.CONDA_BLD_OUTPUT_DIR = "osx-64"
+ }
+ if (uname == "Linux") {
+ this.OSname = uname
+ this.CONDA_BLD_OUTPUT_DIR = "linux-64"
+ }
+ assert uname != null
+
+ println("NODE_NAME = ${env.NODE_NAME}")
+
+ // Delete any existing job workspace directory contents.
+ // The directory deleted is the one named after the jenkins pipeline job.
+ deleteDir()
+
+ // Allow for sharing build_list between stages below.
+ this.build_list = []
+
+ stage('Setup') {
+
+ // Inherited from env() assignment performed in the generator
+ // DSL script.
+ println "LABEL = ${LABEL}"
+ assert LABEL != null
+ assert LABEL != "label-DEFAULTVALUE"
+
+ // Inherited from env() assignment performed in the generator
+ // DSL script.
+ println("PY_VERSION = ${PY_VERSION}")
+ assert PY_VERSION != null
+ assert PY_VERSION != "py_version-DEFAULTVALUE"
+
+ // Inherited from env() assignment performed in the generator
+ // DSL script.
+ println("MANIFEST_FILE = ${MANIFEST_FILE}")
+ assert MANIFEST_FILE != null
+ assert MANIFEST_FILE != "manifest_file-DEFAULTVALUE"
+
+ // Fetch the manifest files
+ git url: this.build_control_URL
+
+ // Check for the availability of a download tool and then use it
+ // to get the conda installer.
+ def dl_cmds = ["wget --no-verbose --server-response --no-check-certificate",
+ "curl -OSs"]
+ def dl_cmd = null
+ def stat1 = 999
+ for (cmd in dl_cmds) {
+ stat1 = sh(script: "which ${cmd.split()[0]}", returnStatus: true)
+ if( stat1 == 0 ) {
+ dl_cmd = cmd
+ break
+ }
+ }
+ if (stat1 != 0) {
+ println("Could not find a download tool. Unable to proceed.")
+ sh "false"
+ }
+
+ def conda_installer =
+ this.conda_installers["${this.OSname}-py${PY_VERSION}"]
+ dl_cmd = dl_cmd + " ${this.conda_base_URL}${conda_installer}"
+ sh dl_cmd
+
+ // Run miniconda installer and then force to particular version
+ sh "bash ./${conda_installer} -b -p miniconda"
+ env.PATH = "${env.WORKSPACE}/miniconda/bin/:" + "${env.PATH}"
+ sh "conda install --quiet conda=${this.conda_version}"
+ sh "conda install --quiet --yes conda-build=${this.conda_build_version}"
+
+ this.manifest = readYaml file: "manifests/" +
+ this.manifest_file
+ println("Manifest repository: ${this.manifest.repository}")
+ println("Manifest numpy version specification: " +
+ "${this.manifest.numpy_version}")
+ println("Manifest packages to build:")
+ for (pkgname in this.manifest.packages) {
+ println(pkgname)
+ }
+
+ // Retrieve conda recipes
+ dir(this.recipes_dir) {
+ git url: this.manifest.repository
+ }
+
+ // Retrieve recipe management tools
+
+
+ }
+
+ stage("Generate build list") {
+ // Call in Rambo.
+ dir(this.utils_dir) {
+ git url: this.utils_URL
+ }
+
+ // Generate a dependency-ordered list of available package recipes.
+ cmd = "${this.utils_dir}/rambo.py --ordered ${this.recipes_dir}"
+ ordered_available =
+ sh(script: cmd, returnStdout: true).trim().tokenize()
+
+ // Compose the ordered union of the list of available recipes and the
+ // actual build manifest.
+ build_list = []
+ for (pkg in ordered_available) {
+ if (pkg in this.manifest.packages) {
+ build_list.push(pkg)
+ }
+ }
+ println("Build list:")
+ println(build_list)
+ }
+
+ stage('Build packages') {
+ for (pkg in build_list) {
+ build job: pkg,
+ parameters:
+ [string(name: 'label', value: env.NODE_NAME),
+ string(name: 'py_version', value: PY_VERSION),
+ string(name: 'numpy_version', value: "${this.manifest.numpy_version}"),
+ string(name: 'parent_workspace', value: env.WORKSPACE)],
+ propagate: false
+ }
+ }
+}
+