2025-03-06 16:03:07 +01:00
|
|
|
pipeline {
|
2025-06-04 09:50:08 +02:00
|
|
|
agent any
|
2025-06-03 18:52:56 +02:00
|
|
|
environment {
|
2025-06-04 09:46:39 +02:00
|
|
|
CONTAINER_REGISTRY = credentials("container_registry")
|
|
|
|
REGISTRY_NAMESPACE = credentials("registry_namespace")
|
2025-06-04 08:28:49 +02:00
|
|
|
REPO_NAME = env.GIT_URL.replaceFirst(/^.*\/([^\/]+?).git$/, '$1')
|
2025-06-04 12:42:01 +02:00
|
|
|
IMAGE_NAME = "${env.CONTAINER_REGISTRY}/${env.REGISTRY_NAMESPACE}/${env.REPO_NAME}:${env.BRANCH_NAME}"
|
2025-06-03 18:52:56 +02:00
|
|
|
}
|
2025-03-06 16:03:07 +01:00
|
|
|
stages {
|
2025-06-04 09:46:39 +02:00
|
|
|
stage("Build") {
|
2025-06-03 19:17:12 +02:00
|
|
|
when { tag "*" }
|
2025-06-04 10:31:57 +02:00
|
|
|
steps {
|
|
|
|
script {
|
|
|
|
def architectures = ["aarch64", "x86_64"]
|
|
|
|
def parallelStages = [:]
|
|
|
|
|
|
|
|
for (arch in architectures) {
|
|
|
|
def nodeLabel = arch
|
|
|
|
|
|
|
|
parallelStages[arch] = {
|
|
|
|
node(nodeLabel) {
|
2025-06-04 10:39:41 +02:00
|
|
|
checkout scm
|
|
|
|
|
2025-06-04 12:42:01 +02:00
|
|
|
def run_name = "${nodeLabel}-${env.BUILD_NUMBER}"
|
2025-06-04 12:44:25 +02:00
|
|
|
def image_run_name = "${IMAGE_NAME}-${nodeLabel}-${env.BUILD_NUMBER}"
|
2025-06-04 12:42:01 +02:00
|
|
|
|
|
|
|
sh "podman build -t ${image_run_name} ."
|
2025-06-04 12:44:25 +02:00
|
|
|
sh "podman save -o ${run_name}.tar ${image_run_name}"
|
2025-06-04 12:42:01 +02:00
|
|
|
stash includes: "${run_name}.tar", name: "${nodeLabel}-image"
|
2025-06-04 10:31:57 +02:00
|
|
|
}
|
|
|
|
}
|
2025-06-04 09:46:39 +02:00
|
|
|
}
|
2025-06-04 10:31:57 +02:00
|
|
|
|
|
|
|
parallel parallelStages
|
2025-06-04 12:20:43 +02:00
|
|
|
|
|
|
|
env.ARCHITECTURES = architectures.join(',')
|
2025-06-04 09:46:39 +02:00
|
|
|
}
|
2025-03-06 16:03:07 +01:00
|
|
|
}
|
|
|
|
}
|
2025-06-04 09:46:39 +02:00
|
|
|
stage("Combine and Push") {
|
2025-06-03 19:32:22 +02:00
|
|
|
when { tag "*" }
|
2025-06-04 09:46:39 +02:00
|
|
|
agent any
|
2025-06-03 19:32:22 +02:00
|
|
|
steps {
|
2025-06-04 12:23:37 +02:00
|
|
|
script {
|
|
|
|
def architectures = env.ARCHITECTURES.split(',')
|
2025-06-04 12:20:43 +02:00
|
|
|
|
2025-06-04 12:23:37 +02:00
|
|
|
for (arch in architectures) {
|
|
|
|
unstash "${arch}-image"
|
|
|
|
sh "podman load -i ${arch}-${env.BUILD_NUMBER}.tar"
|
|
|
|
}
|
2025-06-04 09:46:39 +02:00
|
|
|
|
2025-06-04 12:23:37 +02:00
|
|
|
def manifestImages = architectures.collect { arch ->
|
2025-06-04 12:42:01 +02:00
|
|
|
return "${IMAGE_NAME}-${arch}-${env.BUILD_NUMBER}"
|
2025-06-04 12:23:37 +02:00
|
|
|
}.join(' ')
|
2025-06-04 12:28:34 +02:00
|
|
|
|
2025-06-04 12:32:12 +02:00
|
|
|
sh """
|
2025-06-04 12:42:01 +02:00
|
|
|
podman manifest rm ${IMAGE_NAME} || true
|
|
|
|
podman manifest create ${IMAGE_NAME} ${manifestImages}
|
2025-06-04 12:32:12 +02:00
|
|
|
"""
|
2025-06-04 12:23:37 +02:00
|
|
|
|
|
|
|
withCredentials([usernamePassword(credentialsId: "dockerhub", usernameVariable: "REG_USERNAME", passwordVariable: "REG_PASSWORD")]) {
|
2025-06-04 12:32:12 +02:00
|
|
|
sh """
|
2025-06-04 12:23:37 +02:00
|
|
|
podman login ${CONTAINER_REGISTRY} -u ${REG_USERNAME} -p ${REG_PASSWORD}
|
2025-06-04 12:42:01 +02:00
|
|
|
podman manifest push ${IMAGE_NAME} \
|
|
|
|
docker://${IMAGE_NAME}
|
2025-06-04 12:32:12 +02:00
|
|
|
"""
|
2025-06-04 12:23:37 +02:00
|
|
|
}
|
2025-06-03 19:32:22 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2025-03-06 16:03:07 +01:00
|
|
|
}
|
2025-06-03 18:38:40 +02:00
|
|
|
}
|