Skip to content

Commit

Permalink
[ART-1351] Separate release image tag from name so name is not arch-s…
Browse files Browse the repository at this point in the history
…pecific (#2084)

* [ART-1351] Use ${VERSION}-${ARCH} tags for Quay labels

Remove assumption that release-name == quay-tag on release job - ensure
quay tag is always arch-specific.

* [ART-1351] Distinct between quay_tag and release_name

* [ART-1351] Use release tag instead of name on signing pullspec

* [ART-1351] Distinguish release name from tag in oc_sync

* oc_sync: parameter for arch

* release.groovy: oc tag switch release name/tag

* release.groovy: move arch from nvr to own field
  • Loading branch information
thiagoalessio authored and sosiouxme committed Jan 6, 2020
1 parent 4086c84 commit 7dcb520
Show file tree
Hide file tree
Showing 5 changed files with 73 additions and 35 deletions.
25 changes: 17 additions & 8 deletions jobs/build/oc_sync/Jenkinsfile
Expand Up @@ -4,6 +4,7 @@ node {
checkout scm
def buildlib = load("pipeline-scripts/buildlib.groovy")
def commonlib = buildlib.commonlib
def release = load("pipeline-scripts/release.groovy")

// Expose properties for a parameterized build
properties(
Expand All @@ -18,11 +19,17 @@ node {
$class: 'ParametersDefinitionProperty',
parameterDefinitions: [
[
name: 'FROM_RELEASE_TAG',
description: 'Release tag to pull tools from (e.g. 4.2.6 or 4.3.0-0.nightly-2019-11-13-233341)',
name: 'RELEASE_NAME',
description: 'e.g. 4.2.6 or 4.3.0-0.nightly-2019-11-13-233341',
$class: 'hudson.model.StringParameterDefinition',
defaultValue: ""
],
[
name: 'ARCH',
description: 'architecture being synced',
$class: 'hudson.model.ChoiceParameterDefinition',
choices: ['x86_64', 's390x', 'ppc64le'].join('\n'),
],
[
name: 'CLIENT_TYPE',
description: 'artifacts path under https://mirror.openshift.com',
Expand All @@ -31,7 +38,6 @@ node {
"ocp",
"ocp-dev-preview",
].join("\n"),
defaultValue: "ocp"
],
[
name: 'MAIL_LIST_FAILURE',
Expand All @@ -54,22 +60,25 @@ node {


try {
currentBuild.displayName = "#${currentBuild.number} - ${FROM_RELEASE_TAG} - ${CLIENT_TYPE}"
currentBuild.displayName = "#${currentBuild.number} - ${RELEASE_NAME} - ${CLIENT_TYPE}"

def arch = params.ARCH
def releaseTag = release.destReleaseTag(params.RELEASE_NAME, arch)

if (params.CLIENT_TYPE == 'ocp') {
if (params.FROM_RELEASE_TAG.contains('nightly')) {
if (params.RELEASE_NAME.contains('nightly')) {
error("I'm not sure you want to publish a nightly out as the ocp client type")
}
pull_spec = "quay.io/openshift-release-dev/ocp-release:${params.FROM_RELEASE_TAG}"
pull_spec = "quay.io/openshift-release-dev/ocp-release:${releaseTag}"
} else {
pull_spec = "quay.io/openshift-release-dev/ocp-release-nightly:${params.FROM_RELEASE_TAG}"
pull_spec = "quay.io/openshift-release-dev/ocp-release-nightly:${releaseTag}"
}

sshagent(['aos-cd-test']) {
stage("sync ocp clients") {
// must be able to access remote registry to extract image contents
buildlib.registry_quay_dev_login()
commonlib.shell "./publish-clients-from-payload.sh ${env.WORKSPACE} ${FROM_RELEASE_TAG} ${CLIENT_TYPE} '${pull_spec}'"
commonlib.shell "./publish-clients-from-payload.sh ${env.WORKSPACE} ${RELEASE_NAME} ${CLIENT_TYPE} '${pull_spec}'"
}
}
} catch (err) {
Expand Down
6 changes: 3 additions & 3 deletions jobs/build/pre-release/Jenkinsfile
Expand Up @@ -115,7 +115,7 @@ node {

def dest_release_tag = from_release_tag
if ( params.NEW_NAME_OVERRIDE.trim() != "" ) {
dest_release_tag = params.NEW_NAME_OVERRIDE
dest_release_tag = params.NEW_NAME_OVERRIDE.trim()
}

stage("versions") { release.stageVersions() }
Expand All @@ -129,12 +129,12 @@ node {
}

stage("build payload") {
release.stageGenPayload(quay_url, dest_release_tag, from_release_tag, "", "", "")
release.stageGenPayload(quay_url, dest_release_tag, dest_release_tag, from_release_tag, "", "", "")
}

stage("mirror tools") {
if ( params.MIRROR ) {
release.stagePublishClient(quay_url, dest_release_tag, arch, CLIENT_TYPE)
release.stagePublishClient(quay_url, dest_release_tag, dest_release_tag, arch, CLIENT_TYPE)
}
}

Expand Down
33 changes: 17 additions & 16 deletions jobs/build/release/Jenkinsfile
Expand Up @@ -88,16 +88,17 @@ node {
try {
sshagent(['aos-cd-test']) {
release_info = ""
def dest_release_tag = "${params.NAME}"
arch = release.getReleaseTagArch(params.FROM_RELEASE_TAG)
release_name = params.NAME.trim()
from_release_tag = params.FROM_RELEASE_TAG.trim()
arch = release.getReleaseTagArch(from_release_tag)
archSuffix = release.getArchSuffix(arch)
RELEASE_STREAM_NAME = "4-stable${archSuffix}"
dest_release_tag = release.destReleaseTag(release_name, arch)


from_release_tag = "${params.FROM_RELEASE_TAG}"
description = "${params.DESCRIPTION}"
advisory = params.ADVISORY? Integer.parseInt(params.ADVISORY.toString()) : 0
previous = "${params.PREVIOUS}"
description = params.DESCRIPTION
advisory = params.ADVISORY ? Integer.parseInt(params.ADVISORY.toString()) : 0
previous = params.PREVIOUS
String errata_url
Map release_obj
def CLIENT_TYPE = 'ocp'
Expand All @@ -118,14 +119,14 @@ node {
advisory = advisory?:retval.advisoryInfo.id
errata_url = retval.errataUrl
}
stage("build payload") { release.stageGenPayload(quay_url, dest_release_tag, from_release_tag, description, previous, errata_url) }
stage("tag stable") { release.stageTagRelease(quay_url, dest_release_tag, arch) }
stage("wait for stable") { release_obj = release.stageWaitForStable(RELEASE_STREAM_NAME, dest_release_tag) }
stage("build payload") { release.stageGenPayload(quay_url, release_name, dest_release_tag, from_release_tag, description, previous, errata_url) }
stage("tag stable") { release.stageTagRelease(quay_url, release_name, dest_release_tag, arch) }
stage("wait for stable") { release_obj = release.stageWaitForStable(RELEASE_STREAM_NAME, release_name) }
stage("get release info") {
release_info = release.stageGetReleaseInfo(quay_url, dest_release_tag)
}
stage("advisory image list") {
filename = "${params.NAME}-image-list.txt"
filename = "${dest_release_tag}-image-list.txt"
retry (3) {
commonlib.shell(script: "elliott advisory-images -a ${advisory} > ${filename}")
}
Expand All @@ -134,15 +135,15 @@ node {
to: "openshift-ccs@redhat.com",
cc: "aos-team-art@redhat.com",
replyTo: "aos-team-art@redhat.com",
subject: "OCP ${params.NAME} Image List",
subject: "OCP ${release_name} (${arch}) Image List",
body: readFile(filename)
)
}
buildlib.registry_quay_dev_login() // chances are, earlier auth has expired
stage("mirror tools") { release.stagePublishClient(quay_url, dest_release_tag, arch, CLIENT_TYPE) }
stage("mirror tools") { release.stagePublishClient(quay_url, dest_release_tag, release_name, arch, CLIENT_TYPE) }
stage("advisory update") { release.stageAdvisoryUpdate() }
stage("cross ref check") { release.stageCrossRef() }
stage("send release message") { release.sendReleaseCompleteMessage(release_obj, advisory, errata_url) }
stage("send release message") { release.sendReleaseCompleteMessage(release_obj, advisory, errata_url, arch) }
stage("sign artifacts") {
release.signArtifacts(
name: name,
Expand All @@ -164,11 +165,11 @@ node {
to: "${params.MAIL_LIST_SUCCESS}",
replyTo: "aos-team-art@redhat.com",
from: "aos-art-automation@redhat.com",
subject: "${dry_subject}Success building release payload: ${params.NAME}",
subject: "${dry_subject}Success building release payload: ${release_name} (${arch})",
body: """
Jenkins Job: ${env.BUILD_URL}
Release Page: https://openshift-release${archSuffix}.svc.ci.openshift.org/releasestream/4-stable${archSuffix}/release/${params.NAME}
Quay PullSpec: quay.io/openshift-release-dev/ocp-release:${params.NAME}
Release Page: https://openshift-release${archSuffix}.svc.ci.openshift.org/releasestream/4-stable${archSuffix}/release/${release_name}
Quay PullSpec: quay.io/openshift-release-dev/ocp-release:${dest_release_tag}
${release_info}
""");
Expand Down
15 changes: 14 additions & 1 deletion jobs/signing/sign-artifacts/umb_producer.py
Expand Up @@ -60,6 +60,18 @@
ART_CONSUMER = 'Consumer.openshift-art-signatory.{env}.VirtualTopic.eng.robosignatory.art.sign'


def get_release_tag(release_name, arch):
"""Determine the quay destination tag where a release image lives, based on the
release name and arch (since we can now have multiple arches for each release name)
- make sure it includes the arch in the tag to distinguish from any other releases of same name.
e.g.:
(4.2.0-0.nightly-s390x-2019-12-10-202536, s390x) remains 4.2.0-0.nightly-s390x-2019-12-10-202536
(4.3.0-0.nightly-2019-12-07-121211, x86_64) becomes 4.3.0-0.nightly-2019-12-07-121211-x86_64
"""
return release_name if arch in release_name else "{}-{}".format(release_name, arch)


######################################################################
# Click stuff! Define these here and reuse them later because having
# 'required' options in the global context creates a poor user
Expand Down Expand Up @@ -344,7 +356,8 @@ def json_digest(ctx, requestor, product, request_id, sig_keyname,
}

release_stage = "ocp-release-nightly" if "nightly" in release_name else "ocp-release"
pullspec = "quay.io/openshift-release-dev/{}:{}".format(release_stage, release_name)
release_tag = get_release_tag(release_name, arch)
pullspec = "quay.io/openshift-release-dev/{}:{}".format(release_stage, release_tag)
json_claim['critical']['identity']['docker-reference'] = pullspec

if not digest:
Expand Down
29 changes: 22 additions & 7 deletions pipeline-scripts/release.groovy
Expand Up @@ -14,6 +14,20 @@ def stageVersions() {
sh "elliott --version"
}

/**
* Determine the quay destination tag where a release image lives, based on the
* the release name and arch (since we can now have multiple arches for each
* release name) - make sure it includes the arch in the tag to distinguish
* from any other releases of same name.
*
* e.g.:
* (4.2.0-0.nightly-s390x-2019-12-10-202536, s390x) remains 4.2.0-0.nightly-s390x-2019-12-10-202536
* (4.3.0-0.nightly-2019-12-07-121211, x86_64) becomes 4.3.0-0.nightly-2019-12-07-121211-x86_64
*/
def destReleaseTag(String releaseName, String arch) {
return releaseName.contains(arch) ? releaseName : "${releaseName}-${arch}"
}

/**
* Validate that we have not released the same thing already, and that
* we have a valid advisory if needed.
Expand Down Expand Up @@ -101,7 +115,7 @@ def getArchSuffix(arch) {
return arch == "x86_64" ? "" : "-${arch}"
}

def stageGenPayload(dest_repo, dest_release_tag, from_release_tag, description, previous, errata_url) {
def stageGenPayload(dest_repo, release_name, dest_release_tag, from_release_tag, description, previous, errata_url) {
// build metadata blob
def metadata = "{\"description\": \"${description}\""
if (errata_url) {
Expand All @@ -123,7 +137,7 @@ def stageGenPayload(dest_repo, dest_release_tag, from_release_tag, description,
if (previous != "") {
cmd += "--previous \"${previous}\" "
}
cmd += "--name ${dest_release_tag} "
cmd += "--name ${release_name} "
cmd += "--metadata '${metadata}' "
cmd += "--to-image=${dest_repo}:${dest_release_tag} "

Expand Down Expand Up @@ -167,9 +181,9 @@ def stageSetClientLatest(from_release_tag, arch, client_type) {

}

def stageTagRelease(quay_url, release_tag, arch) {
def stageTagRelease(quay_url, release_name, release_tag, arch) {
def archSuffix = getArchSuffix(arch)
def cmd = "GOTRACEBACK=all ${oc_cmd} tag ${quay_url}:${release_tag} ocp${archSuffix}/release${archSuffix}:${release_tag}"
def cmd = "GOTRACEBACK=all ${oc_cmd} tag ${quay_url}:${release_tag} ocp${archSuffix}/release${archSuffix}:${release_name}"

if (params.DRY_RUN) {
echo "Would have run \n ${cmd}"
Expand Down Expand Up @@ -271,7 +285,7 @@ def stageCrossRef() {
echo "Empty Stage"
}

def stagePublishClient(quay_url, from_release_tag, arch, client_type) {
def stagePublishClient(quay_url, from_release_tag, release_name, arch, client_type) {
def MIRROR_HOST = "use-mirror-upload.ops.rhcloud.com"
def MIRROR_V4_BASE_DIR = "/srv/pub/openshift-v4"

Expand All @@ -281,7 +295,7 @@ def stagePublishClient(quay_url, from_release_tag, arch, client_type) {

// From the newly built release, extract the client tools into the workspace following the directory structure
// we expect to publish to on the use-mirror system.
def CLIENT_MIRROR_DIR="${BASE_TO_MIRROR_DIR}/${arch}/clients/${client_type}/${from_release_tag}"
def CLIENT_MIRROR_DIR="${BASE_TO_MIRROR_DIR}/${arch}/clients/${client_type}/${release_name}"
sh "mkdir -p ${CLIENT_MIRROR_DIR}"
def tools_extract_cmd = "MOBY_DISABLE_PIGZ=true GOTRACEBACK=all oc adm release extract --tools --command-os='*' -n ocp " +
" --to=${CLIENT_MIRROR_DIR} --from ${quay_url}:${from_release_tag}"
Expand Down Expand Up @@ -324,7 +338,7 @@ def getReleaseTagArch(from_release_tag) {
return arch
}

def void sendReleaseCompleteMessage(Map release, int advisoryNumber, String advisoryLiveUrl, String releaseStreamName='4-stable', String providerName = 'Red Hat UMB') {
def void sendReleaseCompleteMessage(Map release, int advisoryNumber, String advisoryLiveUrl, String releaseStreamName='4-stable', String providerName = 'Red Hat UMB', String arch = 'x86_64') {

if (params.DRY_RUN) {
echo "Would have sent release complete message"
Expand All @@ -349,6 +363,7 @@ def void sendReleaseCompleteMessage(Map release, int advisoryNumber, String advi
"name": "ocp-release",
"version": releaseName,
"nvr": "ocp-release-${releaseName}",
"architecture": arch,
"release_stream": releaseStreamName,
"release": release,
"advisory": [
Expand Down

0 comments on commit 7dcb520

Please sign in to comment.