ci: add multi-arch docker pipeline
This commit is contained in:
Vendored
+136
@@ -0,0 +1,136 @@
|
||||
pipeline {
|
||||
agent { label '构建机1' }
|
||||
|
||||
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()
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user