Merge #1467 use C3I-as-a-Service to allocate a dynamic project for building and testing

This commit is contained in:
Matt Prahl
2019-10-18 15:20:23 +00:00
14 changed files with 385 additions and 243 deletions

View File

@@ -135,6 +135,24 @@ parameters:
causes all available testcases to run. The value "skip" causes no testcases to be run.
required: false
value: ""
- name: USE_C3IAAS
displayName: >-
Use C3I-as-a-Service to dynamically allocate a temporary OpenShift project for building
and testing.
required: true
value: "true"
- name: C3IAAS_REQUEST_PROJECT_BUILD_CONFIG_NAMESPACE
displayName: The namespace where the C3I-as-a-Service project request BuildConfig has been defined
required: false
value: c3i
- name: C3IAAS_REQUEST_PROJECT_BUILD_CONFIG_NAME
displayName: The name of the C3I-as-a-Service project request BuildConfig
required: false
value: c3iaas-request-project
- name: C3IAAS_LIFETIME
displayName: The lifetime of the OpenShift project allocated by C3I-as-a-Service.
required: true
value: "120"
- name: CLEANUP
displayName: Cleanup objects after the pipeline is complete
required: true
@@ -203,7 +221,7 @@ objects:
labels:
app: "${NAME}"
spec:
runPolicy: "Serial"
runPolicy: "Parallel"
completionDeadlineSeconds: 1800
source:
git:
@@ -267,6 +285,14 @@ objects:
value: "${EXTRA_RPMS}"
- name: TESTCASES
value: "${TESTCASES}"
- name: USE_C3IAAS
value: "${USE_C3IAAS}"
- name: C3IAAS_REQUEST_PROJECT_BUILD_CONFIG_NAMESPACE
value: "${C3IAAS_REQUEST_PROJECT_BUILD_CONFIG_NAMESPACE}"
- name: C3IAAS_REQUEST_PROJECT_BUILD_CONFIG_NAME
value: "${C3IAAS_REQUEST_PROJECT_BUILD_CONFIG_NAME}"
- name: C3IAAS_LIFETIME
value: "${C3IAAS_LIFETIME}"
- name: CLEANUP
value: "${CLEANUP}"
jenkinsfilePath: openshift/integration/koji/pipelines/templates/mbs-build.Jenkinsfile

View File

