diff -r 61d8bee7c4d4 -r 23cdc822cfc5 pipeline.groovy --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pipeline.groovy Wed Nov 02 22:00:20 2016 +0000 @@ -0,0 +1,159 @@ +/* + * Jenkins Pipeline definitions for Smalltalk/X jv-branch + * + * Following pipelines are defined here: + * + * * `build()` - compiles and tests all supported configurations + * No artifacts are archived + * + * * `integration()` - like `build()` pipeline, then all test pass on all + * configurations, archive artifacts and push staged changes to opstream. + */ + + +/* + * Supported configurations + */ +configurations = [ + 'NODE': ['windows' , 'linux' ], + 'ARCH': ['i386', 'x86_64' ] +] + + +/* + * "Default" pipeline: + */ +def build() { + matrix ( configurations ) { + stage ( "Checkout - {${env.NODE}-${env.ARCH}} " ) { + checkout scm + sshagent([ scm.getCredentialsId() ]) { + sh "ruby Jenkinsfile.rb --project \"stx:jv-branch\" --arch ${env.ARCH} --repository-set \"ci-jv\" update" + } + } + + stage ( "Compile - {${env.NODE}-${env.ARCH}}") { + sh "ruby Jenkinsfile.rb --project \"stx:jv-branch\" compile" + } + + stage ( "Test - {${env.NODE}-${env.ARCH}}") { + sh "ruby Jenkinsfile.rb --project \"stx:jv-branch\" test" + junit allowEmptyResults: true, testResults: "reports/*build${env.BUILD_NUMBER}*.xml" + } + } +} + +/* + * "Integration" pipeline + */ +def integration() { + build() + /* + * If a single test fails, abort the pipeline. There's no point + * archiving a broken build. + */ + if (currentBuild.result == 'UNSTABLE') { + return; + } + artifacts() + push_to_upstream() +} + +def combine(configurations, axes = null, axis = 0, partial = new HashMap(), combinations = []) { + def axes0 = axes + if (axes0 == null) { + axes0 = configurations.keySet().toArray(); + } + if ( axis < axes0.length ) { + for ( value in configurations[axes0[axis]] ) { + def combined = partial.clone() + combined[axes0[axis]] = value + combine(configurations, axes0, axis + 1, combined, combinations) + } + } else { + combinations.add(partial) + } + return combinations; +} + + +def matrix(configurations, block) { + def combinations = combine(configurations).toArray() + def branches = [:] + for (i = 0; i < combinations.length; i++) { + def index = i + def conf = combinations[i]; + branches["${conf.NODE}-${conf.ARCH}"] = { + node ( conf.NODE ) { + def newEnv = [] + for (k in conf.keySet()) { + newEnv.add("${k}=${conf[k]}") + } + withEnv ( newEnv ) { + ws ("workspace/${env.JOB_NAME}/${env.ARCH}") { + block() + } + } + } + } + } + parallel branches +} + + + +def any(configurations, block) { + def axes = configurations.keySet().toArray() + def conf = [:] + for (axis in axes) { + conf[axis] = configurations[axis][0] + } + node ( conf.NODE ) { + def newEnv = [] + for (k in conf.keySet()) { + newEnv.add("${k}=${conf[k]}") + } + withEnv ( newEnv ) { + ws ("workspace/${env.JOB_NAME}/${env.ARCH}") { + block() + } + } + } +} + + +def artifacts() { + matrix ( configurations ) { + stage ( "Artifacts - {${env.NODE}-${env.ARCH}}") { + sh "ruby Jenkinsfile.rb --project \"stx:jv-branch\" artifacts" + archiveArtifacts artifacts: "artifacts/*build${env.BUILD_NUMBER}*.zip, artifacts/*build${env.BUILD_NUMBER}*.bz2, artifacts/*build${env.BUILD_NUMBER}*.sha256", fingerprint: true//, onlyIfSuccessful: true + } + } +} + +def push_to_upstream() { + any ( configurations ) { + withCredentials([[$class: 'UsernamePasswordMultiBinding', credentialsId: '1c40eb8f-c7ff-4ef7-8fc8-96aa6310907c', passwordVariable: 'pass', usernameVariable: 'user']]) { + sh "rake \"workflow:push-upstream[${user}, ${pass}]\"" + } + } +} + + + + +/* + * A test pipeline. Does not build anything but usefull for + * testing configuration and matrix() / any() functions + */ +def test_pipeline() { + matrix( configurations ) { + echo "Testing matrix() ${env.NODE}, ${env.ARCH}" + } + + any ( configurations ) { + echo "Testing any() ${env.NODE}, ${env.ARCH}" + } +} + +return this; \ No newline at end of file