| |
@@ -26,6 +26,9 @@
|
| |
displayName: set to 'true' to poll for PRs, or 'false' for the master branch
|
| |
required: true
|
| |
value: "false"
|
| |
+ - name: PAGURE_URL
|
| |
+ displayName: Pagure URL
|
| |
+ value: "https://pagure.io"
|
| |
- name: PAGURE_POLLING_SCHEDULE
|
| |
displayName: Schedule of polling
|
| |
description: using cron-style syntax
|
| |
@@ -35,25 +38,18 @@
|
| |
displayName: Name of polled branch
|
| |
required: true
|
| |
value: "master"
|
| |
- - name: DEV_PIPELINE_BC_NAME
|
| |
- displayName: Name of BuildConfig for starting dev pipeline builds
|
| |
+ - name: PREMERGE_JOB_NAME
|
| |
+ displayName: Downstream pre-merge job name
|
| |
required: true
|
| |
- value: waiverdb-dev
|
| |
- - name: DEV_PIPELINE_BC_NAMESPACE
|
| |
- displayName: Namespace of BuildConfig for starting dev pipeline builds
|
| |
- required: false
|
| |
- - name: PAGURE_API_KEY_SECRET_NAME
|
| |
- displayName: Name of Secret for updating Pagure pull-requests status
|
| |
- value: 'pagure-api-key'
|
| |
- required: false
|
| |
+ value: waiverdb-premerge
|
| |
+ - name: POSTMERGE_JOB_NAME
|
| |
+ displayName: Downstream post-merge job name
|
| |
+ required: true
|
| |
+ value: waiverdb-postmerge
|
| |
- name: PIPELINE_UPDATE_JOBS_DIR
|
| |
displayName: location of pipeline job definitions for auto update
|
| |
value: jobs
|
| |
required: false
|
| |
- - name: MAIL_ENABLED
|
| |
- displayName: Whether to send an email
|
| |
- value: 'true'
|
| |
- required: true
|
| |
- name: JENKINS_AGENT_IMAGE
|
| |
displayName: Container image for Jenkins slave pods
|
| |
required: true
|
| |
@@ -129,12 +125,13 @@
|
| |
}
|
| |
environment {
|
| |
PIPELINE_NAMESPACE = readFile('/run/secrets/kubernetes.io/serviceaccount/namespace').trim()
|
| |
- PAGURE_URL = 'https://pagure.io'
|
| |
- PAGURE_API = "${env.PAGURE_URL}/api/0"
|
| |
+ PAGURE_URL = "${PAGURE_URL}"
|
| |
PAGURE_REPO_IS_FORK = "${PAGURE_REPO_IS_FORK}"
|
| |
PAGURE_POLLING_FOR_PR = "${PAGURE_POLLING_FOR_PR}"
|
| |
PAGURE_REPO_HOME = "${env.PAGURE_URL}${env.PAGURE_REPO_IS_FORK == 'true' ? '/fork' : ''}/${PAGURE_REPO_NAME}"
|
| |
GIT_URL = "${env.PAGURE_URL}/${env.PAGURE_REPO_IS_FORK == 'true' ? 'forks/' : ''}${PAGURE_REPO_NAME}.git"
|
| |
+ PREMERGE_JOB_NAME = "${PREMERGE_JOB_NAME}"
|
| |
+ POSTMERGE_JOB_NAME = "${POSTMERGE_JOB_NAME}"
|
| |
}
|
| |
triggers { pollSCM("${PAGURE_POLLING_SCHEDULE}") }
|
| |
stages {
|
| |
@@ -155,35 +152,24 @@
|
| |
],
|
| |
extensions: [[$class: 'CleanBeforeCheckout']],
|
| |
])
|
| |
- env.GIT_COMMIT = scmVars.GIT_COMMIT
|
| |
- env.GIT_AUTHOR_EMAIL = scmVars.GIT_AUTHOR_EMAIL
|
| |
+ env.WAIVERDB_GIT_COMMIT = scmVars.GIT_COMMIT
|
| |
// setting build display name
|
| |
def prefix = 'origin/'
|
| |
def branch = scmVars.GIT_BRANCH.startsWith(prefix) ? scmVars.GIT_BRANCH.substring(prefix.size())
|
| |
: scmVars.GIT_BRANCH // origin/pull/1234/head -> pull/1234/head, origin/master -> master
|
| |
- env.GIT_BRANCH = branch
|
| |
- echo "Build on branch=${env.GIT_BRANCH}, commit=${env.GIT_COMMIT}"
|
| |
- if (env.PAGURE_POLLING_FOR_PR == 'false' && branch == "${PAGURE_POLLED_BRANCH}") {
|
| |
- echo 'Building master'
|
| |
- currentBuild.displayName = "${PAGURE_POLLED_BRANCH}"
|
| |
+ env.WAIVERDB_GIT_BRANCH = branch
|
| |
+ echo "Build on branch=${env.WAIVERDB_GIT_BRANCH}, commit=${env.WAIVERDB_GIT_COMMIT}"
|
| |
+ if (env.PAGURE_POLLING_FOR_PR == 'false') {
|
| |
+ currentBuild.displayName = "${env.WAIVERDB_GIT_BRANCH}: ${env.WAIVERDB_GIT_COMMIT.substring(0, 7)}"
|
| |
+ currentBuild.description = """<a href="${env.PAGURE_REPO_HOME}/c/${env.WAIVERDB_GIT_COMMIT}">${currentBuild.displayName}</a>"""
|
| |
}
|
| |
else if (env.PAGURE_POLLING_FOR_PR == 'true' && branch ==~ /^pull\/[0-9]+\/head$/) {
|
| |
env.PR_NO = branch.split('/')[1]
|
| |
env.PR_URL = "${env.PAGURE_REPO_HOME}/pull-request/${env.PR_NO}"
|
| |
// To HTML syntax in build description, go to `Jenkins/Global Security/Markup Formatter` and select 'Safe HTML'.
|
| |
- def pagureLink = """<a href="${env.PR_URL}">PR-${env.PR_NO}</a>"""
|
| |
- try {
|
| |
- def prInfo = getPagurePRInfo()
|
| |
- pagureLink = """<a href="${env.PR_URL}">${prInfo.title}</a>"""
|
| |
- } catch (Exception e) {
|
| |
- echo "Error using pagure API: ${e}"
|
| |
- // ignoring this...
|
| |
- }
|
| |
+ def pagureLink = """<a href="${env.PR_URL}">PR#${env.PR_NO}</a>"""
|
| |
echo "Building PR #${env.PR_NO}: ${env.PR_URL}"
|
| |
- // FIXME: We are going to pass the display name to the triggered dev pipeline build,
|
| |
- // however OpenShift Pipeline DSL is buggy to handle arguments with special bash characters (like whitespaces, #, etc).
|
| |
- // https://bugzilla.redhat.com/show_bug.cgi?id=1625518
|
| |
- currentBuild.displayName = "PR-${env.PR_NO}"
|
| |
+ currentBuild.displayName = "PR#${env.PR_NO}"
|
| |
currentBuild.description = pagureLink
|
| |
} else { // This shouldn't happen.
|
| |
error("Build is aborted due to unexpected polling trigger actions.")
|
| |
@@ -194,12 +180,12 @@
|
| |
stage('Update pipeline jobs') {
|
| |
when {
|
| |
expression {
|
| |
- return "${PIPELINE_UPDATE_JOBS_DIR}" && env.PAGURE_POLLING_FOR_PR == 'false' && env.GIT_BRANCH == "${PAGURE_POLLED_BRANCH}"
|
| |
+ return "${PIPELINE_UPDATE_JOBS_DIR}" && env.PAGURE_POLLING_FOR_PR == 'false' && env.WAIVERDB_GIT_BRANCH == "${PAGURE_POLLED_BRANCH}"
|
| |
}
|
| |
}
|
| |
steps {
|
| |
checkout([$class: 'GitSCM',
|
| |
- branches: [[name: env.GIT_BRANCH]],
|
| |
+ branches: [[name: env.WAIVERDB_GIT_COMMIT]],
|
| |
userRemoteConfigs: [
|
| |
[
|
| |
name: 'origin',
|
| |
@@ -218,183 +204,26 @@
|
| |
}
|
| |
}
|
| |
}
|
| |
- stage('Run Dev Build') {
|
| |
+ stage('Build') {
|
| |
steps {
|
| |
script {
|
| |
openshift.withCluster() {
|
| |
- openshift.withProject("${DEV_PIPELINE_BC_NAMESPACE}") {
|
| |
- def bcSelector = openshift.selector('bc', "${DEV_PIPELINE_BC_NAME}")
|
| |
- echo 'Starting a dev pipeline build...'
|
| |
- def devBuild = bcSelector.startBuild(
|
| |
- '-e', "WAIVERDB_GIT_REPO=${env.GIT_URL}",
|
| |
- '-e', "WAIVERDB_GIT_REF=${env.GIT_BRANCH}",
|
| |
- '-e', "WAIVERDB_MAIN_BRANCH=${PAGURE_POLLED_BRANCH}",
|
| |
- '-e', "BUILD_DISPLAY_RENAME_TO=${currentBuild.displayName}",
|
| |
- )
|
| |
- devBuild.watch {
|
| |
- return !(it.object().status.phase in ["New", "Pending"])
|
| |
- }
|
| |
- def devBuildInfo = devBuild.object()
|
| |
- env.DEV_BUILD_NAME = devBuildInfo.metadata.name
|
| |
- env.DEV_BUILD_URL = devBuildInfo.metadata.annotations['openshift.io/jenkins-build-uri'] ?: env.BUILD_URL
|
| |
- if (env.PAGURE_POLLING_FOR_PR == 'true') {
|
| |
- // setting PR status to Pending
|
| |
- setBuildStatusOnPagurePR(null, 'Pending')
|
| |
- }
|
| |
- echo "Waiting for dev build ${devBuildInfo.metadata.name}(${env.DEV_BUILD_URL}) to complete..."
|
| |
- devBuild.watch {
|
| |
- return it.object().status.phase != "Running"
|
| |
- }
|
| |
- devBuildInfo = devBuild.object()
|
| |
- echo "Dev build ${devBuildInfo.metadata.name}(${env.DEV_BUILD_URL}) finished with status ${devBuildInfo.status.phase}."
|
| |
- if (devBuildInfo.status.phase != "Complete") {
|
| |
- error("Dev build ${devBuildInfo.metadata.name}(${env.DEV_BUILD_URL}) failed.")
|
| |
- }
|
| |
- }
|
| |
- }
|
| |
- }
|
| |
- }
|
| |
- }
|
| |
- }
|
| |
- post {
|
| |
- success {
|
| |
- script {
|
| |
- // updating Pagure PR flag and make a comment
|
| |
- if (env.PAGURE_POLLING_FOR_PR == 'true' && "${PAGURE_API_KEY_SECRET_NAME}") {
|
| |
- try {
|
| |
- setBuildStatusOnPagurePR(100, 'Build passed.')
|
| |
- echo "Updated PR #${env.PR_NO} status to PASS."
|
| |
- } catch (e) {
|
| |
- echo "Error updating PR #${env.PR_NO} status to PASS: ${e}"
|
| |
- }
|
| |
- }
|
| |
- // sending email
|
| |
- if ("${MAIL_ENABLED}" == 'true' && env.PAGURE_POLLING_FOR_PR == 'true'){
|
| |
- try {
|
| |
- sendBuildStatusEmail(true)
|
| |
- } catch (e) {
|
| |
- echo "Error sending email: ${e}"
|
| |
- }
|
| |
- }
|
| |
- }
|
| |
- }
|
| |
- failure {
|
| |
- script {
|
| |
- // updating Pagure PR flag
|
| |
- if (env.PAGURE_POLLING_FOR_PR == 'true' && "${PAGURE_API_KEY_SECRET_NAME}") {
|
| |
- try {
|
| |
- setBuildStatusOnPagurePR(0, 'Build failed.')
|
| |
- echo "Updated PR #${env.PR_NO} status to FAILURE."
|
| |
- } catch (e) {
|
| |
- echo "Error updating PR #${env.PR_NO} status to FAILURE: ${e}"
|
| |
- }
|
| |
- if (env.DEV_BUILD_NAME) {
|
| |
- try {
|
| |
- commentOnPR("""
|
| |
- Build ${env.GIT_COMMIT} [FAILED](${env.DEV_BUILD_URL})!
|
| |
- Rebase or make new commits to rebuild.
|
| |
- """.stripIndent())
|
| |
- echo "Comment made."
|
| |
- } catch (e) {
|
| |
- echo "Error making a comment on PR #${env.PR_NO}: ${e}"
|
| |
+ def bcSelector = openshift.selector('bc',
|
| |
+ env.PAGURE_POLLING_FOR_PR == 'true' ? env.PREMERGE_JOB_NAME : env.POSTMERGE_JOB_NAME)
|
| |
+ echo 'Starting a WaiverDB build run...'
|
| |
+ def devBuild = bcSelector.startBuild(
|
| |
+ '-e', "WAIVERDB_GIT_REF=${env.WAIVERDB_GIT_BRANCH}",
|
| |
+ )
|
| |
+ devBuild.watch {
|
| |
+ return !(it.object().status.phase in ["New", "Pending"])
|
| |
}
|
| |
- }
|
| |
- }
|
| |
- // sending email
|
| |
- if ("${MAIL_ENABLED}" == 'true'){
|
| |
- try {
|
| |
- sendBuildStatusEmail(false)
|
| |
- } catch (e) {
|
| |
- echo "Error sending email: ${e}"
|
| |
+ def devBuildInfo = devBuild.object()
|
| |
+ def downstreamBuildName = devBuildInfo.metadata.name
|
| |
+ def downstreamBuildUrl = devBuildInfo.metadata.annotations['openshift.io/jenkins-build-uri']
|
| |
+ echo "Downstream build ${downstreamBuildName}(${downstreamBuildUrl}) started."
|
| |
}
|
| |
}
|
| |
}
|
| |
}
|
| |
}
|
| |
}
|
| |
- import java.net.URLEncoder
|
| |
- class PagureClient {
|
| |
- String pagureApiUrl
|
| |
- String token
|
| |
- def steps
|
| |
- def callApi(String httpMode, String apiPath, Map payload = null) {
|
| |
- def headers = []
|
| |
- if (token) {
|
| |
- headers << [name: 'Authorization', value: "token ${token}", maskValue: true]
|
| |
- }
|
| |
- def payloadItems = []
|
| |
- if (payload) {
|
| |
- for (it in payload) {
|
| |
- if (it == null || it.value == null) {
|
| |
- continue
|
| |
- }
|
| |
- payloadItems << (URLEncoder.encode(it.key.toString(), 'utf-8') +
|
| |
- '=' + URLEncoder.encode(it.value.toString(), 'utf-8'))
|
| |
- }
|
| |
- }
|
| |
- return steps.httpRequest(
|
| |
- httpMode: httpMode,
|
| |
- url: "${pagureApiUrl}/${apiPath}",
|
| |
- acceptType: 'APPLICATION_JSON',
|
| |
- contentType: 'APPLICATION_FORM',
|
| |
- requestBody: payloadItems.join('&'),
|
| |
- customHeaders: headers,
|
| |
- )
|
| |
- }
|
| |
- def getPR(Map args) {
|
| |
- def apiPath = "${args.fork?'fork/':''}${args.repo}/pull-request/${args.pr}"
|
| |
- def response = callApi('GET', apiPath)
|
| |
- return steps.readJSON(text: response.content)
|
| |
- }
|
| |
- def updatePRStatus(Map args) {
|
| |
- def apiPath = "${args.fork?'fork/':''}${args.repo}/pull-request/${args.pr}/flag"
|
| |
- def response = callApi('POST', apiPath, [
|
| |
- 'username': args.username,
|
| |
- 'uid': args.uid,
|
| |
- 'percent': args.percent,
|
| |
- 'comment': args.comment,
|
| |
- 'url': args.url,
|
| |
- ])
|
| |
- return steps.readJSON(text: response.content)
|
| |
- }
|
| |
- def commentOnPR(Map args) {
|
| |
- def apiPath = "${args.fork?'fork/':''}${args.repo}/pull-request/${args.pr}/comment"
|
| |
- def response = callApi('POST', apiPath, [
|
| |
- 'comment': args.comment,
|
| |
- ])
|
| |
- return steps.readJSON(text: response.content)
|
| |
- }
|
| |
- }
|
| |
- def getPagurePRInfo() {
|
| |
- def pagureClient = new PagureClient (pagureApiUrl: env.PAGURE_API, steps: steps)
|
| |
- return pagureClient.getPR(fork: env.PAGURE_REPO_IS_FORK == 'true', repo: "${PAGURE_REPO_NAME}", pr: env.PR_NO)
|
| |
- }
|
| |
- def setBuildStatusOnPagurePR(percent, String comment) {
|
| |
- withCredentials([string(credentialsId: "${env.PIPELINE_NAMESPACE}-${PAGURE_API_KEY_SECRET_NAME}", variable: 'TOKEN')]) {
|
| |
- def pagureClient = new PagureClient (pagureApiUrl: env.PAGURE_API, token: env.TOKEN, steps: steps)
|
| |
- pagureClient.updatePRStatus(
|
| |
- username: 'c3i-jenkins', uid: 'ci-pre-merge', url: env.DEV_BUILD_URL?:env.BUILD_URL,
|
| |
- percent: percent, comment: comment, pr: env.PR_NO,
|
| |
- repo: "${PAGURE_REPO_NAME}", fork: env.PAGURE_REPO_IS_FORK == 'true')
|
| |
- }
|
| |
- }
|
| |
- def commentOnPR(String comment) {
|
| |
- withCredentials([string(credentialsId: "${env.PIPELINE_NAMESPACE}-${PAGURE_API_KEY_SECRET_NAME}", variable: 'TOKEN')]) {
|
| |
- def pagureClient = new PagureClient (pagureApiUrl: env.PAGURE_API, token: env.TOKEN, steps: steps)
|
| |
- pagureClient.commentOnPR(
|
| |
- comment: comment, pr: env.PR_NO,
|
| |
- repo: "${PAGURE_REPO_NAME}", fork: env.PAGURE_REPO_IS_FORK == 'true')
|
| |
- }
|
| |
- }
|
| |
- def sendBuildStatusEmail(boolean success) {
|
| |
- def status = success ? 'passed' : 'failed'
|
| |
- def reciepent = env.PAGURE_POLLING_FOR_PR != 'true' && ownership.job.ownershipEnabled && ownership.job.primaryOwnerEmail ?
|
| |
- ownership.job.primaryOwnerEmail : env.GIT_AUTHOR_EMAIL
|
| |
- def subject = "Jenkins job ${env.JOB_NAME} #${env.BUILD_NUMBER} ${status}."
|
| |
- def body = "Build URL: ${env.DEV_BUILD_URL}"
|
| |
- if (env.PAGURE_POLLING_FOR_PR == 'true') {
|
| |
- subject = "Jenkins job ${env.JOB_NAME}, PR #${env.PR_NO} ${status}."
|
| |
- body += "\nPull Request: ${env.PR_URL}"
|
| |
- }
|
| |
- emailext to: reciepent, subject: subject, body: body
|
| |
- }
|
| |
Following up https://pagure.io/waiverdb/issue/263.
waiverdb-dev
job intowaiverdb-premerge
andwaiverdb-postmerge
for better readability. The new 2 jobs are generated from the same template
waiverdb-build
.waiverdb-premerge
andwaiverdb-postmerge
jobs.