// apbo-boat-agent/deploy/dev/Jenkinsfile pipeline { agent any tools { jdk 'jdk21' maven 'apache-maven-3.9.12' // 与 Global Tool Configuration 中配置的 Name 保持一致 } environment { ENVIRONMENT = 'dev' DOCKER_REGISTRY = '10.122.172.43:9080' // 私有镜像仓库地址 DOCKER_CREDENTIALS_ID = 'harbor-credentials-id' // Jenkins 中 Docker 凭证 ID DOCKER_PROJECT = 'apbo' // Jenkins 中 Docker 凭证 ID KUBECONFIG_CREDENTIALS_ID = 'k3s-cluster1-config' // Jenkins 中 kubeconfig 凭证 ID PROJECT_MODULE = 'apbo-boat-agent' NAMESPACE = 'apbo-${ENVIRONMENT}' // 与 deployment.yaml 中的 namespace 一致 IMAGE_TAG = "${ENVIRONMENT}-${BUILD_NUMBER}" IMAGE_NAME = "${DOCKER_REGISTRY}/${DOCKER_PROJECT}/${PROJECT_MODULE}:${IMAGE_TAG}" } stages { stage('Checkout') { steps { checkout scm } } stage('Check Code Changes') { steps { script { def prev = env.GIT_PREVIOUS_SUCCESSFUL_COMMIT ?: '' if (!prev?.trim()) { echo "未找到上次成功构建提交,默认执行构建" env.SKIP_BUILD = 'false' } else { int rc = sh( script: "git diff --quiet ${prev} HEAD -- apbo-boat-agent", returnStatus: true ) env.SKIP_BUILD = (rc == 0) ? 'true' : 'false' } echo "代码变更检查结果: SKIP_BUILD=${env.SKIP_BUILD}" } } } stage('Build & Push Docker Image') { when { expression { env.SKIP_BUILD != 'true' } } steps { script { docker.withRegistry("http://${DOCKER_REGISTRY}", DOCKER_CREDENTIALS_ID) { dir('.') { def image = docker.build( "${IMAGE_NAME}", "-f apbo-boat-agent/deploy/${ENVIRONMENT}/Dockerfile --build-arg PIP_OPTIONS=\"--no-hash-check\" ./apbo-boat-agent" ) image.push() image.push("${ENVIRONMENT}-latest") } } } } } stage('Deploy to K3s') { steps { script { // 使用 withCredentials 绑定 kubeconfig 文件 withCredentials([file(credentialsId: KUBECONFIG_CREDENTIALS_ID, variable: 'KUBECONFIG')]) { // 设置 KUBECONFIG 环境变量 withEnv(["KUBECONFIG=${env.KUBECONFIG}"]) { // 先 apply 整个 deployment.yaml(确保资源存在) sh "kubectl apply -f ${PROJECT_MODULE}/deploy/${ENVIRONMENT}/deployment.yaml -n ${NAMESPACE}" // 滚动更新镜像 sh "kubectl set image deployment/apbo-boat-agent-${ENVIRONMENT} apbo-boat-agent=${IMAGE_NAME} -n ${NAMESPACE} --record" // 等待 rollout 完成 sh "kubectl rollout status deployment/apbo-boat-agent-${ENVIRONMENT} -n ${NAMESPACE}" } } } } } } post { success { script { echo '清理本次构建的 Docker 镜像以释放磁盘空间...' // 注意:此操作需要在 Jenkins 节点上安装并配置好 Docker 客户端,且能访问私有仓库 sh """ docker rmi ${IMAGE_NAME} || true """ // 清理所有悬空镜像,解决 问题 sh 'docker image prune -f' echo '镜像清理完成。' } } failure { echo '部署失败,请检查日志' } } }