diff --git a/etc/scipipe/build_matrix.yaml b/etc/scipipe/build_matrix.yaml index efb07b8f..02dad050 100644 --- a/etc/scipipe/build_matrix.yaml +++ b/etc/scipipe/build_matrix.yaml @@ -78,9 +78,10 @@ scipipe-lsstsw-ci_imsim: canonical: products: &canonical_products lsst_distrib lsst_ci lsst_middleware lsstsw_config: - <<: *el7-conda - label: snowflake-0 - display_name: centos-7 + - <<: *el7-conda + label: snowflake-0 + - <<: *linux-9-arm + label: snowflake-arch-0 workspace: snowflake/release # # eups distrib tarball configuration -- used by @@ -103,6 +104,16 @@ tarball: osfamily: osx timelimit: 8 allow_fail: true + - <<: *tarball_defaults + <<: *linux-9-arm + platform: el8-arm + osfamily: redhat + - <<: *tarball_defaults + <<: *macarm64-conda + platform: 14-arm + osfamily: osx + timelimit: 8 + allow_fail: true # # X-release pattern pipelines # @@ -127,7 +138,7 @@ versiondb: release_tag_org: lsst lsstsw: github_repo: lsst/lsstsw - git_ref: main + git_ref: tickets/DM-46554 ciscripts: github_repo: lsst-sqre/ci-scripts git_ref: main @@ -155,7 +166,7 @@ newinstall: repo: ghcr.io/lsst-dm/docker-newinstall tag: 9-latest github_repo: lsst/lsst - git_ref: main + git_ref: tickets/DM-46554 eups: - base_url: https://eups.lsst.codes/stack + base_url: https://eups.lsst.codes/stack_test s3_bucket: eups.lsst.codes diff --git a/jobs/tarball.groovy b/jobs/tarball.groovy index 033f28f2..566d6319 100644 --- a/jobs/tarball.groovy +++ b/jobs/tarball.groovy @@ -20,7 +20,7 @@ p.pipeline().with { booleanParam('WIPEOUT', false, 'Completely wipe out workspace(s) before starting build.') stringParam('TIMEOUT', '23', 'build timeout in hours') stringParam('IMAGE', null, 'Pipeline base docker image (e.g. docker.io/lsstdm/scipipe-base:8 or empty for macOS)') - choiceParam('LABEL', ['docker', 'arm64', 'osx-13', 'osx-14'], 'Jenkins build agent label') + choiceParam('LABEL', ['docker', 'arm64', 'osx-13', 'osx-14', 'mini'], 'Jenkins build agent label') stringParam('COMPILER', 'conda-system', 'compiler version string') choiceParam('PYTHON_VERSION', ['3'], 'Python major version') stringParam('MINIVER', scipipe.template.tarball_defaults.miniver, 'Miniconda installer version') diff --git a/pipelines/lib/util.groovy b/pipelines/lib/util.groovy index adcb30af..cc3936b0 100644 --- a/pipelines/lib/util.groovy +++ b/pipelines/lib/util.groovy @@ -626,7 +626,7 @@ def void requireEnvVars(List rev) { // note that `env` isn't a map and #get doesn't work as expected rev.each { it -> if (env."${it}" == null) { - error "${it} envirnoment variable is required" + error "${it} environment variable is required" } } } @@ -686,20 +686,19 @@ def void createDirs(List eds) { * @param filename String Output filename. */ def void getManifest(String rebuildId, String filename) { - def manifest_artifact = 'lsstsw/build/manifest.txt' def buildJob = 'release/run-rebuild' - step([$class: 'CopyArtifact', + step([$class: 'CopyArtifact', projectName: buildJob, - filter: manifest_artifact, - selector: [ - $class: 'SpecificBuildSelector', + filter: "**/lsstsw/build/manifest.txt", + target: 'buildmanifest', + selector: [ + $class: 'SpecificBuildSelector', buildNumber: rebuildId // wants a string - ], - ]) - - def manifest = readFile manifest_artifact - writeFile(file: filename, text: manifest) + ], + ]) + def manifest = readFile('buildmanifest/lsstsw/build/manifest.txt') + writeFile(file: filename, text: manifest) } // getManifest /** @@ -1385,20 +1384,21 @@ def String runRebuild(Map p) { parameters: jobParameters, wait: true, ) - nodeTiny { - manifestArtifact = 'lsstsw/build/manifest.txt' step([$class: 'CopyArtifact', projectName: useP.job, - filter: manifestArtifact, + filter: "**/lsstsw/build/manifest.txt", + //target: manifestArtifact, + target: 'buildmanifest', selector: [ $class: 'SpecificBuildSelector', buildNumber: result.id, ], ]) + def manifestId = parseManifestId(readFile('buildmanifest/lsstsw/build/manifest.txt')) + // echo sh(returnStdout: true, script: 'env|sort') - def manifestId = parseManifestId(readFile(manifestArtifact)) echo "parsed manifest id: ${manifestId}" return manifestId } // nodeTiny @@ -2300,4 +2300,5 @@ def void nodeWrap(String label, Closure run) { } } + return this; diff --git a/pipelines/release/docker/build_stack.groovy b/pipelines/release/docker/build_stack.groovy index d9e43c54..fc446fed 100644 --- a/pipelines/release/docker/build_stack.groovy +++ b/pipelines/release/docker/build_stack.groovy @@ -36,6 +36,9 @@ notify.wrap { String manifestId = params.MANIFEST_ID ?: '' String lsstCompiler = params.LSST_COMPILER ?: '' + + def canonical = scipipe.canonical + def lsstswConfigs = canonical.lsstsw_config def release = scipipe.scipipe_release def dockerfile = release.dockerfile def dockerRegistry = release.docker_registry @@ -49,9 +52,14 @@ notify.wrap { def timestamp = util.epochMilliToUtc(currentBuild.startTimeInMillis) def shebangtronUrl = util.shebangtronUrl() + def matrix = [:] + lsstswConfigs.each{ lsstswConfig -> + def slug = util.lsstswConfigSlug(lsstswConfig) + matrix[slug] ={ + def newinstallImage = newinstall.docker_registry.repo def newinstallTagBase = newinstall.docker_registry.tag - def splenvRef = scipipe.canonical.lsstsw_config.splenv_ref + def splenvRef = lsstswConfig.splenv_ref if (params.SPLENV_REF) { splenvRef = params.SPLENV_REF } @@ -139,7 +147,7 @@ notify.wrap { } // push } // run - util.nodeWrap('docker') { + util.nodeWrap(lsstswConfig.label) { try { timeout(time: timelimit, unit: 'HOURS') { run() @@ -164,4 +172,8 @@ notify.wrap { } // stage } // try } // util.nodeWrap + } +} +parallel matrix + } // notify.wrap diff --git a/pipelines/release/nightly_release.groovy b/pipelines/release/nightly_release.groovy index c1a61ca2..cb9e3a8b 100644 --- a/pipelines/release/nightly_release.groovy +++ b/pipelines/release/nightly_release.groovy @@ -31,7 +31,7 @@ notify.wrap { def manifestId = null def stackResults = null - def lsstswConfig = scipipe.canonical.lsstsw_config + def lsstswConfigs = scipipe.canonical.lsstsw_config def run = { stage('format nightly tag') { @@ -46,7 +46,7 @@ notify.wrap { manifestId = util.runRebuild( parameters: [ PRODUCTS: products, - BUILD_DOCS: true, + BUILD_DOCS: false, ], ) } // retry @@ -55,7 +55,9 @@ notify.wrap { stage('eups publish') { def pub = [:] - [eupsTag, 'd_latest'].each { tagName -> + [eupsTag, + //'d_latest' + ].each { tagName -> pub[tagName] = { retry(retries) { util.runPublish( @@ -64,6 +66,7 @@ notify.wrap { MANIFEST_ID: manifestId, EUPS_TAG: tagName, PRODUCTS: products, + BUILD_DOCS: false, ], ) } // retry @@ -134,7 +137,7 @@ notify.wrap { EUPS_TAG: eupsTag, DOCKER_TAGS: extraDockerTags, MANIFEST_ID: manifestId, - LSST_COMPILER: lsstswConfig.compiler, + LSST_COMPILER: lsstswConfigs.compiler[0], ], ) } // retry @@ -142,72 +145,72 @@ notify.wrap { def triggerMe = [:] - triggerMe['build Science Platform Notebook Aspect Lab image'] = { - retry(retries) { - // based on lsstsqre/stack image - build( - job: 'sqre/infra/build-sciplatlab', - parameters: [ - string(name: 'TAG', value: eupsTag), - ], - wait: false, - ) - } // retry - } - - triggerMe['verify_drp_metrics'] = { - retry(1) { - // based on lsstsqre/stack image - build( - job: 'sqre/verify_drp_metrics', - parameters: [ - string(name: 'DOCKER_IMAGE', value: stackResults.image), - booleanParam( - name: 'NO_PUSH', - value: scipipe.release.step.verify_drp_metrics.no_push, - ), - booleanParam(name: 'WIPEOUT', value: false), - string(name: 'GIT_REF', value: 'main'), - ], - wait: false, - ) - } // retry - } - - triggerMe['doc build'] = { - retry(retries) { - build( - job: 'sqre/infra/documenteer', - parameters: [ - string(name: 'EUPS_TAG', value: eupsTag), - string(name: 'LTD_SLUG', value: eupsTag), - string(name: 'RELEASE_IMAGE', value: stackResults.image), - booleanParam( - name: 'PUBLISH', - value: scipipe.release.step.documenteer.publish, - ), - ], - wait: false, - ) - } // retry - } - - triggerMe['ap_verify'] = { - retry(retries) { - build( - job: 'scipipe/ap_verify', - parameters: [ - string(name: 'DOCKER_IMAGE', value: stackResults.image), - booleanParam( - name: 'NO_PUSH', - value: scipipe.release.step.ap_verify.no_push, - ), - booleanParam(name: 'WIPEOUT', value: false), - ], - wait: false, - ) - } // retry - } + // triggerMe['build Science Platform Notebook Aspect Lab image'] = { + // retry(retries) { + // // based on lsstsqre/stack image + // build( + // job: 'sqre/infra/build-sciplatlab', + // parameters: [ + // string(name: 'TAG', value: eupsTag), + // ], + // wait: false, + // ) + // } // retry + // } + + // triggerMe['verify_drp_metrics'] = { + // retry(1) { + // // based on lsstsqre/stack image + // build( + // job: 'sqre/verify_drp_metrics', + // parameters: [ + // string(name: 'DOCKER_IMAGE', value: stackResults.image), + // booleanParam( + // name: 'NO_PUSH', + // value: scipipe.release.step.verify_drp_metrics.no_push, + // ), + // booleanParam(name: 'WIPEOUT', value: false), + // string(name: 'GIT_REF', value: 'main'), + // ], + // wait: false, + // ) + // } // retry + // } + + // triggerMe['doc build'] = { + // retry(retries) { + // build( + // job: 'sqre/infra/documenteer', + // parameters: [ + // string(name: 'EUPS_TAG', value: eupsTag), + // string(name: 'LTD_SLUG', value: eupsTag), + // string(name: 'RELEASE_IMAGE', value: stackResults.image), + // booleanParam( + // name: 'PUBLISH', + // value: scipipe.release.step.documenteer.publish, + // ), + // ], + // wait: false, + // ) + // } // retry + // } + + // triggerMe['ap_verify'] = { + // retry(retries) { + // build( + // job: 'scipipe/ap_verify', + // parameters: [ + // string(name: 'DOCKER_IMAGE', value: stackResults.image), + // booleanParam( + // name: 'NO_PUSH', + // value: scipipe.release.step.ap_verify.no_push, + // ), + // booleanParam(name: 'WIPEOUT', value: false), + // ], + // wait: false, + // ) + // } // retry + // } stage('triggered jobs') { parallel triggerMe diff --git a/pipelines/release/run_publish.groovy b/pipelines/release/run_publish.groovy index 32ee032a..23c2b7c8 100644 --- a/pipelines/release/run_publish.groovy +++ b/pipelines/release/run_publish.groovy @@ -33,9 +33,9 @@ notify.wrap { Boolean pushS3 = (! params.NO_PUSH?.toBoolean()) def canonical = scipipe.canonical - def lsstswConfig = canonical.lsstsw_config + def lsstswConfigs = canonical.lsstsw_config - def splenvRef = lsstswConfig.splenv_ref + def splenvRef = lsstswConfigs.splenv_ref if (params.SPLENV_REF) { splenvRef = params.SPLENV_REF } @@ -43,11 +43,13 @@ notify.wrap { if (params.RUBINENV_VER) { rubinEnvVer = params.RUBINENV_VER } - - def slug = util.lsstswConfigSlug(lsstswConfig) - - def run = { - ws(canonical.workspace) { + def matrix = [:] + lsstswConfigs.each{ lsstswConfig -> + def slug = util.lsstswConfigSlug(lsstswConfig) + matrix[slug] ={ + def run = { + def workingDir = canonical.workspace + "/${lsstswConfig.display_name}" + ws(workingDir) { def cwd = pwd() def pkgroot = "${cwd}/distrib" @@ -98,7 +100,6 @@ notify.wrap { # this can be retrived using the -b option. # (note: bin/setup.sh is now deprecated) source ./lsstsw/bin/envconfig -n "lsst-scipipe-$LSST_SPLENV_REF" - publish "${ARGS[@]}" ''' } @@ -106,7 +107,7 @@ notify.wrap { } // stage('publish') stage('push packages') { - if (pushS3) { + if (false) { withCredentials([[ $class: 'UsernamePasswordMultiBinding', credentialsId: 'aws-eups-push', @@ -142,10 +143,12 @@ notify.wrap { } // stage('push packages') } // ws } // run - - util.nodeWrap(lsstswConfig.label) { + util.nodeWrap(lsstswConfig.label) { timeout(time: timelimit, unit: 'HOURS') { run() } } -} // notify.wrap + } + } + parallel matrix +} // notify.wrap \ No newline at end of file diff --git a/pipelines/release/run_rebuild.groovy b/pipelines/release/run_rebuild.groovy index 5a6799c7..696184d2 100644 --- a/pipelines/release/run_rebuild.groovy +++ b/pipelines/release/run_rebuild.groovy @@ -45,18 +45,20 @@ notify.wrap { } def canonical = scipipe.canonical - def lsstswConfig = canonical.lsstsw_config + def lsstswConfigs = canonical.lsstsw_config - def splenvRef = lsstswConfig.splenv_ref - if (params.SPLENV_REF) { - splenvRef = params.SPLENV_REF - } - - def slug = util.lsstswConfigSlug(lsstswConfig) - - def run = { - ws(canonical.workspace) { + def matrix = [:] + lsstswConfigs.each{ lsstswConfig -> + def slug = util.lsstswConfigSlug(lsstswConfig) + matrix[slug] ={ + def run = { + def workingDir = canonical.workspace + "/${lsstswConfig.display_name}" + ws(workingDir) { def cwd = pwd() + splenvRef = lsstswConfig.splenv_ref + if (params.SPLENV_REF) { + splenvRef = params.SPLENV_REF + } def buildParams = [ EUPS_PKGROOT: "${cwd}/distrib", @@ -70,8 +72,8 @@ notify.wrap { LSST_PYTHON_VERSION: lsstswConfig.python, LSST_SPLENV_REF: splenvRef, LSST_REFS: refs, - VERSIONDB_PUSH: versiondbPush, - VERSIONDB_REPO: versiondbRepo, + // VERSIONDB_PUSH: versiondbPush, + // VERSIONDB_REPO: versiondbRepo, ] def runJW = { @@ -136,17 +138,21 @@ notify.wrap { "${DOC_PUSH_PATH}/" \ "s3://${DOXYGEN_S3_BUCKET}/stack/doxygen/" ''' - } // util.insideDockerWrap - } // withEnv - } // withCredentials - } - } // stage('push docs') - } // ws - } // run + } // util.insideDockerWrap + } // withEnv + } // withCredentials + } + } // stage('push docs') + } // ws + } // run - util.nodeWrap(lsstswConfig.label) { + util.nodeWrap(lsstswConfig.label) { timeout(time: timelimit, unit: 'HOURS') { run() + } } } +} +parallel matrix + } // notify.wrap diff --git a/pipelines/release/tarball.groovy b/pipelines/release/tarball.groovy index 7cf6694e..4431fc5a 100644 --- a/pipelines/release/tarball.groovy +++ b/pipelines/release/tarball.groovy @@ -142,7 +142,7 @@ def void linuxTarballs( } // util.withEupsEnv } // run() - util.nodeWrap('docker') { + util.nodeWrap(label) { timeout(time: timelimit, unit: 'HOURS') { run() }