| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122 | 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()        }    }}
 |