blob: 8124947373691c2fe54f4bd92d07b73e86775d99 [file] [log] [blame]
@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(), getTempBuiltImageTag())
}
}
}
stage('Create and push a new tag') {
steps {
script {
projectVersion = getProjectVersion(false)
githubscm.setUserConfigFromCreds(helper.getGitAuthorPushCredsId())
githubscm.tagRepository(projectVersion)
githubscm.pushRemoteTag('origin', projectVersion, helper.getGitAuthorPushCredsId())
}
}
}
stage('Run e2e tests on Minikube') {
when {
expression {
return helper.shouldLaunchTests()
}
}
steps {
script {
launchE2ETestsJob('minikube')
}
}
}
}
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() {
checkout(githubscm.resolveRepository(helper.getRepoName(), helper.getGitAuthor(), helper.getBuildBranch(), false, helper.getGitAuthorCredsId()))
// need to manually checkout branch since on a detached branch after checkout command
sh "git checkout ${helper.getBuildBranch()}"
checkoutDatetime = getCheckoutDatetime()
if (checkoutDatetime) {
sh "git checkout `git rev-list -n 1 --before=\"${checkoutDatetime}\" ${helper.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 pushFinalImage(String oldImageName, String newImageName) {
cloud.skopeoCopyRegistryImages(oldImageName, newImageName, Integer.parseInt(env.MAX_REGISTRY_RETRIES))
}
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()}")
}