@@ -42,7 +42,6 @@ pipeline {
timestamps()
timeout(time: 120, unit: 'MINUTES')
buildDiscarder(logRotator(numToKeepStr: '10'))
disableConcurrentBuilds()
skipDefaultCheckout()
}
environment {
@@ -55,25 +54,7 @@ pipeline {
stage('Prepare') {
steps {
script {
// check out specified branch/commit
def srcRef = env.MBS_GIT_REF.startsWith('pull/') ? env.MBS_GIT_REF : "heads/${env.MBS_GIT_REF}"
retry(5) {
checkout([$class: 'GitSCM',
branches: [[name: params.MBS_GIT_REF]],
userRemoteConfigs: [
[
name: 'origin',
url: params.MBS_GIT_REPO,
refspec: "+refs/${srcRef}:refs/remotes/origin/${env.MBS_GIT_REF}",
],
],
extensions: [
[$class: 'CleanBeforeCheckout'],
[$class: 'CloneOption', noTags: true, shallow: true, depth: 2, honorRefspec: true],
],
])
}
c3i.clone(repo: params.MBS_GIT_REPO, branch: params.MBS_GIT_REF)
// get current commit ID
// FIXME: Due to a bug discribed in https://issues.jenkins-ci.org/browse/JENKINS-45489,
// the return value of checkout() is unreliable.
@@ -167,6 +148,42 @@ pipeline {
}
}
}
stage('Allocate C3IaaS project') {
when {
expression {
return params.USE_C3IAAS == 'true' &&
params.C3IAAS_REQUEST_PROJECT_BUILD_CONFIG_NAMESPACE &&
params.C3IAAS_REQUEST_PROJECT_BUILD_CONFIG_NAME
}
}
steps {
script {
if (env.PR_NO) {
env.C3IAAS_NAMESPACE = "c3i-mbs-pr-${env.PR_NO}-git${env.MBS_GIT_COMMIT.take(8)}"
} else {
env.C3IAAS_NAMESPACE = "c3i-mbs-${params.MBS_GIT_REF}-git${env.MBS_GIT_COMMIT.take(8)}"
}
echo "Requesting new OpenShift project ${env.C3IAAS_NAMESPACE}..."
openshift.withCluster() {
openshift.withProject(params.C3IAAS_REQUEST_PROJECT_BUILD_CONFIG_NAMESPACE) {
c3i.buildAndWait(script: this, objs: "bc/${params.C3IAAS_REQUEST_PROJECT_BUILD_CONFIG_NAME}",
'-e', "PROJECT_NAME=${env.C3IAAS_NAMESPACE}",
'-e', "ADMIN_GROUPS=system:serviceaccounts:${PIPELINE_NAMESPACE}",
'-e', "LIFETIME_IN_MINUTES=${params.C3IAAS_LIFETIME}"
)
}
}
}
}
post {
success {
echo "Allocated project ${env.C3IAAS_NAMESPACE}"
}
failure {
echo "Failed to allocate ${env.C3IAAS_NAMESPACE} project"
}
}
}
stage('Build backend image') {
environment {
BACKEND_BUILDCONFIG_ID = "mbs-backend-build-${currentBuild.id}-${UUID.randomUUID().toString().take(7)}"
@@ -174,33 +191,34 @@ pipeline {
steps {
script {
openshift.withCluster() {
// OpenShift BuildConfig doesn't support specifying a tag name at build time.
// We have to create a new BuildConfig for each image build.
echo 'Creating a BuildConfig for mbs-backend build...'
def created = new Date().format("yyyy-MM-dd'T'HH:mm:ss'Z'", TimeZone.getTimeZone('UTC'))
def template = readYaml file: 'openshift/backend/mbs-backend-build-template.yaml'
def processed = openshift.process(template,
'-p', "NAME=${env.BACKEND_BUILDCONFIG_ID}",
'-p', "MBS_GIT_REPO=${params.MBS_GIT_REPO}",
// A pull-request branch, like pull/123/head, cannot be built with commit ID
// because refspec cannot be customized in an OpenShift build.
'-p', "MBS_GIT_REF=${env.PR_NO ? params.MBS_GIT_REF : env.MBS_GIT_COMMIT}",
'-p', "MBS_BACKEND_IMAGESTREAM_NAME=${params.MBS_BACKEND_IMAGESTREAM_NAME}",
'-p', "MBS_BACKEND_IMAGESTREAM_NAMESPACE=${env.PIPELINE_NAMESPACE}",
'-p', "MBS_IMAGE_TAG=${env.TEMP_TAG}",
'-p', "EXTRA_RPMS=${params.EXTRA_RPMS}",
'-p', "CREATED=${created}"
)
def buildname = c3i.buildAndWait(processed, '--from-dir=.')
def build = openshift.selector(buildname)
def ocpBuild = build.object()
env.BACKEND_IMAGE_DIGEST = ocpBuild.status.output.to.imageDigest
def ref = ocpBuild.status.outputDockerImageReference
def repo = ref.tokenize(':')[0..-2].join(':')
env.BACKEND_IMAGE_REPO = repo
env.BACKEND_IMAGE_REF = repo + '@' + env.BACKEND_IMAGE_DIGEST
env.BACKEND_IMAGE_TAG = env.TEMP_TAG
echo "Built image ${env.BACKEND_IMAGE_REF}, digest: ${env.BACKEND_IMAGE_DIGEST}, tag: ${env.BACKEND_IMAGE_TAG}"
openshift.withProject(env.C3IAAS_NAMESPACE ?: env.PIPELINE_NAMESPACE) {
// OpenShift BuildConfig doesn't support specifying a tag name at build time.
// We have to create a new BuildConfig for each image build.
echo 'Creating a BuildConfig for mbs-backend build...'
def created = new Date().format("yyyy-MM-dd'T'HH:mm:ss'Z'", TimeZone.getTimeZone('UTC'))
def template = readYaml file: 'openshift/backend/mbs-backend-build-template.yaml'
def processed = openshift.process(template,
'-p', "NAME=${env.BACKEND_BUILDCONFIG_ID}",
'-p', "MBS_GIT_REPO=${params.MBS_GIT_REPO}",
// A pull-request branch, like pull/123/head, cannot be built with commit ID
// because refspec cannot be customized in an OpenShift build.
'-p', "MBS_GIT_REF=${env.PR_NO ? params.MBS_GIT_REF : env.MBS_GIT_COMMIT}",
'-p', "MBS_BACKEND_IMAGESTREAM_NAME=${params.MBS_BACKEND_IMAGESTREAM_NAME}",
'-p', "MBS_BACKEND_IMAGESTREAM_NAMESPACE=${env.C3IAAS_NAMESPACE ?: env.PIPELINE_NAMESPACE}",
'-p', "MBS_IMAGE_TAG=${env.TEMP_TAG}",
'-p', "EXTRA_RPMS=${params.EXTRA_RPMS}",
'-p', "CREATED=${created}"
)
def build = c3i.buildAndWait(script: this, objs: processed, '--from-dir=.')
def ocpBuild = build.object()
env.BACKEND_IMAGE_DIGEST = ocpBuild.status.output.to.imageDigest
def ref = ocpBuild.status.outputDockerImageReference
def repo = ref.tokenize(':')[0..-2].join(':')
env.BACKEND_IMAGE_REPO = repo
env.BACKEND_IMAGE_REF = repo + '@' + env.BACKEND_IMAGE_DIGEST
env.BACKEND_IMAGE_TAG = env.TEMP_TAG
echo "Built image ${env.BACKEND_IMAGE_REF}, digest: ${env.BACKEND_IMAGE_DIGEST}, tag: ${env.BACKEND_IMAGE_TAG}"
}
}
}
}
@@ -210,12 +228,14 @@ pipeline {
}
cleanup {
script {
openshift.withCluster() {
echo 'Tearing down...'
openshift.selector('bc', [
'app': env.BACKEND_BUILDCONFIG_ID,
'template': 'mbs-backend-build-template',
]).delete()
if (!env.C3IAAS_NAMESPACE) {
openshift.withCluster() {
echo 'Tearing down...'
openshift.selector('bc', [
'app': env.BACKEND_BUILDCONFIG_ID,
'template': 'mbs-backend-build-template',
]).delete()
}
}
}
}
@@ -228,34 +248,35 @@ pipeline {
steps {
script {
openshift.withCluster() {
// OpenShift BuildConfig doesn't support specifying a tag name at build time.
// We have to create a new BuildConfig for each image build.
echo 'Creating a BuildConfig for mbs-frontend build...'
def created = new Date().format("yyyy-MM-dd'T'HH:mm:ss'Z'", TimeZone.getTimeZone('UTC'))
def template = readYaml file: 'openshift/frontend/mbs-frontend-build-template.yaml'
def processed = openshift.process(template,
'-p', "NAME=${env.FRONTEND_BUILDCONFIG_ID}",
'-p', "MBS_GIT_REPO=${params.MBS_GIT_REPO}",
// A pull-request branch, like pull/123/head, cannot be built with commit ID
// because refspec cannot be customized in an OpenShift build.
'-p', "MBS_GIT_REF=${env.PR_NO ? params.MBS_GIT_REF : env.MBS_GIT_COMMIT}",
'-p', "MBS_FRONTEND_IMAGESTREAM_NAME=${params.MBS_FRONTEND_IMAGESTREAM_NAME}",
'-p', "MBS_FRONTEND_IMAGESTREAM_NAMESPACE=${env.PIPELINE_NAMESPACE}",
'-p', "MBS_IMAGE_TAG=${env.TEMP_TAG}",
'-p', "MBS_BACKEND_IMAGESTREAM_NAME=${params.MBS_BACKEND_IMAGESTREAM_NAME}",
'-p', "MBS_BACKEND_IMAGESTREAM_NAMESPACE=${env.PIPELINE_NAMESPACE}",
'-p', "CREATED=${created}"
)
def buildname = c3i.buildAndWait(processed, '--from-dir=.')
def build = openshift.selector(buildname)
def ocpBuild = build.object()
env.FRONTEND_IMAGE_DIGEST = ocpBuild.status.output.to.imageDigest
def ref = ocpBuild.status.outputDockerImageReference
def repo = ref.tokenize(':')[0..-2].join(':')
env.FRONTEND_IMAGE_REPO = repo
env.FRONTEND_IMAGE_REF = repo + '@' + env.FRONTEND_IMAGE_DIGEST
env.FRONTEND_IMAGE_TAG = env.TEMP_TAG
echo "Built image ${env.FRONTEND_IMAGE_REF}, digest: ${env.FRONTEND_IMAGE_DIGEST}, tag: ${env.FRONTEND_IMAGE_TAG}"
openshift.withProject(env.C3IAAS_NAMESPACE ?: env.PIPELINE_NAMESPACE) {
// OpenShift BuildConfig doesn't support specifying a tag name at build time.
// We have to create a new BuildConfig for each image build.
echo 'Creating a BuildConfig for mbs-frontend build...'
def created = new Date().format("yyyy-MM-dd'T'HH:mm:ss'Z'", TimeZone.getTimeZone('UTC'))
def template = readYaml file: 'openshift/frontend/mbs-frontend-build-template.yaml'
def processed = openshift.process(template,
'-p', "NAME=${env.FRONTEND_BUILDCONFIG_ID}",
'-p', "MBS_GIT_REPO=${params.MBS_GIT_REPO}",
// A pull-request branch, like pull/123/head, cannot be built with commit ID
// because refspec cannot be customized in an OpenShift build.
'-p', "MBS_GIT_REF=${env.PR_NO ? params.MBS_GIT_REF : env.MBS_GIT_COMMIT}",
'-p', "MBS_FRONTEND_IMAGESTREAM_NAME=${params.MBS_FRONTEND_IMAGESTREAM_NAME}",
'-p', "MBS_FRONTEND_IMAGESTREAM_NAMESPACE=${env.C3IAAS_NAMESPACE ?: env.PIPELINE_NAMESPACE}",
'-p', "MBS_IMAGE_TAG=${env.TEMP_TAG}",
'-p', "MBS_BACKEND_IMAGESTREAM_NAME=${params.MBS_BACKEND_IMAGESTREAM_NAME}",
'-p', "MBS_BACKEND_IMAGESTREAM_NAMESPACE=${env.C3IAAS_NAMESPACE ?: env.PIPELINE_NAMESPACE}",
'-p', "CREATED=${created}"
)
def build = c3i.buildAndWait(script: this, objs: processed, '--from-dir=.')
def ocpBuild = build.object()
env.FRONTEND_IMAGE_DIGEST = ocpBuild.status.output.to.imageDigest
def ref = ocpBuild.status.outputDockerImageReference
def repo = ref.tokenize(':')[0..-2].join(':')
env.FRONTEND_IMAGE_REPO = repo
env.FRONTEND_IMAGE_REF = repo + '@' + env.FRONTEND_IMAGE_DIGEST
env.FRONTEND_IMAGE_TAG = env.TEMP_TAG
echo "Built image ${env.FRONTEND_IMAGE_REF}, digest: ${env.FRONTEND_IMAGE_DIGEST}, tag: ${env.FRONTEND_IMAGE_TAG}"
}
}
}
}
@@ -265,12 +286,14 @@ pipeline {
}
cleanup {
script {
openshift.withCluster() {
echo 'Tearing down...'
openshift.selector('bc', [
'app': env.FRONTEND_BUILDCONFIG_ID,
'template': 'mbs-frontend-build-template',
]).delete()
if (!env.C3IAAS_NAMESPACE) {
openshift.withCluster() {
echo 'Tearing down...'
openshift.selector('bc', [
'app': env.FRONTEND_BUILDCONFIG_ID,
'template': 'mbs-frontend-build-template',
]).delete()
}
}
}
}
@@ -281,13 +304,15 @@ pipeline {
script {
openshift.withCluster() {
openshift.withProject(params.MBS_INTEGRATION_TEST_BUILD_CONFIG_NAMESPACE) {
def build = c3i.buildAndWait("bc/${params.MBS_INTEGRATION_TEST_BUILD_CONFIG_NAME}",
def build = c3i.buildAndWait(script: this, objs: "bc/${params.MBS_INTEGRATION_TEST_BUILD_CONFIG_NAME}",
'-e', "MBS_GIT_REPO=${params.MBS_GIT_REPO}",
'-e', "MBS_GIT_REF=${env.PR_NO ? params.MBS_GIT_REF : env.MBS_GIT_COMMIT}",
'-e', "MBS_BACKEND_IMAGE=${env.BACKEND_IMAGE_REF}",
'-e', "MBS_FRONTEND_IMAGE=${env.FRONTEND_IMAGE_REF}",
'-e', "TEST_IMAGES='${env.BACKEND_IMAGE_REF} ${env.FRONTEND_IMAGE_REF}'",
'-e', "TEST_IMAGES=${env.BACKEND_IMAGE_REF},${env.FRONTEND_IMAGE_REF}",
'-e', "IMAGE_IS_SCRATCH=${params.MBS_GIT_REF != params.MBS_MAIN_BRANCH}",
// If env.C3IAAS_NAMESPACE has not been defined, tests will be run in the current namespace
'-e', "TEST_NAMESPACE=${env.C3IAAS_NAMESPACE ?: ''}",
'-e', "TESTCASES='${params.TESTCASES}'",
'-e', "CLEANUP=${params.CLEANUP}"
)
@@ -377,7 +402,8 @@ pipeline {
when {
expression {
return "${params.MBS_DEV_IMAGE_TAG}" && params.TAG_INTO_IMAGESTREAM == "true" &&
(params.FORCE_PUBLISH_IMAGE == "true" || params.MBS_GIT_REF == params.MBS_MAIN_BRANCH)
(params.FORCE_PUBLISH_IMAGE == "true" || params.MBS_GIT_REF == params.MBS_MAIN_BRANCH) &&
!env.C3IAAS_NAMESPACE
}
}
steps {
@@ -408,7 +434,7 @@ pipeline {
post {
cleanup {
script {
if (params.CLEANUP == 'true') {
if (params.CLEANUP == 'true' && !env.C3IAAS_NAMESPACE) {
openshift.withCluster() {
if (env.BACKEND_IMAGE_TAG) {
echo "Removing tag ${env.BACKEND_IMAGE_TAG} from the ${params.MBS_BACKEND_IMAGESTREAM_NAME} ImageStream..."
@@ -494,7 +520,6 @@ pipeline {
}
}
}
@NonCPS
def getPrNo(branch) {
def prMatch = branch =~ /^(?:.+\/)?pull\/(\d+)\/head$/
return prMatch ? prMatch[0][1] : ''

View File

@@ -1,7 +1,6 @@
// Use scripted syntax because CIBuildTrigger currently doesn't support the declarative syntax
properties([
buildDiscarder(logRotator(numToKeepStr: '10')),
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',

View File

@@ -72,7 +72,7 @@ objects:
labels:
app: "${NAME}"
spec:
runPolicy: "Serial"
runPolicy: "Parallel"
completionDeadlineSeconds: 1800
source:
git:

View File

@@ -85,7 +85,7 @@ objects:
labels:
app: "${NAME}"
spec:
runPolicy: "Serial" # FIXME: Parallel is supported, but we have limited quota in UpShift.
runPolicy: "Parallel"
completionDeadlineSeconds: 1800
source:
git:

View File

@@ -39,7 +39,6 @@ pipeline {
timestamps()
timeout(time: 30, unit: 'MINUTES')
buildDiscarder(logRotator(numToKeepStr: '10'))
disableConcurrentBuilds()
skipDefaultCheckout()
}
environment {

View File

@@ -48,14 +48,15 @@ parameters:
displayName: Container image for Jenkins slave pods
required: true
value: quay.io/factory2/mbs-jenkins-slave:latest
- name: CONTAINER_REGISTRY_CREDENTIALS
displayName: Secret name of container registries used for pulling and pushing images
value: factory2-pipeline-registry-credentials
required: false
- name: JENKINS_AGENT_CLOUD_NAME
displayName: Name of OpenShift cloud in Jenkins master configuration
required: true
value: openshift
- name: TEST_NAMESPACE
displayName: >-
Namespace where the Jenkins agent for this test will run, and where
test resources will be created.
required: false
- name: ENVIRONMENT
displayName: environment name (dev/stage/prod)
required: true
@@ -98,7 +99,7 @@ objects:
labels:
app: "${NAME}"
spec:
runPolicy: "Serial" # FIXME: Parallel is supported, but we have limited quota in UpShift.
runPolicy: "Parallel"
completionDeadlineSeconds: 1800
source:
git:
@@ -126,12 +127,12 @@ objects:
value: "true"
- name: "TEST_ID"
value: ""
- name: CONTAINER_REGISTRY_CREDENTIALS
value: "${CONTAINER_REGISTRY_CREDENTIALS}"
- name: JENKINS_AGENT_IMAGE
value: "${JENKINS_AGENT_IMAGE}"
- name: JENKINS_AGENT_CLOUD_NAME
value: "${JENKINS_AGENT_CLOUD_NAME}"
- name: TEST_NAMESPACE
value: "${TEST_NAMESPACE}"
- name: ENVIRONMENT
value: "${ENVIRONMENT}"
- name: MESSAGING_PROVIDER

View File

@@ -1,5 +1,6 @@
library identifier: 'c3i@master', changelog: false,
retriever: modernSCM([$class: "GitSCMSource", remote: "https://pagure.io/c3i-library.git"])
retriever: modernSCM([$class: 'GitSCMSource', remote: 'https://pagure.io/c3i-library.git'])
def deployments
pipeline {
agent {
kubernetes {
@@ -21,12 +22,6 @@ pipeline {
image: "${params.JENKINS_AGENT_IMAGE}"
imagePullPolicy: Always
tty: true
env:
- name: REGISTRY_CREDENTIALS
valueFrom:
secretKeyRef:
name: "${params.CONTAINER_REGISTRY_CREDENTIALS}"
key: ".dockerconfigjson"
resources:
requests:
memory: 512Mi
@@ -41,12 +36,11 @@ pipeline {
timestamps()
timeout(time: 60, unit: 'MINUTES')
buildDiscarder(logRotator(numToKeepStr: '10'))
disableConcurrentBuilds()
skipDefaultCheckout()
}
environment {
// Jenkins BUILD_TAG could be too long (> 63 characters) for OpenShift to consume
TEST_ID = "${params.TEST_ID ?: 'jenkins-' + currentBuild.id + '-' + UUID.randomUUID().toString().substring(0,7)}"
TEST_ID = "${params.TEST_ID ?: UUID.randomUUID().toString().substring(0,7)}"
}
stages {
stage('Prepare') {
@@ -54,44 +48,36 @@ pipeline {
script {
// Don't set ENVIRONMENT_LABEL in the environment block! Otherwise you will get 2 different UUIDs.
env.ENVIRONMENT_LABEL = "test-${env.TEST_ID}"
def srcRef = params.MBS_GIT_REF.startsWith('pull/') ? params.MBS_GIT_REF : 'heads/master'
def localRef = params.MBS_GIT_REF.startsWith('pull/') ? params.MBS_GIT_REF : 'master'
def cloneDepth = params.MBS_GIT_REF.startsWith('pull/') ? 2 : 10
retry(5) {
// check out specified branch/commit
checkout([$class: 'GitSCM',
branches: [[name: params.MBS_GIT_REF]],
userRemoteConfigs: [
[
name: 'origin',
url: params.MBS_GIT_REPO,
refspec: "+refs/${srcRef}:refs/remotes/origin/${localRef}",
],
],
extensions: [
[$class: 'CleanBeforeCheckout'],
[$class: 'CloneOption', noTags: true, shallow: true, depth: cloneDepth, honorRefspec: true],
],
])
}
// MBS_GIT_REF can be either a regular branch (in the heads/ namespace), a pull request
// branch (in the pull/ namespace), or a full 40-character sha1, which is assumed to
// exist on the master branch.
def branch = params.MBS_GIT_REF ==~ '[0-9a-f]{40}' ? 'master' : params.MBS_GIT_REF
c3i.clone(repo: params.MBS_GIT_REPO, branch: branch, rev: params.MBS_GIT_REF)
// get current commit ID
// FIXME: Due to a bug discribed in https://issues.jenkins-ci.org/browse/JENKINS-45489,
// the return value of checkout() is unreliable.
// Not working: env.MBS_GIT_COMMIT = scmVars.GIT_COMMIT
env.MBS_GIT_COMMIT = sh(returnStdout: true, script: 'git rev-parse HEAD').trim()
echo "Running integration tests for ${params.MBS_GIT_REF}, commit=${env.MBS_GIT_COMMIT}"
currentBuild.displayName = "${params.MBS_GIT_REF}: ${env.MBS_GIT_COMMIT.take(7)}"
echo "Running integration tests for ${branch}, commit=${env.MBS_GIT_COMMIT}"
currentBuild.displayName = "${branch}: ${env.MBS_GIT_COMMIT.take(7)}"
}
}
}
stage('Call cleanup routine') {
stage('Cleanup') {
when {
expression {
// Only run cleanup if we're running tests in the default namespace.
return !params.TEST_NAMESPACE
}
}
steps {
script {
// Cleanup all test environments that were created 1 hour ago in case of failures of previous cleanups.
c3i.cleanup('umb', 'koji', 'mbs')
openshift.withCluster() {
openshift.withProject() {
// Cleanup all test environments that were created 1 hour ago in case of failures of previous cleanups.
c3i.cleanup(script: this, 'umb', 'koji', 'mbs')
}
}
}
}
post {
@@ -100,59 +86,149 @@ pipeline {
}
}
}
stage('Call UMB deployer') {
stage('Route suffix') {
steps {
script {
def keystore = ca.get_keystore("umb-${TEST_ID}-broker", 'mbskeys')
def truststore = ca.get_truststore('mbstrust')
umb.deploy(env.TEST_ID, keystore, 'mbskeys', truststore, 'mbstrust',
params.UMB_IMAGE)
openshift.withCluster() {
openshift.withProject(params.TEST_NAMESPACE) {
def testroute = openshift.create('route', 'edge', 'test', '--service=test', '--port=8080')
def testhost = testroute.object().spec.host
// trim off the test- prefix
env.ROUTE_SUFFIX = testhost.drop(5)
testroute.delete()
}
}
}
}
post {
success {
echo "Routes end with ${env.ROUTE_SUFFIX}"
}
}
}
stage('Generate CA') {
steps {
script {
ca.gen_ca()
}
}
}
stage('Deploy UMB') {
steps {
script {
openshift.withCluster() {
openshift.withProject(params.TEST_NAMESPACE) {
// The extact hostname doesn't matter, (as long as it resolves to the cluster) because traffic will
// be routed to the pod via the NodePort.
// However, the hostname we use to access the service must be a subjectAltName of the certificate
// being served by the service.
env.UMB_HOST = "umb-${TEST_ID}-${env.ROUTE_SUFFIX}"
ca.gen_ssl_cert("umb-${TEST_ID}-broker", env.UMB_HOST)
def keystore = ca.get_keystore("umb-${TEST_ID}-broker", 'mbskeys')
def truststore = ca.get_truststore('mbstrust')
deployments = umb.deploy(script: this, test_id: env.TEST_ID,
keystore_data: keystore, keystore_password: 'mbskeys',
truststore_data: truststore, truststore_password: 'mbstrust',
broker_image: params.UMB_IMAGE)
def ports = openshift.selector('service', "umb-${TEST_ID}-broker").object().spec.ports
env.UMB_AMQPS_PORT = ports.find { it.name == 'amqps' }.nodePort
env.UMB_STOMP_SSL_PORT = ports.find { it.name == 'stomp-ssl' }.nodePort
}
}
}
}
post {
success {
echo "UMB deployed: amqps: ${env.UMB_HOST}:${env.UMB_AMQPS_PORT} stomp-ssl: ${env.UMB_HOST}:${env.UMB_STOMP_SSL_PORT}"
}
failure {
echo "UMB deployment FAILED"
}
}
}
stage('Call Koji deployer') {
stage('Deploy Koji') {
steps {
script {
koji.deploy(env.TEST_ID, ca.get_ca_cert(),
ca.get_ssl_cert("koji-${TEST_ID}-hub"),
"amqps://umb-${TEST_ID}-broker",
ca.get_ssl_cert("koji-${TEST_ID}-msg"),
"mbs-${TEST_ID}-koji-admin",
params.KOJI_IMAGE)
openshift.withCluster() {
openshift.withProject(params.TEST_NAMESPACE) {
env.KOJI_SSL_HOST = "koji-${TEST_ID}-hub-${env.ROUTE_SUFFIX}"
def hubcert = ca.get_ssl_cert("koji-${TEST_ID}-hub", env.KOJI_SSL_HOST)
env.KOJI_ADMIN = "mbs-${TEST_ID}-koji-admin"
env.KOJI_MSG_CERT = "koji-${TEST_ID}-msg"
def deployed = koji.deploy(script: this, test_id: env.TEST_ID,
hubca: ca.get_ca_cert(), hubcert: hubcert,
brokerurl: "amqps://${env.UMB_HOST}:${env.UMB_AMQPS_PORT}",
brokercert: ca.get_ssl_cert(env.KOJI_MSG_CERT),
admin_user: env.KOJI_ADMIN,
hub_image: params.KOJI_IMAGE)
deployments = deployments.union(deployed)
}
}
}
}
post {
success {
echo "Koji deployed: hub: https://${env.KOJI_SSL_HOST}/"
}
failure {
echo "Koji deployment FAILED"
}
}
}
stage('Call MBS deployer') {
stage('Deploy MBS') {
steps {
script {
env.MBS_SSL_HOST = "mbs-${TEST_ID}-frontend-${env.ROUTE_SUFFIX}"
def frontendcert = ca.get_ssl_cert("mbs-${TEST_ID}-frontend", env.MBS_SSL_HOST)
// Required for accessing src.fedoraproject.org
def digicertca = readFile file: 'openshift/integration/koji/resources/certs/DigiCertHighAssuranceEVRootCA.pem'
def cabundle = ca.get_ca_cert().cert + digicertca
def msgcert = ca.get_ssl_cert("mbs-${TEST_ID}-msg")
def frontendcert = ca.get_ssl_cert("mbs-${TEST_ID}-frontend")
def kojicert = ca.get_ssl_cert("mbs-${TEST_ID}-koji-admin")
mbs.deploy(env.TEST_ID, kojicert, ca.get_ca_cert(), msgcert, frontendcert, ca.get_ca_cert(), cabundle,
"https://koji-${TEST_ID}-hub",
"umb-${TEST_ID}-broker:61612",
params.MBS_BACKEND_IMAGE, params.MBS_FRONTEND_IMAGE)
def kojicert = ca.get_ssl_cert(env.KOJI_ADMIN)
openshift.withCluster() {
openshift.withProject(params.TEST_NAMESPACE) {
def deployed = mbs.deploy(script: this, test_id: env.TEST_ID,
kojicert: kojicert, kojica: ca.get_ca_cert(),
brokercert: msgcert,
frontendcert: frontendcert, frontendca: ca.get_ca_cert(),
cacerts: cabundle,
kojiurl: "https://${env.KOJI_SSL_HOST}",
stompuri: "${env.UMB_HOST}:${env.UMB_STOMP_SSL_PORT}",
backend_image: params.MBS_BACKEND_IMAGE,
frontend_image: params.MBS_FRONTEND_IMAGE)
deployments = deployments.union(deployed)
}
}
}
}
post {
success {
echo "MBS deployed: frontend: https://${env.MBS_SSL_HOST}/"
}
failure {
echo "MBS deployment FAILED"
}
}
}
stage('Wait for deployments') {
steps {
script {
openshift.withCluster() {
openshift.withProject(params.TEST_NAMESPACE) {
c3i.waitForDeployment(script: this, objs: deployments)
}
}
}
}
post {
success {
echo "Deployments complete"
}
failure {
echo 'Deployments FAILED'
}
}
}
stage('Run tests') {
steps {
script {
@@ -177,10 +253,12 @@ pipeline {
def test = load "openshift/integration/koji/pipelines/tests/${testcase}.groovy"
test.runTests()
}
echo "Tests complete"
}
}
post {
success {
echo "All tests successful"
}
failure {
echo "Testcase ${env.CURRENT_TESTCASE} FAILED"
}
@@ -190,32 +268,37 @@ pipeline {
post {
success {
script {
params.TEST_IMAGES.split().each {
params.TEST_IMAGES.split(',').each {
sendToResultsDB(it, 'passed')
}
}
}
failure {
script {
params.TEST_IMAGES.split().each {
params.TEST_IMAGES.split(',').each {
sendToResultsDB(it, 'failed')
}
openshift.withCluster() {
echo 'Getting logs from all deployments...'
def sel = openshift.selector('dc', ['environment': env.ENVIRONMENT_LABEL])
sel.logs('--tail=100')
openshift.withProject(params.TEST_NAMESPACE) {
if (deployments) {
echo 'Getting logs from all deployments...'
deployments.logs('--tail=100')
}
}
}
}
}
cleanup {
script {
if (params.CLEANUP == 'true') {
if (params.CLEANUP == 'true' && !params.TEST_NAMESPACE) {
openshift.withCluster() {
/* Tear down everything we just created */
echo 'Tearing down test resources...'
openshift.selector('all,pvc,configmap,secret',
['environment': env.ENVIRONMENT_LABEL]).delete('--ignore-not-found=true')
}
} else {
echo 'Skipping cleanup'
}
}
}

View File

@@ -83,7 +83,7 @@ objects:
labels:
app: "${NAME}"
spec:
runPolicy: "Serial"
runPolicy: "Parallel"
completionDeadlineSeconds: 1800
strategy:
type: JenkinsPipeline
@@ -127,7 +127,6 @@ objects:
timestamps()
timeout(time: 60, unit: 'MINUTES')
buildDiscarder(logRotator(numToKeepStr: '10'))
disableConcurrentBuilds()
skipDefaultCheckout()
}
environment {
@@ -148,26 +147,10 @@ objects:
agent { label 'master' }
steps {
script {
// checking out the polled branch
def polledBranch = env.PAGURE_POLLING_FOR_PR == 'true' ? 'origin/pull/*/head' : "origin/${PAGURE_POLLED_BRANCH}"
def srcRef = env.PAGURE_POLLING_FOR_PR == 'true' ? 'pull/*/head' : "heads/${PAGURE_POLLED_BRANCH}"
def scmVars
retry(5) {
scmVars = checkout([$class: 'GitSCM',
branches: [[name: polledBranch]],
userRemoteConfigs: [
[
name: 'origin',
url: env.GIT_URL,
refspec: "+refs/${srcRef}:refs/remotes/${polledBranch}",
],
],
extensions: [
[$class: 'CleanBeforeCheckout'],
[$class: 'CloneOption', noTags: true, shallow: true, depth: 2, honorRefspec: true],
],
])
}
def polled = env.PAGURE_POLLING_FOR_PR == 'true' ? 'pull/*/head' : "${PAGURE_POLLED_BRANCH}"
// Need to prefix the rev with origin/ for pollSCM to work correctly
def rev = "origin/${polled}"
def scmVars = c3i.clone(repo: env.GIT_URL, branch: polled, rev: rev)
env.MBS_GIT_COMMIT = scmVars.GIT_COMMIT
// setting build display name
def prefix = 'origin/'
@@ -207,23 +190,8 @@ objects:
}
}
steps {
retry(5) {
checkout([$class: 'GitSCM',
branches: [[name: env.MBS_GIT_BRANCH]],
userRemoteConfigs: [
[
name: 'origin',
url: env.GIT_URL,
refspec: "+refs/heads/${env.MBS_GIT_BRANCH}:refs/remotes/origin/${env.MBS_GIT_BRANCH}",
],
],
extensions: [
[$class: 'CleanBeforeCheckout'],
[$class: 'CloneOption', noTags: true, shallow: true, depth: 2, honorRefspec: true],
],
])
}
script {
c3i.clone(repo: env.GIT_URL, branch: env.MBS_GIT_BRANCH)
dir('openshift/integration/koji/pipelines') {
sh '''
make install JOBS_DIR="${PIPELINE_UPDATE_JOBS_DIR}"
@@ -241,15 +209,12 @@ objects:
steps {
script {
openshift.withCluster() {
def bcSelector = openshift.selector('bc',
env.PAGURE_POLLING_FOR_PR == 'true' ? env.PREMERGE_JOB_NAME : env.POSTMERGE_JOB_NAME)
echo 'Starting a MBS build run...'
def devBuild = bcSelector.startBuild(
'-e', "MBS_GIT_REF=${env.MBS_GIT_BRANCH}",
def devBuild = c3i.build(script: this,
objs: "bc/${env.PAGURE_POLLING_FOR_PR == 'true' ? env.PREMERGE_JOB_NAME : env.POSTMERGE_JOB_NAME}",
'-e', "MBS_GIT_REF=${env.MBS_GIT_BRANCH}"
)
devBuild.watch {
return !(it.object().status.phase in ["New", "Pending"])
}
c3i.waitForBuildStart(script: this, build: devBuild)
def devBuildInfo = devBuild.object()
def downstreamBuildName = devBuildInfo.metadata.name
def downstreamBuildUrl = devBuildInfo.metadata.annotations['openshift.io/jenkins-build-uri']

View File

@@ -1,7 +1,6 @@
// Use scripted syntax because CIBuildTrigger currently doesn't support the declarative syntax
properties([
buildDiscarder(logRotator(numToKeepStr: '10')),
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',
@@ -18,13 +17,13 @@ if (!params.CI_MESSAGE) {
echo 'This build is not started by a CI message. Only configurations were done.'
return
}
library identifier: 'c3i@master', changelog: false,
retriever: modernSCM([$class: 'GitSCMSource', remote: 'https://pagure.io/c3i-library.git'])
def label = "jenkins-slave-${UUID.randomUUID().toString()}"
podTemplate(
cloud: "${params.JENKINS_AGENT_CLOUD_NAME}",
label: label,
serviceAccount: "${env.JENKINS_AGENT_SERVICE_ACCOUNT}",
defaultContainer: 'jnlp',
yaml: """
apiVersion: v1
kind: Pod
@@ -55,6 +54,27 @@ podTemplate(
"""
) {
node(label) {
stage('Allocate C3IaaS project') {
if (!(params.USE_C3IAAS == 'true' &&
params.C3IAAS_REQUEST_PROJECT_BUILD_CONFIG_NAMESPACE &&
params.C3IAAS_REQUEST_PROJECT_BUILD_CONFIG_NAME)) {
echo "Not configured to use C3IaaS"
return
}
env.PIPELINE_NAMESPACE = readFile("/run/secrets/kubernetes.io/serviceaccount/namespace").trim()
env.C3IAAS_NAMESPACE = "c3i-mbs-tr-${params.TRACKED_TAG}-${env.BUILD_NUMBER}"
echo "Requesting new OpenShift project ${env.C3IAAS_NAMESPACE}..."
openshift.withCluster() {
openshift.withProject(params.C3IAAS_REQUEST_PROJECT_BUILD_CONFIG_NAMESPACE) {
c3i.buildAndWait(script: this, objs: "bc/${params.C3IAAS_REQUEST_PROJECT_BUILD_CONFIG_NAME}",
'-e', "PROJECT_NAME=${env.C3IAAS_NAMESPACE}",
'-e', "ADMIN_GROUPS=system:serviceaccounts:${env.PIPELINE_NAMESPACE}",
'-e', "LIFETIME_IN_MINUTES=${params.C3IAAS_LIFETIME}"
)
}
}
echo "Allocated project ${env.C3IAAS_NAMESPACE}"
}
stage('Trigger tests') {
def message = readJSON text: params.CI_MESSAGE
echo "Tag :${message.tag} is ${message.action} in ${message.repo}. New digest: ${message.digest}"
@@ -73,17 +93,15 @@ podTemplate(
echo "Triggering a job to test if ${frontendImage} and ${backendImage} meet all criteria of desired tag"
openshift.withCluster() {
openshift.withProject(params.TEST_JOB_NAMESPACE) {
def testBcSelector = openshift.selector('bc', params.TEST_JOB_NAME)
def buildSelector = testBcSelector.startBuild(
def build = c3i.build(script: this, objs: "bc/${params.TEST_JOB_NAME}",
'-e', "MBS_BACKEND_IMAGE=${backendImage}",
'-e', "MBS_FRONTEND_IMAGE=${frontendImage}",
'-e', "TEST_IMAGES='${backendImage} ${frontendImage}'",
'-e', "IMAGE_IS_SCRATCH=false"
'-e', "TEST_IMAGES=${backendImage},${frontendImage}",
'-e', "IMAGE_IS_SCRATCH=false",
'-e', "TEST_NAMESPACE=${env.C3IAAS_NAMESPACE ?: ''}",
)
buildSelector.watch {
return !(it.object().status.phase in ["New", "Pending"])
}
buildInfo = buildSelector.object()
c3i.waitForBuildStart(script: this, build: build)
buildInfo = build.object()
echo "Build ${buildInfo.metadata.annotations['openshift.io/jenkins-build-uri'] ?: buildInfo.metadata.name} started."
}
}

View File

@@ -51,6 +51,24 @@ parameters:
- name: TEST_JOB_NAMESPACE
displayName: Namespace in which to trigger the integration test job
required: false
- name: USE_C3IAAS
displayName: >-
Use C3I-as-a-Service to dynamically allocate a temporary OpenShift project for building
and testing.
required: true
value: "true"
- name: C3IAAS_REQUEST_PROJECT_BUILD_CONFIG_NAMESPACE
displayName: The namespace where the C3I-as-a-Service project request BuildConfig has been defined
required: false
value: c3i
- name: C3IAAS_REQUEST_PROJECT_BUILD_CONFIG_NAME
displayName: The name of the C3I-as-a-Service project request BuildConfig
required: false
value: c3iaas-request-project
- name: C3IAAS_LIFETIME
displayName: The lifetime of the OpenShift project allocated by C3I-as-a-Service.
required: true
value: "120"
objects:
- kind: ServiceAccount
apiVersion: v1
@@ -76,7 +94,7 @@ objects:
labels:
app: "${NAME}"
spec:
runPolicy: "Serial"
runPolicy: "Parallel"
completionDeadlineSeconds: 1800
source:
git:
@@ -104,6 +122,14 @@ objects:
value: "${TEST_JOB_NAME}"
- name: TEST_JOB_NAMESPACE
value: "${TEST_JOB_NAMESPACE}"
- name: USE_C3IAAS
value: "${USE_C3IAAS}"
- name: C3IAAS_REQUEST_PROJECT_BUILD_CONFIG_NAMESPACE
value: "${C3IAAS_REQUEST_PROJECT_BUILD_CONFIG_NAMESPACE}"
- name: C3IAAS_REQUEST_PROJECT_BUILD_CONFIG_NAME
value: "${C3IAAS_REQUEST_PROJECT_BUILD_CONFIG_NAME}"
- name: C3IAAS_LIFETIME
value: "${C3IAAS_LIFETIME}"
- name: MESSAGING_PROVIDER
value: "${MESSAGING_PROVIDER}"
- name: MESSAGING_TOPIC

View File

@@ -2,8 +2,8 @@
import groovy.json.JsonOutput
def runTests() {
def clientcert = ca.get_ssl_cert("mbs-${TEST_ID}-koji-admin")
koji.setConfig("https://koji-${TEST_ID}-hub/kojihub", "https://koji-${TEST_ID}-hub/kojifiles",
def clientcert = ca.get_ssl_cert(env.KOJI_ADMIN)
koji.setConfig("https://${env.KOJI_SSL_HOST}/kojihub", "https://${env.KOJI_SSL_HOST}/kojifiles",
clientcert.cert, clientcert.key, ca.get_ca_cert().cert)
def tags = koji.callMethod("listTags")
if (!tags.any { it.name == "module-f28" }) {
@@ -15,9 +15,9 @@ def runTests() {
try {
// There's currently no way to query whether a given user has CG access, so just add it
// and hope no one else has already done it.
koji.runCmd("grant-cg-access", "mbs-${TEST_ID}-koji-admin", "module-build-service", "--new")
koji.runCmd("grant-cg-access", env.KOJI_ADMIN, "module-build-service", "--new")
} catch (ex) {
echo "Granting cg-access to mbs-${TEST_ID}-koji-admin failed, assuming it was already provided in a previous test"
echo "Granting cg-access to ${env.KOJI_ADMIN} failed, assuming it was already provided in a previous test"
}
if (!koji.callMethod("listBTypes").any { it.name == "module" }) {
@@ -44,10 +44,10 @@ def runTests() {
documentation: https://fedoraproject.org/wiki/Fedora_Packaging_Guidelines_for_Modules
"""
def buildparams = groovy.json.JsonOutput.toJson([modulemd: testmodule, owner: "mbs-${TEST_ID}-koji-admin"])
def buildparams = groovy.json.JsonOutput.toJson([modulemd: testmodule, owner: env.KOJI_ADMIN])
def resp = httpRequest(
httpMode: "POST",
url: "https://mbs-${TEST_ID}-frontend/module-build-service/1/module-builds/",
url: "https://${env.MBS_SSL_HOST}/module-build-service/1/module-builds/",
acceptType: "APPLICATION_JSON",
contentType: "APPLICATION_JSON",
requestBody: buildparams,
@@ -61,7 +61,7 @@ def runTests() {
timeout(10) {
waitUntil {
resp = httpRequest(
url: "https://mbs-${TEST_ID}-frontend/module-build-service/1/module-builds/${buildinfo.id}",
url: "https://${env.MBS_SSL_HOST}/module-build-service/1/module-builds/${buildinfo.id}",
ignoreSslErrors: true,
)
if (resp.status != 200) {

View File

@@ -1,8 +1,8 @@
// Build an empty module and verify that the CGImport works correctly
def runTests() {
def clientcert = ca.get_ssl_cert("mbs-${TEST_ID}-koji-admin")
koji.setConfig("https://koji-${TEST_ID}-hub/kojihub", "https://koji-${TEST_ID}-hub/kojifiles",
def clientcert = ca.get_ssl_cert(env.KOJI_ADMIN)
koji.setConfig("https://${env.KOJI_SSL_HOST}/kojihub", "https://${env.KOJI_SSL_HOST}/kojifiles",
clientcert.cert, clientcert.key, ca.get_ca_cert().cert)
def tags = koji.callMethod("listTags")
if (!tags.any { it.name == "module-f28" }) {
@@ -14,9 +14,9 @@ def runTests() {
try {
// There's currently no way to query whether a given user has CG access, so just add it
// and hope no one else has already done it.
koji.runCmd("grant-cg-access", "mbs-${TEST_ID}-koji-admin", "module-build-service", "--new")
koji.runCmd("grant-cg-access", env.KOJI_ADMIN, "module-build-service", "--new")
} catch (ex) {
echo "Granting cg-access to mbs-${TEST_ID}-koji-admin failed, assuming it was already provided in a previous test"
echo "Granting cg-access to ${env.KOJI_ADMIN} failed, assuming it was already provided in a previous test"
}
if (!koji.callMethod("listBTypes").any { it.name == "module" }) {
@@ -26,11 +26,11 @@ def runTests() {
def buildparams = """
{"scmurl": "https://src.fedoraproject.org/forks/mikeb/modules/testmodule.git?#8b3fb16160f899ce10905faf570f110d52b91154",
"branch": "empty-f28",
"owner": "mbs-${TEST_ID}-koji-admin"}
"owner": "${env.KOJI_ADMIN}"}
"""
def resp = httpRequest(
httpMode: "POST",
url: "https://mbs-${TEST_ID}-frontend/module-build-service/1/module-builds/",
url: "https://${env.MBS_SSL_HOST}/module-build-service/1/module-builds/",
acceptType: "APPLICATION_JSON",
contentType: "APPLICATION_JSON",
requestBody: buildparams,
@@ -44,7 +44,7 @@ def runTests() {
timeout(10) {
waitUntil {
resp = httpRequest(
url: "https://mbs-${TEST_ID}-frontend/module-build-service/1/module-builds/${buildinfo.id}",
url: "https://${env.MBS_SSL_HOST}/module-build-service/1/module-builds/${buildinfo.id}",
ignoreSslErrors: true,
)
if (resp.status != 200) {

View File

@@ -1,8 +1,8 @@
// Submit a build to MBS and verify that it initializes Koji correctly
def runTests() {
def clientcert = ca.get_ssl_cert("mbs-${TEST_ID}-koji-admin")
koji.setConfig("https://koji-${TEST_ID}-hub/kojihub", "https://koji-${TEST_ID}-hub/kojifiles",
def clientcert = ca.get_ssl_cert(env.KOJI_ADMIN)
koji.setConfig("https://${env.KOJI_SSL_HOST}/kojihub", "https://${env.KOJI_SSL_HOST}/kojifiles",
clientcert.cert, clientcert.key, ca.get_ca_cert().cert)
def tags = koji.callMethod("listTags")
if (!tags.any { it.name == "module-f28" }) {
@@ -14,11 +14,11 @@ def runTests() {
def buildparams = """
{"scmurl": "https://src.fedoraproject.org/modules/testmodule.git?#9c589780e1dd1698dc64dfa28d30014ad18cad32",
"branch": "f28",
"owner": "mbs-${TEST_ID}-koji-admin"}
"owner": "${env.KOJI_ADMIN}"}
"""
def resp = httpRequest(
httpMode: "POST",
url: "https://mbs-${TEST_ID}-frontend/module-build-service/1/module-builds/",
url: "https://${env.MBS_SSL_HOST}/module-build-service/1/module-builds/",
acceptType: "APPLICATION_JSON",
contentType: "APPLICATION_JSON",
requestBody: buildparams,
@@ -33,7 +33,7 @@ def runTests() {
timeout(10) {
waitUntil {
resp = httpRequest(
url: "https://mbs-${TEST_ID}-frontend/module-build-service/1/module-builds/${buildinfo.id}",
url: "https://${env.MBS_SSL_HOST}/module-build-service/1/module-builds/${buildinfo.id}",
ignoreSslErrors: true,
)
if (resp.status != 200) {