Ver código fonte

修改jenkinsfile

yangliu 2 meses atrás
pai
commit
a624eba283
1 arquivos alterados com 73 adições e 80 exclusões
  1. 73 80
      Jenkinsfile

+ 73 - 80
Jenkinsfile

@@ -3,42 +3,30 @@ pipeline {
 
     parameters {
         choice(name: 'env', choices: ['dev', 'test', 'prod'], description: '部署环境(dev/test/prod)')
-        string(name: 'NAMESPACE', defaultValue: 'hfln-dev', description: 'Kubernetes 命名空间')
-        string(name: 'INGRESS_HOST', defaultValue: '', description: 'Ingress 域名(为空则不创建Ingress)')
+        string(name: 'NAMESPACE', defaultValue: 'gateway', description: 'Kubernetes 命名空间')
+        string(name: 'DOMAIN', defaultValue: '', description: 'Ingress 域名(留空则不创建 Ingress)')
     }
 
     environment {
-        PROJECT_NAME       = 'device-service'
-        MODULE_NAME        = 'device-service-server'
+        PROJECT_NAME       = 'gateway-service'
+        MODULE_NAME        = 'gateway-service-server'
         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 ">>> 拉取代码..."
+                    echo ">>> 正在拉取 Git 代码..."
                     checkout scm
-                    echo ">>> 代码拉取完成 ✅"
+                    echo ">>> 拉取完成 ✅"
                 }
             }
         }
@@ -46,26 +34,38 @@ 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 ">>> 构建完成 ✅"
                 }
             }
         }
 
-        stage('🐳 构建 & 推送 Docker 镜像') {
+        stage('🐳 构建推送 Docker 镜像') {
             steps {
                 script {
-                    def imageTag = "${HARBOR_HOST}/${env.HARBOR_PROJECT}/${PROJECT_NAME}:${BUILD_NUMBER}"
+                    def imageTag = "${HARBOR_HOST}/${params.env}/${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 login -u ${HARBOR_USER} -p ${HARBOR_PASSWORD} ${HARBOR_HOST}
+                        docker build --build-arg env=${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 拉取失败]'
+                    """
                 }
             }
         }
@@ -73,17 +73,36 @@ pipeline {
         stage('🚀 部署到 Kubernetes') {
             steps {
                 script {
-                    def imageTag = "${HARBOR_HOST}/${env.HARBOR_PROJECT}/${PROJECT_NAME}:${BUILD_NUMBER}"
+                    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
+""" : ""
 
-                    echo ">>> 正在部署:${PROJECT_NAME} 到命名空间:${params.NAMESPACE}"
+                    echo ">>> 开始部署至 Kubernetes 命名空间:${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
@@ -103,56 +122,32 @@ spec:
       - name: ${PROJECT_NAME}
         image: ${imageTag}
         ports:
-        - containerPort: 8092
+        - containerPort: 8090
         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:
-  - protocol: TCP
-    port: 80
-    targetPort: 8092
-  type: ClusterIP
+  - port: 80
+    targetPort: 8090
+    nodePort: 30085
+${ingressBlock}
 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/"
+                    }
                 }
             }
         }
@@ -161,27 +156,25 @@ EOT
     post {
         success {
             echo "✅ 构建 & 部署成功 🎉"
-
             script {
-                echo "🧹 开始清理旧镜像(只保留最新 3 个)"
+                echo "🧹 清理本地旧镜像(保留最近 3 个)"
                 sh """
-                    docker images --format "{{.Repository}}:{{.Tag}} {{.CreatedAt}}" | \
-                    grep "${HARBOR_HOST}/${env.HARBOR_PROJECT}/${PROJECT_NAME}:" | \
+                    docker images --format '{{.Repository}}:{{.Tag}} {{.CreatedAt}}' | \
+                    grep '${HARBOR_HOST}/${params.env}/${PROJECT_NAME}:' | \
                     sort -rk2 | \
                     tail -n +4 | \
                     awk '{print \$1}' | \
-                    xargs -r docker rmi
+                    xargs -r docker rmi || true
                 """
-                echo "🧹 旧镜像清理完成 ✅"
             }
         }
 
         failure {
-            echo "❌ 构建或部署失败,请检查日志"
+            echo "❌ 构建或部署失败,请检查日志"
         }
 
         always {
-            echo "🧼 清理工作区..."
+            echo "🧼 清理 Jenkins 工作目录..."
             cleanWs()
         }
     }