harbor-arm-build/Jenkinsfile

195 lines
5.6 KiB
Plaintext
Raw Normal View History

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:
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
- 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:
- name: docker-config-secret
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-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:53:09 -03:00
sh '''
set -euo pipefail
2025-12-18 01:53:09 -03:00
VERSION_TAG="${HARBOR_VERSION_RESOLVED}${TAG_SUFFIX}.${BUILD_NUMBER}"
export VERSIONTAG="${VERSION_TAG}"
export BASEIMAGETAG="${VERSION_TAG}"
export IMAGENAMESPACE="${IMAGE_NAMESPACE}"
export BASEIMAGENAMESPACE="${IMAGE_NAMESPACE}"
2025-12-18 01:26:53 -03:00
export DOCKERNETWORK=host
export PULL_BASE_FROM_DOCKERHUB=false
export BUILD_BASE=true
export BUILDTRIVYADP=false
export BUILD_INSTALLER=true
export BUILDAH_ISOLATION=chroot
2025-12-18 01:53:09 -03:00
export REGISTRY_AUTH_FILE="${DOCKER_CONFIG}/config.json"
git config --global --add safe.directory '*'
2025-12-18 01:53:09 -03:00
cd "${HARBOR_SRC_DIR}"
2025-12-16 22:41:23 -03:00
make compile
2025-12-18 01:53:09 -03:00
make \
VERSIONTAG="${VERSION_TAG}" \
BASEIMAGETAG="${VERSION_TAG}" \
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-18 01:53:09 -03:00
for pair in \
prepare:harbor-prepare \
redis-photon:harbor-redis \
nginx-photon:harbor-nginx \
registry-photon:harbor-registry; do
pair_src="${pair%%:*}"
pair_dst="${pair##*:}"
src="${IMAGE_NAMESPACE}/${pair_src}:${VERSION_TAG}"
dst="${IMAGE_NAMESPACE}/${pair_dst}:${VERSION_TAG}"
if podman image exists "${src}"; then
podman tag "${src}" "${dst}" || true
2025-12-18 01:26:53 -03:00
fi
done
2025-12-18 01:53:09 -03:00
podman images --format '{{.Repository}}:{{.Tag}}' \
| awk -v ns="${IMAGE_NAMESPACE}/" -v tag="${VERSION_TAG}" 'index($0, ns)==1 && $0 ~ ":"tag"$"' \
| sort -u \
| while read -r img; do
2025-12-18 01:53:09 -03:00
echo "Pushing ${img}"
podman push "${img}"
done
2025-12-18 01:53:09 -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
}