From 52152f82b88ad3408e3a8a57568fe1c21368a6a7 Mon Sep 17 00:00:00 2001 From: Yuxiang Zhu Date: Feb 21 2019 03:08:40 +0000 Subject: Trigger integration tests on repotracker messages This PR introduces a new job that starts an integration test automatically when the image with :latest or :stage is changed. After the test is complete, the result is sent to ResultsDB for Greenwave to decide if it is good for promotion. The job is configured with CIBuildTrigger supported by the [JMS Messaging plugin][2], which consumes the CI message sent by [repotracker][1]. [1]: https://github.com/release-engineering/repotracker [2]: https://github.com/jenkinsci/jms-messaging-plugin --- diff --git a/openshift/pipelines/jobs/waiverdb-repotracker-trigger.env b/openshift/pipelines/jobs/waiverdb-repotracker-trigger.env new file mode 100644 index 0000000..1f18f42 --- /dev/null +++ b/openshift/pipelines/jobs/waiverdb-repotracker-trigger.env @@ -0,0 +1 @@ +NAME=waiverdb-repotracker-trigger diff --git a/openshift/pipelines/jobs/waiverdb-repotracker-trigger.tmpl b/openshift/pipelines/jobs/waiverdb-repotracker-trigger.tmpl new file mode 100644 index 0000000..9637c92 --- /dev/null +++ b/openshift/pipelines/jobs/waiverdb-repotracker-trigger.tmpl @@ -0,0 +1 @@ +waiverdb-repotracker-trigger.yaml diff --git a/openshift/pipelines/templates/waiverdb-repotracker-trigger.Jenkinsfile b/openshift/pipelines/templates/waiverdb-repotracker-trigger.Jenkinsfile new file mode 100644 index 0000000..a37e1ce --- /dev/null +++ b/openshift/pipelines/templates/waiverdb-repotracker-trigger.Jenkinsfile @@ -0,0 +1,94 @@ +// Use scripted syntax because CIBuildTrigger currently doesn't support the declarative syntax +properties([ + disableConcurrentBuilds(), + pipelineTriggers([ + // example: https://github.com/jenkinsci/jms-messaging-plugin/blob/9b9387c3a52f037ba0d019c2ebcf2a2796fc6397/src/test/java/com/redhat/jenkins/plugins/ci/integration/AmqMessagingPluginIntegrationTest.java + [$class: 'CIBuildTrigger', + providerData: [$class: 'ActiveMQSubscriberProviderData', + name: 'Red Hat UMB', + overrides: [topic: "Consumer.rh-jenkins-ci-plugin.c3i-${env.JOB_BASE_NAME}.VirtualTopic.eng.repotracker.container.tag.>"], + selector: "repo='${TRACKED_CONTAINER_REPO}'", + checks: [ + [field: '$.action', expectedValue: 'added|updated'], + ], + ], + ], + ]), + parameters([ + stringParam( + defaultValue: '', + description: '(Used by CIBuildTrigger internally)', + name: 'CI_MESSAGE' + ), + stringParam( + defaultValue: '', + description: '(Used by CIBuildTrigger internally)', + name: 'MESSAGE_HEADERS' + ), + ]), +]) + +if (!params.CI_MESSAGE) { + echo 'This build is not started by a CI message. Only configurations were done.' + return +} + +def label = "jenkins-slave-${UUID.randomUUID().toString()}" +podTemplate( + cloud: "${params.OPENSHIFT_CLOUD_NAME}", + label: label, + serviceAccount: "${env.JENKINS_AGENT_SERVICE_ACCOUNT}", + defaultContainer: 'jnlp', + yaml: """ + apiVersion: v1 + kind: Pod + metadata: + labels: + app: "jenkins-${env.JOB_BASE_NAME}" + factory2-pipeline-kind: "waiverdb-repotracker-trigger" + factory2-pipeline-build-number: "${env.BUILD_NUMBER}" + spec: + containers: + - name: jnlp + image: ${params.JENKINS_AGENT_IMAGE} + imagePullPolicy: Always + tty: true + resources: + requests: + memory: 256Mi + cpu: 200m + limits: + memory: 512Mi + cpu: 300m + """ +) { + node(label) { + stage('trigger test') { + def promotionMap = [ + 'latest': 'stage', + 'stage': 'prod', + ] + def message = readJSON text: params.CI_MESSAGE + def changedTag = message.tag + echo "Tag :$changedTag is ${message.action} in ${message.repo}. New digest: ${message.digest}" + def promoteTo = promotionMap[changedTag] + if (!promoteTo) { + error("I don't know where to promote :$changedTag. Aborting...") + } + def image = "${message.repo}@${message.digest}" + echo "Triggering a job to test if $image meets all criteria of desired tag :${promoteTo}" + def buildInfo = null + openshift.withCluster() { + def testBcSelector = openshift.selector('bc', "waiverdb-${promoteTo}-integration-test") + def buildSelector = testBcSelector.startBuild( + '-e', "IMAGE=${image}", + ) + buildSelector.watch { + return !(it.object().status.phase in ["New", "Pending"]) + } + buildInfo = buildSelector.object() + } + echo "Build ${buildInfo.metadata.annotations['openshift.io/jenkins-build-uri'] ?: buildInfo.metadata.name} started." + } + } +} diff --git a/openshift/pipelines/templates/waiverdb-repotracker-trigger.yaml b/openshift/pipelines/templates/waiverdb-repotracker-trigger.yaml new file mode 100644 index 0000000..ebd64f6 --- /dev/null +++ b/openshift/pipelines/templates/waiverdb-repotracker-trigger.yaml @@ -0,0 +1,79 @@ +# Template to produce a new OpenShift pipeline job for triggering a build on repotracker messages +# +--- +apiVersion: v1 +kind: Template +metadata: + name: waiverdb-repotracker-trigger +labels: + template: waiverdb-repotracker-trigger +parameters: +- name: NAME + displayName: Short unique identifier for the templated instances + description: This field is used to deploy multiple pipelines to one OpenShift project from this template. + value: waiverdb-repotracker-trigger +- name: WAIVERDB_GIT_REPO + displayName: WaiverDB Git repo URL + description: Default WaiverDB Git repo URL in which to run dev tests against + value: "https://pagure.io/waiverdb.git" +- name: WAIVERDB_GIT_REF + displayName: WaiverDB Git repo ref + description: Default WaiverDB Git repo ref in which to run dev tests against + value: master +- name: TRACKED_CONTAINER_REPO + displayName: Container repo to be tracked + value: "quay.io/factory2/waiverdb" +- name: JENKINS_AGENT_IMAGE + displayName: Container image for Jenkins slave pods + value: docker-registry.engineering.redhat.com/factory2/waiverdb-jenkins-slave:latest +- name: OPENSHIFT_CLOUD_NAME + displayName: Name of OpenShift cloud in Jenkins master configuration + value: openshift +objects: +- kind: ServiceAccount + apiVersion: v1 + metadata: + name: "${NAME}-jenkins-slave" + labels: + app: "${NAME}" +- kind: RoleBinding + apiVersion: v1 + metadata: + name: "${NAME}-jenkins-slave_edit" + labels: + app: "${NAME}" + subjects: + - kind: ServiceAccount + name: "${NAME}-jenkins-slave" + roleRef: + name: edit +- kind: "BuildConfig" + apiVersion: "v1" + metadata: + name: "${NAME}" + labels: + app: "${NAME}" + spec: + runPolicy: "Serial" + completionDeadlineSeconds: 1800 + source: + git: + uri: "${WAIVERDB_GIT_REPO}" + ref: "${WAIVERDB_GIT_REF}" + strategy: + type: JenkinsPipeline + jenkinsPipelineStrategy: + env: + - name: "WAIVERDB_GIT_REPO" + value: "${WAIVERDB_GIT_REPO}" + - name: "WAIVERDB_GIT_REF" + value: "${WAIVERDB_GIT_REF}" + - name: "OPENSHIFT_CLOUD_NAME" + value: "${OPENSHIFT_CLOUD_NAME}" + - name: "JENKINS_AGENT_IMAGE" + value: "${JENKINS_AGENT_IMAGE}" + - name: "JENKINS_AGENT_SERVICE_ACCOUNT" + value: "${NAME}-jenkins-slave" + - name: "TRACKED_CONTAINER_REPO" + value: "${TRACKED_CONTAINER_REPO}" + jenkinsfilePath: openshift/pipelines/templates/waiverdb-repotracker-trigger.Jenkinsfile