This is an automated email from the ASF dual-hosted git repository.

rantunes pushed a commit to branch kie-issues_821
in repository 
https://gitbox.apache.org/repos/asf/incubator-kie-kogito-serverless-operator.git

commit 302a1b515fdca540250a8334f869ab9e62c600e9
Author: Rodrigo Antunes <[email protected]>
AuthorDate: Wed Jan 24 17:19:12 2024 -0300

    Weekly job inital implementation
---
 .ci/jenkins/Jenkinsfile.weekly.deploy | 264 ++++++++++++++++++++++++++++++++++
 .ci/jenkins/dsl/jobs.groovy           |  45 ++++++
 2 files changed, 309 insertions(+)

diff --git a/.ci/jenkins/Jenkinsfile.weekly.deploy 
b/.ci/jenkins/Jenkinsfile.weekly.deploy
new file mode 100644
index 00000000..7cd48fe7
--- /dev/null
+++ b/.ci/jenkins/Jenkinsfile.weekly.deploy
@@ -0,0 +1,264 @@
+@Library('jenkins-pipeline-shared-libraries')_
+
+helper = null
+
+pipeline {
+    agent {
+        docker {
+            image env.AGENT_DOCKER_BUILDER_IMAGE
+            args env.AGENT_DOCKER_BUILDER_ARGS
+        }
+    }
+
+    options {
+        timeout(time: 10, unit: 'HOURS')
+        timestamps()
+    }
+
+    environment {
+        KOGITO_CI_EMAIL_TO = credentials("${JENKINS_EMAIL_CREDS_ID}")
+
+        PR_BRANCH_HASH = "${util.generateHash(10)}"
+
+        IMAGE_BUILD_PLATFORMS = 'linux/amd64,linux/arm64'
+
+        CONTAINER_ENGINE = 'docker'
+    }
+
+    stages {
+        stage('Setup pipeline') {
+            steps {
+                script {
+                    helper = load '.ci/jenkins/scripts/helper.groovy'
+                    helper.initPipeline()
+                }
+            }
+        }
+        stage('Initialize') {
+            steps {
+                script {
+                    helper.cleanGoPath()
+
+                    helper.updateDisplayName()
+
+                    checkoutRepo()
+
+                    // Login to final registry
+                    helper.loginRegistry()
+
+                    // Prepare for multiplatform build
+                    int freePort = cloud.findFreePort()
+                    env.localRegistryUrl = cloud.startLocalRegistry(freePort)
+
+                    // TODO docker buildx could be preinstalled onto the 
docker image
+                    
cloud.prepareForDockerMultiplatformBuild([env.localRegistryUrl],[cloud.getDockerIOMirrorRegistryConfig()],
 false)
+
+                    env.PROJECT_VERSION = getOperatorVersion()
+                }
+            }
+            post {
+                success {
+                    script {
+                        properties.add('git.branch', helper.getBuildBranch())
+                        properties.add('git.author', helper.getGitAuthor())
+                        properties.add('project.version', getProjectVersion())
+                    }
+                }
+            }
+        }
+
+        stage('Update version') {
+            steps {
+                script {
+                    runPythonCommand("make bump-version 
new_version=${getProjectVersion()}")
+                }
+            }
+        }
+
+        stage('Test Operator') {
+            when {
+                expression {
+                    return helper.shouldLaunchTests()
+                }
+            }
+            steps {
+                runPythonCommand('make test')
+            }
+            post {
+                unsuccessful {
+                    script {
+                        util.archiveConsoleLog()
+                    }
+                }
+            }
+        }
+
+        stage('Build Operator') {
+            steps {
+                script {
+                    String tempBuiltImageTag = getTempBuiltImageTag()
+
+                    // Generate the Dockerfile
+                    runPythonCommand("make container-build 
BUILDER=${env.CONTAINER_ENGINE} IMG=${tempBuiltImageTag} ignore_tag=true 
build_options='--dry-run'")
+
+                    // Build multiplatform from generated Dockerfile
+                    dir('target/image') {
+                        
cloud.dockerBuildMultiPlatformImages(tempBuiltImageTag, 
getImageBuildPlatforms(), true, 'Kogito Serverless Operator squashed image')
+                    }
+                }
+            }
+            post {
+                unsuccessful {
+                    script {
+                        util.archiveConsoleLog()
+                    }
+                }
+            }
+        }
+
+        stage('Push to registry') {
+            steps {
+                script {
+                    // Push the snapshot image to registry
+                    pushFinalImage(getTempBuiltImageTag(), getBuiltImage())
+
+                    // Store image deployment information
+                    properties.add(helper.getImageRegistryProperty(), 
helper.getImageRegistry())
+                    properties.add(helper.getImageNamespaceProperty(), 
helper.getImageNamespace())
+                    properties.add(helper.getImageTagProperty(), 
helper.getTempBuiltImageTag())
+                }
+            }
+        }
+
+        stage('Create and push a new tag') {
+            steps {
+                script {
+                    projectVersion = getProjectVersion(false)
+                    
githubscm.setUserConfigFromCreds(util.getGitAuthorPushCredsId())
+                    githubscm.tagRepository(projectVersion)
+                    githubscm.pushRemoteTag('origin', projectVersion, 
util.getGitAuthorPushCredsId())
+                }
+            }
+        }
+
+        stage('Run e2e tests') {
+            when {
+                expression {
+                    return helper.shouldLaunchTests()
+                }
+            }
+            stage('Run tests on Minikube') {
+                steps {
+                    script {
+                        launchE2ETestsJob('minikube')
+                    }
+                }
+            }
+        }
+
+        stage('Create and push a new tag') {
+            steps {
+                script {
+                    projectVersion = getProjectVersion(false)
+                    dir(getRepoName()) {
+                        
githubscm.setUserConfigFromCreds(util.getGitAuthorPushCredsId())
+                        githubscm.tagRepository(projectVersion)
+                        githubscm.pushRemoteTag('origin', projectVersion, 
util.getGitAuthorPushCredsId())
+                    }
+                }
+            }
+        }
+    }
+    post {
+        always {
+            script {
+                properties.writeToFile(env.PROPERTIES_FILE_NAME)
+                archiveArtifacts(artifacts: env.PROPERTIES_FILE_NAME)
+            }
+        }
+        unsuccessful {
+            sendNotification()
+        }
+        cleanup {
+            script {
+                helper.cleanGoPath()
+                util.cleanNode(env.CONTAINER_ENGINE)
+                cloud.cleanDockerMultiplatformBuild()
+            }
+        }
+    }
+}
+
+void sendNotification() {
+    if (params.SEND_NOTIFICATION) {
+        mailer.sendMarkdownTestSummaryNotification('Deploy', 
"[${helper.getBuildBranch()}] Kogito Serverless Operator", 
[env.KOGITO_CI_EMAIL_TO])
+    } else {
+        echo 'No notification sent per configuration'
+    }
+}
+
+void checkoutRepo() {
+    deleteDir()
+    checkout(githubscm.resolveRepository(util.getRepoName(), 
util.getGitAuthor(), util.getBuildBranch(), false, util.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()}`"
+    }
+}
+
+String getOperatorVersion() {
+    return sh(script: 'source ./hack/env.sh > /dev/null && echo 
$(getOperatorVersion)', returnStdout: true).trim()
+}
+
+String getOperatorImageName() {
+    return sh(script: 'source ./hack/env.sh > /dev/null && echo 
$(getOperatorImageName)', returnStdout: true).trim()
+}
+
+String getBuiltImage() {
+    return "${getOperatorImageName()}:${getProjectVersion(false)}"
+}
+
+String getTempBuiltImageTag() {
+    return 
"${env.localRegistryUrl}/kogito-serverless-operator:${getProjectVersion(false)}"
+}
+
+void runPythonCommand(String cmd, boolean stdout = false) {
+    return sh(returnStdout: stdout, script: cmd)
+}
+
+void launchE2ETestsJob(String clusterName) {
+    String jobName = "kogito-serverless-operator.e2e.${clusterName}"
+    def buildParams = [
+        string(name: 'DISPLAY_NAME', value: params.DISPLAY_NAME),
+        string(name: 'BUILD_BRANCH_NAME', value: params.BUILD_BRANCH_NAME),
+        string(name: 'TEST_IMAGE_FULL_TAG', value: getBuiltImage())
+    ]
+    echo "Build ${jobName} with params ${buildParams}"
+    def job = build(job: "${jobName}", wait: true, parameters: buildParams, 
propagate: false)
+    if (job.result != 'SUCCESS') {
+        unstable("Tests on cluster ${clusterName} finished with result 
${job.result}")
+    }
+}
+
+List getImageBuildPlatforms() {
+    return "${IMAGE_BUILD_PLATFORMS}".split(',') as List
+}
+
+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 c323f3ad..2fcc42e4 100644
--- a/.ci/jenkins/dsl/jobs.groovy
+++ b/.ci/jenkins/dsl/jobs.groovy
@@ -50,6 +50,9 @@ setupDeployJob(JobType.NIGHTLY)
 setupDeployJob(JobType.RELEASE)
 setupPromoteJob(JobType.RELEASE)
 
+// Weekly
+setupWeeklyDeployJob(JobType.OTHER)
+
 /////////////////////////////////////////////////////////////////
 // Methods
 /////////////////////////////////////////////////////////////////
@@ -197,3 +200,45 @@ void setupE2EJob(JobType jobType, String clusterName, Map 
extraEnv = [:]) {
         }
     }
 }
+
+void setupWeeklyDeployJob(JobType jobType) {
+    def jobParams = JobParamsUtils.getBasicJobParams(this, 
'kogito-serverless-operator.weekly-deploy', jobType, 
"${jenkins_path}/Jenkinsfile.weekly.deploy", 'Kogito Serverless Cloud Operator 
Weekly Deploy')
+    JobParamsUtils.setupJobParamsAgentDockerBuilderImageConfiguration(this, 
jobParams)
+    jobParams.env.putAll([
+        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}",
+
+        OPERATOR_IMAGE_NAME: 'kogito-serverless-operator',
+        MAX_REGISTRY_RETRIES: 3,
+        PROPERTIES_FILE_NAME: 'deployment.properties',
+
+        TEST_CLUSTER_NAMES: clustersConfig.keySet().join(','),
+    ])
+    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')
+
+            // Build&Test information
+            booleanParam('SKIP_TESTS', false, 'Skip tests')
+
+            // Deploy information
+            stringParam('IMAGE_REGISTRY_CREDENTIALS', 
"${CLOUD_IMAGE_REGISTRY_CREDENTIALS}", 'Image registry credentials to use to 
deploy images. Will be ignored if no IMAGE_REGISTRY is given')
+            stringParam('IMAGE_REGISTRY', "${CLOUD_IMAGE_REGISTRY}", 'Image 
registry to use to deploy images')
+            stringParam('IMAGE_NAMESPACE', "${CLOUD_IMAGE_NAMESPACE}", 'Image 
namespace to use to deploy images')
+
+            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.')
+        }
+    }
+
+    // Create E2E jobs
+    clustersConfig.each { clusterName, clusterEnv ->
+        setupE2EJob(jobType, clusterName, clusterEnv)
+    }
+}


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to