Skip to content

Commit

Permalink
kie-issues#821: Kogito-apps and Kogito-runtimes weekly jobs (#1166)
Browse files Browse the repository at this point in the history
* Kogito weekly jobs

* Fix job checkout datetime
  • Loading branch information
rodrigonull authored Jan 29, 2024
1 parent 1ece2d5 commit c79064d
Show file tree
Hide file tree
Showing 2 changed files with 214 additions and 0 deletions.
193 changes: 193 additions & 0 deletions .ci/jenkins/Jenkinsfile.weekly
Original file line number Diff line number Diff line change
@@ -0,0 +1,193 @@
import org.jenkinsci.plugins.workflow.libs.Library

@Library('jenkins-pipeline-shared-libraries')_

// Deploy jobs
RUNTIMES_DEPLOY = 'kogito-runtimes.weekly-deploy'
APPS_DEPLOY = 'kogito-apps.weekly-deploy'

// Map of executed jobs
// See https://javadoc.jenkins.io/plugin/workflow-support/org/jenkinsci/plugins/workflow/support/steps/build/RunWrapper.html
// for more options on built job entity
JOBS = [:]

FAILED_STAGES = [:]
UNSTABLE_STAGES = [:]

// Should be multibranch pipeline
pipeline {
agent {
label 'ubuntu'
}

options {
timeout(time: 900, unit: 'MINUTES')
}

// parameters {
// For parameters, check into ./dsl/jobs.groovy file
// }

environment {
// Some generated env is also defined into ./dsl/jobs.groovy file
KOGITO_CI_EMAIL_TO = credentials("${JENKINS_EMAIL_CREDS_ID}")

CURRENT_DATE = getCurrentDate()

WEEKLY_TAG = """${getBuildBranch()}-${CURRENT_DATE}"""
}

stages {
stage('Initialize') {
steps {
script {
echo "weekly tag is ${env.WEEKLY_TAG}"

currentBuild.displayName = env.WEEKLY_TAG
}
}
}

stage('Build & Deploy Kogito Runtimes') {
steps {
script {
def buildParams = getDefaultBuildParams()
addSkipTestsParam(buildParams)
addSkipIntegrationTestsParam(buildParams)
buildJob(RUNTIMES_DEPLOY, buildParams)
}
}
post {
failure {
addFailedStage(RUNTIMES_DEPLOY)
}
}
}

stage('Build & Deploy Kogito Apps') {
steps {
script {
def buildParams = getDefaultBuildParams()
addSkipTestsParam(buildParams)
addSkipIntegrationTestsParam(buildParams)
buildJob(APPS_DEPLOY, buildParams)
}
}
post {
failure {
addFailedStage(APPS_DEPLOY)
}
}
}
}
post {
unsuccessful {
sendPipelineErrorNotification()
}
}
}

def buildJob(String jobName, List buildParams, String jobKey = jobName) {
echo "[${jobKey}] Build ${jobName} with params ${buildParams}"

def job = build(job: "${jobName}", wait: true, parameters: buildParams, propagate: false)
JOBS[jobKey] = job

// Set Unstable if job did not succeed
if (!isJobSucceeded(jobKey)) {
addUnstableStage(jobKey)
unstable("Job ${jobName} finished with result ${job.result}")
}
return job
}

def getJob(String jobKey) {
return JOBS[jobKey]
}

String getJobUrl(String jobKey) {
echo "getJobUrl for ${jobKey}"
return getJob(jobKey)?.absoluteUrl ?: ''
}

boolean isJobSucceeded(String jobKey) {
return getJob(jobKey)?.result == 'SUCCESS'
}

boolean isJobUnstable(String jobKey) {
return getJob(jobKey)?.result == 'UNSTABLE'
}

void addFailedStage(String jobKey = '') {
FAILED_STAGES.put("${env.STAGE_NAME}", jobKey)
}
void addUnstableStage(String jobKey = '') {
UNSTABLE_STAGES.put("${env.STAGE_NAME}", jobKey)
}

