Browse Source

"修改jenkinsfile"

hxd 2 months ago
parent
commit
d3dc8d3c3a
1 changed files with 75 additions and 63 deletions
  1. 75 63
      Jenkinsfile

+ 75 - 63
Jenkinsfile

@@ -3,8 +3,8 @@ pipeline {
 
     parameters {
         choice(name: 'env', choices: ['dev', 'test', 'prod'], description: '部署环境(dev/test/prod)')
-        string(name: 'NAMESPACE', defaultValue: 'device', description: 'Kubernetes 命名空间')
-        string(name: 'DOMAIN', defaultValue: '', description: 'Ingress 域名(留空则不创建 Ingress)')
+        string(name: 'NAMESPACE', defaultValue: 'hfln-dev', description: 'Kubernetes 命名空间')
+
     }
 
     environment {
@@ -13,20 +13,32 @@ pipeline {
         MAVEN_HOME         = '/usr/local/apache-maven-3.9.9/bin'
         HARBOR_HOST        = '8.130.28.21:81'
         KUBECONFIG_PATH    = '/root/.kube/config'
-        NODE1_IP           = '172.27.73.147'
-        NODE2_IP           = '172.27.73.146'
-        HARBOR_USER        = 'admin'
-        HARBOR_PASSWORD    = 'Hfln@1024'
         SPRING_PROFILES_ACTIVE = "${params.env}"
     }
 
     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},Ingress 域名:${params.INGRESS_HOST ?: '无'}"
+                }
+            }
+        }
+
         stage('🧬 拉取 Git 代码') {
             steps {
                 script {
                     echo ">>> 正在拉取 Git 代码..."
                     checkout scm
-                    echo ">>> 拉取完成 ✅"
+                    echo ">>> 代码拉取完成 ✅"
                 }
             }
         }
