pipeline { agent { label 'builder1' } options { timestamps() disableConcurrentBuilds() skipDefaultCheckout(true) } environment { REGISTRY_URL = 'reg.nxsir.cn' API_IMAGE_NAME = 'liverecorder/app-api' WEB_IMAGE_NAME = 'liverecorder/app-web' IMAGE_TAG = "${env.BUILD_ID}" DOCKER_CREDS = 'harbor_key' TARGET_PLATFORMS = 'linux/amd64,linux/arm64' BUILDER_NAME = "liverecorder-buildx-${env.BUILD_ID}" GIT_REPO_URL = 'https://gitea.nxsir.cn/nanxun/live_recorder.git' GIT_BRANCH = 'main' GIT_CREDS = '' API_IMAGE_TAGGED = "${REGISTRY_URL}/${API_IMAGE_NAME}:${IMAGE_TAG}" API_IMAGE_LATEST = "${REGISTRY_URL}/${API_IMAGE_NAME}:latest" WEB_IMAGE_TAGGED = "${REGISTRY_URL}/${WEB_IMAGE_NAME}:${IMAGE_TAG}" WEB_IMAGE_LATEST = "${REGISTRY_URL}/${WEB_IMAGE_NAME}:latest" } stages { stage('Checkout') { steps { script { def userRemoteConfig = [url: env.GIT_REPO_URL] if (env.GIT_CREDS?.trim()) { userRemoteConfig.credentialsId = env.GIT_CREDS.trim() } checkout([ $class: 'GitSCM', branches: [[name: "*/${env.GIT_BRANCH}"]], userRemoteConfigs: [userRemoteConfig] ]) } } } stage('Prepare Buildx') { steps { sh """ set -e sudo docker buildx version sudo docker run --privileged --rm tonistiigi/binfmt --install arm64 sudo docker buildx rm ${BUILDER_NAME} >/dev/null 2>&1 || true sudo docker buildx create --name ${BUILDER_NAME} --driver docker-container --use sudo docker buildx inspect --builder ${BUILDER_NAME} --bootstrap """ } } stage('Login Registry') { steps { withCredentials([ usernamePassword( credentialsId: "${DOCKER_CREDS}", usernameVariable: 'DOCKER_USERNAME', passwordVariable: 'DOCKER_PASSWORD' ) ]) { sh """ set -e echo "\$DOCKER_PASSWORD" | sudo docker login ${REGISTRY_URL} -u "\$DOCKER_USERNAME" --password-stdin """ } } } stage('Build And Push API Image') { steps { sh """ set -e echo 'Building and pushing multi-arch API image: ${API_IMAGE_TAGGED}' sudo docker buildx build \ --builder ${BUILDER_NAME} \ --platform ${TARGET_PLATFORMS} \ --pull \ --network host \ --provenance=false \ -f src/LiveRecorder.WebApi/Dockerfile \ -t ${API_IMAGE_TAGGED} \ -t ${API_IMAGE_LATEST} \ --push \ . """ } } stage('Build And Push Web Image') { steps { sh """ set -e echo 'Building and pushing multi-arch Web image: ${WEB_IMAGE_TAGGED}' sudo docker buildx build \ --builder ${BUILDER_NAME} \ --platform ${TARGET_PLATFORMS} \ --pull \ --network host \ --provenance=false \ -f frontend/Dockerfile \ --build-arg VITE_API_BASE_URL=/api \ -t ${WEB_IMAGE_TAGGED} \ -t ${WEB_IMAGE_LATEST} \ --push \ frontend """ } } } post { success { echo "Pipeline completed successfully." } failure { echo "Pipeline failed. Please check the build log." } always { sh """ set +e sudo docker buildx rm ${BUILDER_NAME} >/dev/null 2>&1 || true sudo docker logout ${REGISTRY_URL} >/dev/null 2>&1 || true true """ deleteDir() } } }