pipeline { agent any parameters { choice(name: 'env', choices: ['dev', 'test', 'prod'], description: '部署环境(dev/test/prod)') string(name: 'NAMESPACE', defaultValue: 'hfln-dev', description: 'Kubernetes 命名空间') } environment { PROJECT_NAME = 'portal-service' MODULE_NAME = 'portal-service-server' MAVEN_HOME = '/usr/local/apache-maven-3.9.9/bin' HARBOR_HOST = '8.130.28.21:81' KUBECONFIG_PATH = '/root/.kube/config' } stages { stage('🧬 设置环境变量') { steps { script { if (params.env == 'prod') { env.HARBOR_PROJECT = 'prod' } else if (params.env == 'test') { env.HARBOR_PROJECT = 'test' } else { env.HARBOR_PROJECT = 'dev' } echo ">>> 使用环境:${params.env},HARBOR 项目:${env.HARBOR_PROJECT},K8S 命名空间:${params.NAMESPACE}" } } } stage('🧬 拉取 Git 代码') { steps { script { echo ">>> 拉取代码中..." checkout scm echo ">>> 代码拉取完成 ✅" } } } stage('📦 Maven 构建项目') { steps { script { echo ">>> 开始构建模块:${MODULE_NAME}" sh "${MAVEN_HOME}/mvn clean package -DskipTests -pl ${MODULE_NAME} -am" echo ">>> 构建完成 ✅" } } } stage('🐳 构建 & 推送 Docker 镜像') { steps { script { def imageTag = "${HARBOR_HOST}/${env.HARBOR_PROJECT}/${PROJECT_NAME}:${BUILD_NUMBER}" echo ">>> 构建 Docker 镜像: ${imageTag}" sh """ docker login -u admin -p Hfln@1024 ${HARBOR_HOST} docker build --build-arg spring_profiles_active=${params.env} -t ${imageTag} . docker push ${imageTag} docker rmi ${imageTag} """ echo ">>> Docker 镜像构建并推送完成 ✅" } } } stage('🚀 部署到 Kubernetes') { steps { script { def imageTag = "${HARBOR_HOST}/${env.HARBOR_PROJECT}/${PROJECT_NAME}:${BUILD_NUMBER}" echo ">>> 正在部署:${PROJECT_NAME} 到命名空间:${params.NAMESPACE}" sh """ export KUBECONFIG=${KUBECONFIG_PATH} kubectl set image deployment/${PROJECT_NAME} ${PROJECT_NAME}=${imageTag} -n ${params.NAMESPACE} """ echo ">>> 部署完成 ✅" } } } } post { success { echo "✅ 构建 & 部署成功 🎉" script { echo "🧹 开始清理旧镜像(只保留最新 3 个)" sh """ docker images --format "{{.Repository}}:{{.Tag}}" | \ grep "${HARBOR_HOST}/${env.HARBOR_PROJECT}/${PROJECT_NAME}:" | \ sed 's/.*://g' | sort -rn | tail -n +4 | while read oldTag; do image="${HARBOR_HOST}/${env.HARBOR_PROJECT}/${PROJECT_NAME}:\${oldTag}" echo ">>> 检查镜像是否正在使用:\$image" CONTAINER=\$(docker ps -a --filter ancestor=\$image --format "{{.ID}}") if [ -z "\$CONTAINER" ]; then echo "✅ 删除镜像:\$image" docker rmi \$image else echo "⚠️ 镜像 \$image 正在被容器使用,跳过删除。" fi done """ echo "🧹 旧镜像清理完成 ✅" } } failure { echo "❌ 构建或部署失败,请检查日志!" } always { echo "🧼 清理工作区..." cleanWs() } } }