@@ -34,9 +46,9 @@ pipeline {
         stage('📦 Maven 构建项目') {
             steps {
                 script {
+                    echo ">>> 开始构建模块:${MODULE_NAME}"
+                    sh "${MAVEN_HOME}/mvn clean package -DskipTests -pl ${MODULE_NAME} -am"
                     echo ">>> 开始构建模块 ${MODULE_NAME}"
-                    sh "${MAVEN_HOME}/mvn clean package -DskipTests"
-                    echo ">>> 构建完成 ✅"
                 }
             }
         }
@@ -44,65 +56,36 @@ pipeline {
         stage('🐳 构建并推送 Docker 镜像') {
             steps {
                 script {
-                    def imageTag = "${HARBOR_HOST}/${params.env}/${PROJECT_NAME}:${BUILD_NUMBER}"
+                    def imageTag = "${HARBOR_HOST}/${env.HARBOR_PROJECT}/${PROJECT_NAME}:${BUILD_NUMBER}"
                     echo ">>> 构建 Docker 镜像: ${imageTag}"
+
                     sh """
-                        docker login -u ${HARBOR_USER} -p ${HARBOR_PASSWORD} ${HARBOR_HOST}
-                        docker build --build-arg env=${params.env} -t ${imageTag} .
+                        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 镜像构建并推送完成 ✅"
                     echo ">>> 镜像推送完成 ✅"
                 }
             }
         }
 
-        stage('🔍 测试节点能否拉取镜像') {
-            steps {
-                script {
-                    def imageTag = "${HARBOR_HOST}/${params.env}/${PROJECT_NAME}:${BUILD_NUMBER}"
-                    echo ">>> 测试节点能否拉取镜像..."
-                    sh """
-                        ssh root@${NODE1_IP} docker login -u ${HARBOR_USER} -p ${HARBOR_PASSWORD} ${HARBOR_HOST} && docker pull ${imageTag} || echo '[❌ 节点 node1 拉取失败]'
-                        ssh root@${NODE2_IP} docker login -u ${HARBOR_USER} -p ${HARBOR_PASSWORD} ${HARBOR_HOST} && docker pull ${imageTag} || echo '[❌ 节点 node2 拉取失败]'
-                    """
-                }
-            }
-        }
 
         stage('🚀 部署到 Kubernetes') {
             steps {
                 script {
-                    def imageTag = "${HARBOR_HOST}/${params.env}/${PROJECT_NAME}:${BUILD_NUMBER}"
-                    def domain = params.DOMAIN.trim()
-                    def ingressBlock = domain ? """
----
-apiVersion: networking.k8s.io/v1
-kind: Ingress
-metadata:
-  name: ${PROJECT_NAME}
-  annotations:
-    nginx.ingress.kubernetes.io/rewrite-target: /
-spec:
-  rules:
-  - host: ${domain}
-    http:
-      paths:
-      - path: /
-        pathType: Prefix
-        backend:
-          service:
-            name: ${PROJECT_NAME}
-            port:
-              number: 80
-""" : ""
+                    def imageTag = "${HARBOR_HOST}/${env.HARBOR_PROJECT}/${PROJECT_NAME}:${BUILD_NUMBER}"
 
-                    echo ">>> 开始部署至 Kubernetes 命名空间:${params.NAMESPACE}"
+                    echo ">>> 正在部署:${PROJECT_NAME} 到命名空间:${params.NAMESPACE}"
 
                     sh """
                         export KUBECONFIG=${KUBECONFIG_PATH}
+
+                        # 创建命名空间(如果不存在)
                         kubectl get ns ${params.NAMESPACE} || kubectl create ns ${params.NAMESPACE}
 
+                        # 部署 Deployment(2 副本)
                         kubectl apply -n ${params.NAMESPACE} -f - <<EOF
 apiVersion: apps/v1
 kind: Deployment
@@ -126,28 +109,54 @@ spec:
         env:
         - name: SPRING_PROFILES_ACTIVE
           value: "${params.env}"
+EOF
+
+                        # 部署 Service
+                        kubectl apply -n ${params.NAMESPACE} -f - <<EOF
 ---
 apiVersion: v1
 kind: Service
 metadata:
   name: ${PROJECT_NAME}
 spec:
-  type: NodePort
   selector:
     app: ${PROJECT_NAME}
   ports:
-  - port: 80
+  - protocol: TCP
+    port: 80
     targetPort: 8092
-    nodePort: 30086
-${ingressBlock}
+  type: ClusterIP
 EOF
+
+                        # 判断是否有域名,有则部署Ingress
+                        if [ -n "${params.INGRESS_HOST}" ]; then
+                            cat <<EOT | kubectl apply -n ${params.NAMESPACE} -f -
+apiVersion: networking.k8s.io/v1
+kind: Ingress
+metadata:
+  name: ${PROJECT_NAME}-ingress
+  annotations:
+    nginx.ingress.kubernetes.io/rewrite-target: /
+spec:
+  ingressClassName: nginx
+  rules:
+  - host: ${params.INGRESS_HOST}
+    http:
+      paths:
+      - path: /
+        pathType: Prefix
+        backend:
+          service:
+            name: ${PROJECT_NAME}
+            port:
+              number: 80
+EOT
+                        else
+                            echo ">>> 未配置 Ingress 域名,跳过 Ingress 部署"
+                        fi
                     """
+                    echo ">>> 部署完成 ✅"
 
-                    if (domain) {
-                        echo ">>> ✅ 部署完成,访问地址:http://${domain}/"
-                    } else {
-                        echo ">>> ✅ 部署完成,访问地址:http://${NODE1_IP}:30085/"
-                    }
                 }
             }
         }
@@ -156,26 +165,29 @@ EOF
     post {
         success {
             echo "✅ 构建 & 部署成功 🎉"
+
             script {
-                echo "🧹 清理本地旧镜像(保留最近 3 个)"
+                echo "🧹 开始清理旧镜像(只保留最新 3 个)"
                 sh """
-                    docker images --format '{{.Repository}}:{{.Tag}} {{.CreatedAt}}' | \
-                    grep '${HARBOR_HOST}/${params.env}/${PROJECT_NAME}:' | \
+                    docker images --format "{{.Repository}}:{{.Tag}} {{.CreatedAt}}" | \
+                    grep "${HARBOR_HOST}/${env.HARBOR_PROJECT}/${PROJECT_NAME}:" | \
                     sort -rk2 | \
                     tail -n +4 | \
                     awk '{print \$1}' | \
-                    xargs -r docker rmi || true
+                    xargs -r docker rmi
                 """
+                echo "🧹 旧镜像清理完成 ✅"
             }
         }
 
         failure {
-            echo "❌ 构建或部署失败,请检查日志"
+            echo "❌ 构建或部署失败,请检查日志"
         }
 
         always {
-            echo "🧼 清理 Jenkins 工作目录..."
+            echo "🧼 清理工作区..."
             cleanWs()
         }
     }
 }
+