diff --git a/Jenkinsfile b/Jenkinsfile new file mode 100644 index 0000000..0a4daff --- /dev/null +++ b/Jenkinsfile @@ -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() + } + } +}