This is an automated email from the ASF dual-hosted git repository.
tiagobento pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/incubator-kie-optaplanner.git
The following commit(s) were added to refs/heads/main by this push:
new eb4f1c0306 kie-issues#1248: Optaplanner weekly Jenkins job (#3090)
eb4f1c0306 is described below
commit eb4f1c0306b80c57101b66f30dd4f28a755c5e1e
Author: Rodrigo Antunes <[email protected]>
AuthorDate: Wed May 22 20:46:04 2024 -0300
kie-issues#1248: Optaplanner weekly Jenkins job (#3090)
Optaplanner weekly Jenkins job
---
.ci/jenkins/Jenkinsfile.weekly.deploy | 323 +++++++++++++++++++++++++++
.ci/jenkins/dsl/jobs.groovy | 54 +++++
.ci/jenkins/project/Jenkinsfile.setup-branch | 18 ++
.ci/jenkins/project/Jenkinsfile.weekly | 188 ++++++++++++++++
4 files changed, 583 insertions(+)
diff --git a/.ci/jenkins/Jenkinsfile.weekly.deploy
b/.ci/jenkins/Jenkinsfile.weekly.deploy
new file mode 100644
index 0000000000..de68f0f178
--- /dev/null
+++ b/.ci/jenkins/Jenkinsfile.weekly.deploy
@@ -0,0 +1,323 @@
+/* groovylint-disable UnnecessaryGetter */
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import org.jenkinsci.plugins.workflow.libs.Library
+
+@Library('jenkins-pipeline-shared-libraries') _
+
+import org.kie.jenkins.MavenCommand
+
+deployProperties = [:]
+
+optaplannerRepository = 'incubator-kie-optaplanner'
+optaplannerFolder = 'optaplanner'
+quickstartsRepository = 'incubator-kie-optaplanner-quickstarts'
+quickstartsFolder = 'quickstarts'
+
+imageUtils = null
+
+pipeline {
+ agent {
+ docker {
+ image env.AGENT_DOCKER_BUILDER_IMAGE
+ args env.AGENT_DOCKER_BUILDER_ARGS
+ label util.avoidFaultyNodes()
+ }
+ }
+
+ options {
+ timestamps()
+ timeout(time: 120, unit: 'MINUTES')
+ disableConcurrentBuilds(abortPrevious: true)
+ }
+
+ environment {
+ OPTAPLANNER_CI_EMAIL_TO = credentials("${JENKINS_EMAIL_CREDS_ID}")
+ }
+
+ stages {
+ stage('Initialize') {
+ steps {
+ script {
+ cleanWs(disableDeferredWipeout: true)
+
+ if (params.DISPLAY_NAME) {
+ currentBuild.displayName = params.DISPLAY_NAME
+ }
+
+ checkout scm // To make sure the repository containing the
script is available on the Jenkins node.
+ imageUtils = load '.ci/jenkins/scripts/imageUtils.groovy'
+
+ env.PROJECT_VERSION =
maven.mvnGetVersionProperty(getMavenCommand(), 'project.version')
+ }
+ }
+ post {
+ success {
+ script {
+ setDeployPropertyIfNeeded('git.branch',
getBuildBranch())
+ setDeployPropertyIfNeeded('git.branchQuickstarts',
getQuickStartsBranch())
+ setDeployPropertyIfNeeded('git.author', getGitAuthor())
+ setDeployPropertyIfNeeded('project.version',
getProjectVersion())
+ }
+ }
+ }
+ }
+
+ stage('Clone repositories') {
+ steps {
+ script {
+ checkoutRepo(optaplannerRepository, optaplannerFolder)
+ checkoutRepo(quickstartsRepository, quickstartsFolder)
+ }
+ }
+ }
+
+ stage('Update project version') {
+ steps {
+ script {
+ if (getDroolsVersion()) {
+
maven.mvnSetVersionProperty(getOptaplannerMavenCommand(), 'version.org.drools',
getDroolsVersion())
+ }
+ maven.mvnVersionsSet(getOptaplannerMavenCommand(),
getProjectVersion(), true)
+ mavenCleanInstallOptaPlannerParents()
+ updateQuickstartsVersions()
+ }
+ }
+ }
+
+ stage('Build OptaPlanner') {
+ steps {
+ script {
+ withCredentials([usernamePassword(credentialsId:
env.MAVEN_REPO_CREDS_ID, usernameVariable: 'REPOSITORY_USER', passwordVariable:
'REPOSITORY_TOKEN')]) {
+ def installOrDeploy
+ if (shouldDeployToRepository()) {
+ installOrDeploy = "deploy -DdeployAtEnd
-Dapache.repository.username=${REPOSITORY_USER}
-Dapache.repository.password=${REPOSITORY_TOKEN} -DretryFailedDeploymentCount=5"
+ } else {
+ installOrDeploy = 'install'
+ }
+ configFileProvider([configFile(fileId:
env.MAVEN_SETTINGS_CONFIG_FILE_ID, variable: 'MAVEN_SETTINGS_FILE')]) {
+ getOptaplannerMavenCommand()
+ .withProperty('maven.test.failure.ignore',
true)
+ .withProperty('operator.image.build')
+ .skipTests(params.SKIP_TESTS)
+ .withSettingsXmlFile(MAVEN_SETTINGS_FILE)
+ .run("clean $installOrDeploy")
+ }
+ }
+ }
+ }
+ post {
+ always {
+ script {
+ archiveJUnitTestResults()
+ util.archiveConsoleLog()
+ }
+ }
+ }
+ }
+
+ stage('Build Quickstarts') {
+ steps {
+ script {
+ configFileProvider([configFile(fileId:
env.MAVEN_SETTINGS_CONFIG_FILE_ID, variable: 'MAVEN_SETTINGS_FILE')]) {
+ getOptaplannerQuickstartsMavenCommand()
+ .withProperty('maven.test.failure.ignore',
true)
+ .skipTests(params.SKIP_TESTS)
+ .withSettingsXmlFile(MAVEN_SETTINGS_FILE)
+ .run('clean install')
+ }
+ }
+ }
+ post {
+ always {
+ script {
+ archiveJUnitTestResults()
+ util.archiveConsoleLog()
+ }
+ }
+ }
+ }
+
+ stage('Create and push a new tag') {
+ steps {
+ script {
+ projectVersion = getProjectVersion(false)
+ dir(optaplannerFolder) {
+
githubscm.setUserConfigFromCreds(getGitAuthorPushCredsId())
+ githubscm.tagRepository(projectVersion)
+ githubscm.pushRemoteTag('origin', projectVersion,
getGitAuthorPushCredsId())
+ }
+ }
+ }
+ }
+ }
+ post {
+ always {
+ script {
+ def propertiesStr = deployProperties.collect { entry ->
"${entry.key}=${entry.value}" }.join('\n')
+ writeFile(text: propertiesStr, file: env.PROPERTIES_FILE_NAME)
+ archiveArtifacts(artifacts: env.PROPERTIES_FILE_NAME)
+ }
+ }
+ unsuccessful {
+ sendErrorNotification()
+ }
+ cleanup {
+ script {
+ util.cleanNode()
+ }
+ }
+ }
+}
+
+void sendErrorNotification() {
+ if (params.SEND_NOTIFICATION) {
+ String additionalInfo = "**[${getBuildBranch()}] Optaplanner -
Deploy**"
+ mailer.sendMarkdownTestSummaryNotification('CI failures',
[env.OPTAPLANNER_CI_EMAIL_TO], additionalInfo)
+ } else {
+ echo 'No notification sent per configuration'
+ }
+}
+
+void updateQuickstartsVersions() {
+ maven.mvnSetVersionProperty(getOptaplannerQuickstartsMavenCommand(),
'version.org.optaplanner', getProjectVersion())
+
maven.mvnVersionsUpdateParentAndChildModules(getOptaplannerQuickstartsMavenCommand(),
getProjectVersion(), true)
+ gradleVersionsUpdate(quickstartsFolder, getProjectVersion())
+}
+
+void gradleVersionsUpdate(String folder, String newVersion) {
+ dir(folder) {
+ sh "find . -name build.gradle -exec sed -i -E 's/def
optaplannerVersion = \"[^\"\\s]+\"/def optaplannerVersion = \"${newVersion}\"/'
{} \\;"
+ }
+}
+
+void archiveJUnitTestResults() {
+ if (!skipUnitTests()) {
+ junit testResults: '**/target/surefire-reports/**/*.xml,
**/target/failsafe-reports/**/*.xml', allowEmptyResults: true
+ }
+}
+
+void checkoutRepo(String repo, String dirName) {
+ dir(dirName) {
+ deleteDir()
+ checkout(githubscm.resolveRepository(repo, getGitAuthor(),
getBuildBranch(), false, getGitAuthorCredsId()))
+ // need to manually checkout branch since on a detached branch after
checkout command
+ sh "git checkout ${getBuildBranch()}"
+ checkoutDatetime = getCheckoutDatetime()
+ if (checkoutDatetime) {
+ sh "git checkout `git rev-list -n 1
--before=\"${checkoutDatetime}\" ${getBuildBranch()}`"
+ }
+ }
+}
+
+MavenCommand getMavenDefaultCommand() {
+ MavenCommand mvnCmd = new MavenCommand(this, ['-fae', '-ntp'])
+ if (env.MAVEN_DEPENDENCIES_REPOSITORY) {
+ mvnCmd.withDependencyRepositoryInSettings('deps-repo',
env.MAVEN_DEPENDENCIES_REPOSITORY)
+ }
+ return mvnCmd
+}
+
+MavenCommand getOptaplannerMavenCommand() {
+ return
getMavenDefaultCommand().inDirectory(optaplannerFolder).withProperty('full')
+}
+
+MavenCommand getOptaplannerQuickstartsMavenCommand() {
+ return
getMavenDefaultCommand().inDirectory(quickstartsFolder).withProperty('full')
+}
+
+/**
+ * Builds the parent modules and the BOM so that project depending on these
artifacts can resolve.
+ */
+void mavenCleanInstallOptaPlannerParents() {
+ configFileProvider([configFile(fileId: env.MAVEN_SETTINGS_CONFIG_FILE_ID,
variable: 'MAVEN_SETTINGS_FILE')]) {
+ getOptaplannerMavenCommand()
+ .skipTests(true)
+ .withOptions(['-U', '-pl
org.optaplanner:optaplanner-build-parent,org.optaplanner:optaplanner-bom',
'-am'])
+ .withSettingsXmlFile(MAVEN_SETTINGS_FILE)
+ .run('clean install')
+ }
+}
+
+// Getters and Setters of params/properties
+
+boolean shouldDeployToRepository() {
+ return (env.MAVEN_DEPLOY_REPOSITORY || isNotTestingBuild()) &&
!isDeployDisabled()
+}
+
+boolean isNotTestingBuild() {
+ return getGitAuthor() == 'apache'
+}
+
+boolean skipUnitTests() {
+ return params.SKIP_TESTS
+}
+
+String getGitAuthor() {
+ // GIT_AUTHOR can be env or param
+ return "${GIT_AUTHOR}"
+}
+
+String getGitAuthorCredsId() {
+ return env.GIT_AUTHOR_CREDS_ID
+}
+
+String getGitAuthorPushCredsId() {
+ return env.GIT_AUTHOR_PUSH_CREDS_ID
+}
+
+String getBuildBranch() {
+ return params.BUILD_BRANCH_NAME
+}
+
+String getDroolsVersion() {
+ return getProjectVersion()
+}
+
+void setDeployPropertyIfNeeded(String key, def value) {
+ if (value != null && value != '') {
+ deployProperties[key] = value
+ }
+}
+
+String getQuickStartsBranch() {
+ return params.QUICKSTARTS_BUILD_BRANCH_NAME
+}
+
+boolean isDeployDisabled() {
+ return env.DISABLE_DEPLOY.toBoolean()
+}
+
+String getCheckoutDatetime() {
+ return params.GIT_CHECKOUT_DATETIME
+}
+
+String getProjectVersionDate() {
+ def projectVersionDate = (getCheckoutDatetime() =~
/(\d{4}-\d{2}-\d{2})/)[0][0]
+ return projectVersionDate.replace('-', '')
+}
+
+String getProjectVersion(boolean keepSnapshotSuffix = true) {
+ def projectVersion = env.PROJECT_VERSION
+ if (keepSnapshotSuffix) {
+ return projectVersion.replace('-SNAPSHOT',
"-${getProjectVersionDate()}-SNAPSHOT")
+ }
+ return projectVersion.replace('-SNAPSHOT', "-${getProjectVersionDate()}")
+}
diff --git a/.ci/jenkins/dsl/jobs.groovy b/.ci/jenkins/dsl/jobs.groovy
index 37622bfc1a..6d0468aafd 100644
--- a/.ci/jenkins/dsl/jobs.groovy
+++ b/.ci/jenkins/dsl/jobs.groovy
@@ -49,6 +49,9 @@ createProjectSetupBranchJob()
// Nightly jobs
setupProjectNightlyJob()
+// Weekly jobs
+setupProjectWeeklyJob()
+
// Release jobs
setupProjectReleaseJob()
setupProjectPostReleaseJob()
@@ -124,6 +127,21 @@ void setupProjectNightlyJob() {
}
}
+void setupProjectWeeklyJob() {
+ def jobParams = JobParamsUtils.getBasicJobParams(this, '0-weekly',
JobType.OTHER, "${jenkins_path_project}/Jenkinsfile.weekly", 'Optaplanner
Weekly')
+ jobParams.triggers = [cron : '0 5 * * 0']
+ jobParams.env.putAll([
+ JENKINS_EMAIL_CREDS_ID: "${JENKINS_EMAIL_CREDS_ID}",
+
+ GIT_BRANCH_NAME: "${GIT_BRANCH}",
+ ])
+ KogitoJobTemplate.createPipelineJob(this, jobParams)?.with {
+ parameters {
+ booleanParam('SKIP_TESTS', false, 'Skip all tests')
+ }
+ }
+}
+
void setupProjectReleaseJob() {
def jobParams = JobParamsUtils.getBasicJobParams(this,
'optaplanner-release', JobType.RELEASE,
"${jenkins_path_project}/Jenkinsfile.release", 'Optaplanner Release')
jobParams.env.putAll([
@@ -227,6 +245,9 @@ setupSpecificBuildChainNightlyJob('native')
setupDeployJob(JobType.RELEASE)
setupPromoteJob(JobType.RELEASE)
+// Weekly deploy job
+setupWeeklyDeployJob()
+
if (Utils.isMainBranch(this)) {
setupOptaPlannerTurtleTestsJob('drools')
setupOptaPlannerTurtleTestsJob('bavet')
@@ -408,3 +429,36 @@ void setupOptaPlannerTurtleTestsJob(String
constraintStreamImplType) {
}
}
}
+
+void setupWeeklyDeployJob() {
+ def jobParams = JobParamsUtils.getBasicJobParams(this,
'optaplanner.weekly-deploy', JobType.OTHER,
"${jenkins_path}/Jenkinsfile.weekly.deploy", 'Optaplanner Weekly Deploy')
+ JobParamsUtils.setupJobParamsAgentDockerBuilderImageConfiguration(this,
jobParams)
+ jobParams.env.putAll([
+ PROPERTIES_FILE_NAME: 'deployment.properties',
+ JENKINS_EMAIL_CREDS_ID: "${JENKINS_EMAIL_CREDS_ID}",
+
+ GIT_AUTHOR: "${GIT_AUTHOR_NAME}",
+ GIT_AUTHOR_CREDS_ID: "${GIT_AUTHOR_CREDENTIALS_ID}",
+ GIT_AUTHOR_PUSH_CREDS_ID: "${GIT_AUTHOR_PUSH_CREDENTIALS_ID}",
+
+ MAVEN_SETTINGS_CONFIG_FILE_ID: "${MAVEN_SETTINGS_FILE_ID}",
+ MAVEN_DEPENDENCIES_REPOSITORY: "${MAVEN_ARTIFACTS_REPOSITORY}",
+ MAVEN_DEPLOY_REPOSITORY: "${MAVEN_ARTIFACTS_UPLOAD_REPOSITORY_URL}",
+ MAVEN_REPO_CREDS_ID: "${MAVEN_ARTIFACTS_UPLOAD_REPOSITORY_CREDS_ID}",
+ ])
+ KogitoJobTemplate.createPipelineJob(this, jobParams)?.with {
+ parameters {
+ stringParam('DISPLAY_NAME', '', 'Setup a specific build display
name')
+
+ stringParam('BUILD_BRANCH_NAME', "${GIT_BRANCH}", 'Set the Git
branch to checkout')
+
+ booleanParam('SKIP_TESTS', false, 'Skip tests')
+
+ stringParam('QUICKSTARTS_BUILD_BRANCH_NAME',
Utils.isMainBranch(this) ? 'development' : "${GIT_BRANCH}", 'Base branch for
quickstarts.')
+
+ stringParam('GIT_CHECKOUT_DATETIME', '', 'Git checkout date and
time - (Y-m-d H:i)')
+
+ booleanParam('SEND_NOTIFICATION', false, 'In case you want the
pipeline to send a notification on CI channel for this run.')
+ }
+ }
+}
diff --git a/.ci/jenkins/project/Jenkinsfile.setup-branch
b/.ci/jenkins/project/Jenkinsfile.setup-branch
index f93412ebe4..78c7657c06 100644
--- a/.ci/jenkins/project/Jenkinsfile.setup-branch
+++ b/.ci/jenkins/project/Jenkinsfile.setup-branch
@@ -108,6 +108,24 @@ pipeline {
}
}
+ // Launch the weekly to deploy all artifacts from the branch
+ stage('Launch the weekly') {
+ when {
+ expression { return params.DEPLOY }
+ }
+ steps {
+ script {
+ def buildParams = getDefaultBuildParams()
+ addBooleanParam(buildParams, 'SKIP_TESTS', true)
+ buildJob('../other/optaplanner.weekly-deploy',
buildParams, 'optaplanner.weekly-deploy', false)
+ }
+ }
+ post {
+ failure {
+ addFailedStage('optaplanner-weekly')
+ }
+ }
+ }
}
post {
unsuccessful {
diff --git a/.ci/jenkins/project/Jenkinsfile.weekly
b/.ci/jenkins/project/Jenkinsfile.weekly
new file mode 100644
index 0000000000..89fb97b3e9
--- /dev/null
+++ b/.ci/jenkins/project/Jenkinsfile.weekly
@@ -0,0 +1,188 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import org.jenkinsci.plugins.workflow.libs.Library
+
+@Library('jenkins-pipeline-shared-libraries')_
+
+// Deploy jobs
+OPTAPLANNER_DEPLOY = 'optaplanner.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 util.avoidFaultyNodes('ubuntu')
+ }
+
+ options {
+ timeout(time: 1380, unit: 'MINUTES')
+ }
+
+ environment {
+ OPTAPLANNER_CI_EMAIL_TO = credentials("${JENKINS_EMAIL_CREDS_ID}")
+
+ // Use branch name in weekly tag as we may have parallel main and
release branch builds
+ WEEKLY_TAG = """${getBuildBranch()}-${sh(
+ returnStdout: true,
+ script: 'date -u "+%Y-%m-%d"'
+ ).trim()}"""
+}
+
+ stages {
+ stage('Initialize') {
+ steps {
+ script {
+ echo "weekly tag is ${env.WEEKLY_TAG}"
+
+ currentBuild.displayName = env.WEEKLY_TAG
+ }
+ }
+ }
+
+ stage('Build & Deploy OptaPlanner') {
+ steps {
+ script {
+ def buildParams = getDefaultBuildParams()
+ addSkipTestsParam(buildParams)
+ addSkipIntegrationTestsParam(buildParams)
+
+ buildJob(OPTAPLANNER_DEPLOY, buildParams)
+ }
+ }
+ post {
+ failure {
+ addFailedStage(OPTAPLANNER_DEPLOY)
+ }
+ }
+ }
+ }
+ post {
+ unsuccessful {
+ script {
+ if (currentBuild.currentResult != 'UNSTABLE') {
+ 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.getResult()}")
+ }
+ return job
+}
+
+def getJob(String jobKey) {
+ return JOBS[jobKey]
+}
+
+String getJobUrl(String jobKey) {
+ echo "getJobUrl for ${jobKey}"
+ return getJob(jobKey)?.getAbsoluteUrl() ?: ''
+}
+
+boolean isJobSucceeded(String jobKey) {
+ return getJob(jobKey)?.getResult() == 'SUCCESS'
+}
+
+void addFailedStage(String jobKey = '') {
+ FAILED_STAGES.put("${STAGE_NAME}", jobKey)
+}
+void addUnstableStage(String jobKey = '') {
+ UNSTABLE_STAGES.put("${STAGE_NAME}", jobKey)
+}
+
+void sendPipelineErrorNotification() {
+ String bodyMsg = "Optaplanner weekly job #${BUILD_NUMBER} was:
${currentBuild.currentResult}"
+
+ paramsStr = ''
+ if (params.SKIP_TESTS) {
+ paramsStr += '\n- Tests skipped'
+ }
+ bodyMsg += paramsStr ? "\n\nConfiguration:${paramsStr}" : '\n'
+
+ 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: ${BUILD_URL}"
+ emailext body: bodyMsg, subject: "[${getBuildBranch()}][d] Full Pipeline",
+ to: env.OPTAPLANNER_CI_EMAIL_TO
+}
+
+List getDefaultBuildParams() {
+ List params = []
+ addStringParam(params, 'DISPLAY_NAME', "${env.WEEKLY_TAG}")
+ addStringParam(params, 'GIT_CHECKOUT_DATETIME', getCheckoutDatetime())
+ addStringParam(params, 'QUICKSTARTS_BUILD_BRANCH_NAME', getBuildBranch())
+ 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 buildParams, String key, String value) {
+ buildParams.add(string(name: key, value: value))
+}
+
+void addBooleanParam(List buildParams, String key, boolean value) {
+ buildParams.add(booleanParam(name: key, value: value))
+}
+
+String getBuildBranch() {
+ return env.GIT_BRANCH_NAME
+}
+
+String getCurrentDate() {
+ return sh(returnStdout: true, script: 'date -u "+%Y-%m-%d"').trim()
+}
+
+String getCheckoutDatetime() {
+ return getCurrentDate() + ' 02:00' // Cut-off 02:00AM
+}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]