void sendPipelineErrorNotification() {
String bodyMsg = "Kogito weekly job #${env.BUILD_NUMBER} was: ${currentBuild.currentResult}"

if (FAILED_STAGES.size() > 0) {
bodyMsg += '\nFailed stages: \n- '
bodyMsg += FAILED_STAGES.collect { "${it.key} => ${getJobUrl(it.value)}" }.join('\n- ')
}
bodyMsg += '\n'
if (UNSTABLE_STAGES.size() > 0) {
bodyMsg += '\nUnstable stages: \n- '
bodyMsg += UNSTABLE_STAGES.collect { "${it.key} => ${getJobUrl(it.value)}" }.join('\n- ')
}
bodyMsg += '\n'
bodyMsg += "\nPlease look here: ${env.BUILD_URL}"
emailext body: bodyMsg, subject: "[${getBuildBranch()}][d] Full Pipeline",
to: env.KOGITO_CI_EMAIL_TO
}

List getDefaultBuildParams() {
List params = []
addStringParam(params, 'DISPLAY_NAME', env.WEEKLY_TAG)
addStringParam(params, 'GIT_CHECKOUT_DATETIME', getCheckoutDatetime())
addBooleanParam(params, 'SEND_NOTIFICATION', true)

return params
}

void addSkipTestsParam(buildParams) {
addBooleanParam(buildParams, 'SKIP_TESTS', params.SKIP_TESTS)
}

void addSkipIntegrationTestsParam(buildParams) {
addBooleanParam(buildParams, 'SKIP_INTEGRATION_TESTS', params.SKIP_TESTS)
}

void addStringParam(List params, String key, String value) {
params.add(string(name: key, value: value))
}

void addBooleanParam(List params, String key, boolean value) {
params.add(booleanParam(name: key, value: value))
}

String getBuildBranch() {
return env.GIT_BRANCH_NAME
}

String getGitAuthor() {
return env.GIT_AUTHOR
}

String getGitAuthorCredsId() {
return env.GIT_AUTHOR_CREDS_ID
}

String getGitAuthorPushCredsId() {
return env.GIT_AUTHOR_PUSH_CREDS_ID
}

String getCurrentDate() {
return sh(returnStdout: true, script: 'date -u "+%Y-%m-%d"').trim()
}

String getCheckoutDatetime() {
return env.CURRENT_DATE + ' 02:00' // Cut-off 02:00AM
}
21 changes: 21 additions & 0 deletions .ci/jenkins/dsl/jobs.groovy
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,9 @@ if (isMainStream()) {
setupNightlyCloudJob()
}

// Weekly
setupWeeklyJob()

// Release
setupReleaseArtifactsJob()
setupReleaseCloudJob()
Expand Down Expand Up @@ -171,6 +174,24 @@ void setupNightlyJob() {
}
}

void setupWeeklyJob() {
def jobParams = JobParamsUtils.getBasicJobParams(this, '0-kogito-weekly', JobType.OTHER, "${jenkins_path}/Jenkinsfile.weekly", 'Kogito Weekly')
jobParams.triggers = [cron : '0 5 * * 0']
jobParams.env.putAll([
JENKINS_EMAIL_CREDS_ID: "${JENKINS_EMAIL_CREDS_ID}",

GIT_BRANCH_NAME: "${GIT_BRANCH}",
GIT_AUTHOR: "${GIT_AUTHOR_NAME}",
GIT_AUTHOR_CREDS_ID: "${GIT_AUTHOR_CREDENTIALS_ID}",
GIT_AUTHOR_PUSH_CREDS_ID: "${GIT_AUTHOR_PUSH_CREDENTIALS_ID}",
])
KogitoJobTemplate.createPipelineJob(this, jobParams)?.with {
parameters {
booleanParam('SKIP_TESTS', false, 'Skip all tests')
}
}
}

void setupNightlyCloudJob() {
def jobParams = JobParamsUtils.getBasicJobParams(this, '0-kogito-nightly-cloud', JobType.NIGHTLY, "${jenkins_path}/Jenkinsfile.nightly.cloud", 'Kogito Nightly')
jobParams.env.putAll([
Expand Down

0 comments on commit c79064d

Please sign in to comment.