2025-12-16 19:23:46 -03:00
|
|
|
pipeline {
|
2025-12-18 01:26:53 -03:00
|
|
|
parameters {
|
|
|
|
|
string(
|
|
|
|
|
name: 'HARBOR_VERSION',
|
|
|
|
|
defaultValue: '',
|
|
|
|
|
description: 'Harbor tag to build (e.g. v2.14.1). Leave empty to build the latest release.'
|
|
|
|
|
)
|
2025-12-17 02:05:53 -03:00
|
|
|
}
|
2025-12-16 22:41:23 -03:00
|
|
|
agent {
|
|
|
|
|
kubernetes {
|
|
|
|
|
label 'harbor-arm-build'
|
2025-12-16 23:12:01 -03:00
|
|
|
defaultContainer 'builder'
|
2025-12-16 22:41:23 -03:00
|
|
|
yaml """
|
|
|
|
|
apiVersion: v1
|
|
|
|
|
kind: Pod
|
|
|
|
|
spec:
|
2025-12-17 02:51:34 -03:00
|
|
|
nodeSelector:
|
|
|
|
|
kubernetes.io/arch: arm64
|
2025-12-16 22:41:23 -03:00
|
|
|
containers:
|
2025-12-16 23:12:01 -03:00
|
|
|
- name: builder
|
2025-12-18 01:26:53 -03:00
|
|
|
image: quay.io/podman/stable:v5.2
|
2025-12-16 22:41:23 -03:00
|
|
|
tty: true
|
2025-12-18 01:26:53 -03:00
|
|
|
command: ["cat"]
|
|
|
|
|
securityContext:
|
|
|
|
|
privileged: true
|
2025-12-16 23:12:01 -03:00
|
|
|
env:
|
2025-12-18 01:26:53 -03:00
|
|
|
- name: DOCKER_CONFIG
|
|
|
|
|
value: /root/.docker
|
|
|
|
|
- name: REGISTRY_AUTH_FILE
|
|
|
|
|
value: /root/.docker/config.json
|
|
|
|
|
- name: XDG_RUNTIME_DIR
|
|
|
|
|
value: /var/run/containers
|
2025-12-16 22:41:23 -03:00
|
|
|
volumeMounts:
|
2025-12-16 23:12:01 -03:00
|
|
|
- name: workspace-volume
|
|
|
|
|
mountPath: /home/jenkins/agent
|
2025-12-17 02:51:34 -03:00
|
|
|
- name: docker-config-secret
|
|
|
|
|
mountPath: /docker-config
|
2025-12-18 01:26:53 -03:00
|
|
|
- name: containers-storage
|
|
|
|
|
mountPath: /var/lib/containers
|
|
|
|
|
- name: podman-runtime
|
|
|
|
|
mountPath: /var/run/containers
|
2025-12-16 22:41:23 -03:00
|
|
|
volumes:
|
2025-12-17 02:51:34 -03:00
|
|
|
- name: docker-config-secret
|
2025-12-17 01:52:53 -03:00
|
|
|
secret:
|
|
|
|
|
secretName: harbor-robot-pipeline
|
|
|
|
|
items:
|
|
|
|
|
- key: .dockerconfigjson
|
|
|
|
|
path: config.json
|
2025-12-16 22:41:23 -03:00
|
|
|
- name: workspace-volume
|
|
|
|
|
emptyDir: {}
|
2025-12-18 01:26:53 -03:00
|
|
|
- name: containers-storage
|
|
|
|
|
emptyDir: {}
|
|
|
|
|
- name: podman-runtime
|
2025-12-16 23:12:01 -03:00
|
|
|
emptyDir: {}
|
2025-12-16 22:41:23 -03:00
|
|
|
"""
|
|
|
|
|
}
|
|
|
|
|
}
|
2025-12-16 19:23:46 -03:00
|
|
|
environment {
|
2025-12-17 12:24:07 -03:00
|
|
|
IMAGE_NAMESPACE = 'registry.bstein.dev/infra'
|
2025-12-18 01:26:53 -03:00
|
|
|
TAG_SUFFIX = '-arm64'
|
|
|
|
|
REGISTRY_URL = 'registry.bstein.dev'
|
2025-12-16 23:12:01 -03:00
|
|
|
}
|
|
|
|
|
options {
|
|
|
|
|
disableConcurrentBuilds()
|
2025-12-18 01:26:53 -03:00
|
|
|
timestamps()
|
2025-12-16 19:23:46 -03:00
|
|
|
}
|
|
|
|
|
stages {
|
2025-12-18 01:26:53 -03:00
|
|
|
stage('Checkout pipeline repo') {
|
2025-12-16 19:23:46 -03:00
|
|
|
steps {
|
2025-12-16 23:12:01 -03:00
|
|
|
git credentialsId: 'gitea-pat', url: 'https://scm.bstein.dev/bstein/harbor-arm-build.git'
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2025-12-18 01:26:53 -03:00
|
|
|
stage('Setup tooling') {
|
2025-12-16 23:12:01 -03:00
|
|
|
steps {
|
|
|
|
|
container('builder') {
|
|
|
|
|
sh '''
|
|
|
|
|
set -euo pipefail
|
2025-12-18 01:26:53 -03:00
|
|
|
microdnf -y install git make curl tar gzip jq golang podman-docker python3
|
|
|
|
|
mkdir -p "${DOCKER_CONFIG}"
|
|
|
|
|
cp /docker-config/config.json "${DOCKER_CONFIG}/config.json"
|
|
|
|
|
# Make the Docker CLI invoke podman (buildah backend).
|
|
|
|
|
ln -sf /usr/bin/podman /usr/local/bin/docker
|
|
|
|
|
mkdir -p "${XDG_RUNTIME_DIR}"
|
2025-12-16 23:12:01 -03:00
|
|
|
'''
|
2025-12-16 22:41:23 -03:00
|
|
|
}
|
2025-12-16 19:23:46 -03:00
|
|
|
}
|
|
|
|
|
}
|
2025-12-16 23:12:01 -03:00
|
|
|
|
2025-12-18 01:26:53 -03:00
|
|
|
stage('Resolve version') {
|
2025-12-16 19:23:46 -03:00
|
|
|
steps {
|
2025-12-16 23:12:01 -03:00
|
|
|
container('builder') {
|
2025-12-18 01:26:53 -03:00
|
|
|
script {
|
|
|
|
|
def resolved = sh(
|
|
|
|
|
label: 'pick version',
|
|
|
|
|
returnStdout: true,
|
|
|
|
|
script: '''
|
|
|
|
|
set -euo pipefail
|
|
|
|
|
if [ -n "${HARBOR_VERSION:-}" ]; then
|
|
|
|
|
echo "${HARBOR_VERSION}"
|
|
|
|
|
exit 0
|
|
|
|
|
fi
|
|
|
|
|
curl -sSL https://api.github.com/repos/goharbor/harbor/releases/latest | python3 - <<'PY'
|
|
|
|
|
import json, sys
|
|
|
|
|
data = json.load(sys.stdin)
|
|
|
|
|
print(data.get("tag_name", "").strip())
|
|
|
|
|
PY
|
|
|
|
|
'''
|
|
|
|
|
).trim()
|
|
|
|
|
env.HARBOR_VERSION_RESOLVED = resolved
|
|
|
|
|
env.HARBOR_SRC_DIR = "harbor-src/harbor-${resolved.startsWith('v') ? resolved.substring(1) : resolved}"
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
stage('Fetch source') {
|
|
|
|
|
steps {
|
|
|
|
|
container('builder') {
|
|
|
|
|
sh """
|
2025-12-16 23:12:01 -03:00
|
|
|
set -euo pipefail
|
|
|
|
|
rm -rf harbor-src
|
|
|
|
|
mkdir -p harbor-src
|
2025-12-18 01:26:53 -03:00
|
|
|
curl -sSL "https://github.com/goharbor/harbor/archive/refs/tags/${env.HARBOR_VERSION_RESOLVED}.tar.gz" | tar xz -C harbor-src
|
|
|
|
|
ls -la harbor-src
|
|
|
|
|
"""
|
2025-12-16 23:12:01 -03:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2025-12-18 01:26:53 -03:00
|
|
|
stage('Build & push (podman/buildah)') {
|
2025-12-16 23:12:01 -03:00
|
|
|
steps {
|
|
|
|
|
container('builder') {
|
2025-12-18 01:26:53 -03:00
|
|
|
sh """
|
2025-12-17 01:52:53 -03:00
|
|
|
set -euo pipefail
|
2025-12-18 01:26:53 -03:00
|
|
|
export VERSIONTAG=\"${env.HARBOR_VERSION_RESOLVED}${TAG_SUFFIX}.${BUILD_NUMBER}\"
|
|
|
|
|
export BASEIMAGETAG=\"${env.HARBOR_VERSION_RESOLVED}${TAG_SUFFIX}.${BUILD_NUMBER}\"
|
|
|
|
|
export IMAGENAMESPACE=\"${IMAGE_NAMESPACE}\"
|
|
|
|
|
export BASEIMAGENAMESPACE=\"${IMAGE_NAMESPACE}\"
|
|
|
|
|
export DOCKERNETWORK=host
|
|
|
|
|
export PULL_BASE_FROM_DOCKERHUB=false
|
|
|
|
|
export BUILD_BASE=true
|
|
|
|
|
export BUILDTRIVYADP=false
|
|
|
|
|
export BUILD_INSTALLER=true
|
|
|
|
|
export BUILDAH_ISOLATION=chroot
|
|
|
|
|
export REGISTRY_AUTH_FILE=\"${DOCKER_CONFIG}/config.json\"
|
2025-12-17 02:51:34 -03:00
|
|
|
git config --global --add safe.directory '*'
|
2025-12-18 01:26:53 -03:00
|
|
|
cd \"${env.HARBOR_SRC_DIR}\"
|
2025-12-16 22:41:23 -03:00
|
|
|
|
2025-12-17 01:52:53 -03:00
|
|
|
make compile
|
2025-12-18 01:26:53 -03:00
|
|
|
make \\
|
|
|
|
|
VERSIONTAG=\"${env.HARBOR_VERSION_RESOLVED}${TAG_SUFFIX}.${BUILD_NUMBER}\" \\
|
|
|
|
|
BASEIMAGETAG=\"${env.HARBOR_VERSION_RESOLVED}${TAG_SUFFIX}.${BUILD_NUMBER}\" \\
|
|
|
|
|
IMAGENAMESPACE=\"${IMAGE_NAMESPACE}\" \\
|
|
|
|
|
BASEIMAGENAMESPACE=\"${IMAGE_NAMESPACE}\" \\
|
|
|
|
|
DOCKERNETWORK=host \\
|
|
|
|
|
PULL_BASE_FROM_DOCKERHUB=false \\
|
|
|
|
|
BUILD_BASE=true \\
|
|
|
|
|
BUILDTRIVYADP=false \\
|
|
|
|
|
BUILD_INSTALLER=true \\
|
2025-12-17 11:11:43 -03:00
|
|
|
build
|
2025-12-17 01:52:53 -03:00
|
|
|
|
2025-12-18 01:26:53 -03:00
|
|
|
for pair in \\
|
|
|
|
|
\"prepare:harbor-prepare\" \\
|
|
|
|
|
\"redis-photon:harbor-redis\" \\
|
|
|
|
|
\"nginx-photon:harbor-nginx\" \\
|
|
|
|
|
\"registry-photon:harbor-registry\"; do
|
|
|
|
|
src=\"${IMAGE_NAMESPACE}/$(echo "$pair" | cut -d: -f1):${env.HARBOR_VERSION_RESOLVED}${TAG_SUFFIX}.${BUILD_NUMBER}\"
|
|
|
|
|
dst=\"${IMAGE_NAMESPACE}/$(echo "$pair" | cut -d: -f2):${env.HARBOR_VERSION_RESOLVED}${TAG_SUFFIX}.${BUILD_NUMBER}\"
|
|
|
|
|
if podman image exists \"$src\"; then
|
|
|
|
|
podman tag \"$src\" \"$dst\" || true
|
|
|
|
|
fi
|
|
|
|
|
done
|
2025-12-17 01:57:27 -03:00
|
|
|
|
2025-12-18 01:26:53 -03:00
|
|
|
podman images --format '{{.Repository}}:{{.Tag}}' \\
|
|
|
|
|
| awk -v ns=\"${IMAGE_NAMESPACE}/\" -v tag=\"${env.HARBOR_VERSION_RESOLVED}${TAG_SUFFIX}.${BUILD_NUMBER}\" 'index($0, ns)==1 && $0 ~ ":"tag"$"' \\
|
|
|
|
|
| sort -u \\
|
2025-12-17 01:52:53 -03:00
|
|
|
| while read -r img; do
|
2025-12-18 01:26:53 -03:00
|
|
|
echo \"Pushing ${img}\"
|
|
|
|
|
podman push \"${img}\"
|
2025-12-17 01:52:53 -03:00
|
|
|
done
|
2025-12-18 01:26:53 -03:00
|
|
|
"""
|
2025-12-16 19:23:46 -03:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2025-12-16 23:12:01 -03:00
|
|
|
post {
|
2025-12-18 01:26:53 -03:00
|
|
|
always {
|
|
|
|
|
echo "done"
|
|
|
|
|
}
|
2025-12-16 23:12:01 -03:00
|
|
|
}
|
2025-12-16 19:23:46 -03:00
|
|
|
}
|