Переглянути джерело

ci(Jenkinsfile): 更新部署配置并添加Ingress支持

liujia 2 місяців тому
батько
коміт
219f0da668
1 змінених файлів з 94 додано та 10 видалено
  1. 94 10
      Jenkinsfile

+ 94 - 10
Jenkinsfile

@@ -4,16 +4,19 @@ pipeline {
     parameters {
         choice(name: 'env', choices: ['dev', 'test', 'prod'], description: '部署环境')
         string(name: 'NAMESPACE', defaultValue: 'hfln-dev', description: 'K8s 命名空间')
+        string(name: 'DOMAIN', defaultValue: '', description: 'Ingress 域名(留空则不创建 Ingress)')
     }
 
     environment {
-        PROJECT_NAME    = 'new-portal-frontend'
-        BUILD_DIR       = 'dist'
-        NODE_ENV        = 'production'
-        HARBOR_HOST     = '8.130.28.21:81'
-        KUBECONFIG_PATH = '/root/.kube/config'
-        HARBOR_USER     = 'admin'
-        HARBOR_PASS     = 'Hfln@1024'
+        PROJECT_NAME       = 'portal-service-frontend'
+        BUILD_DIR          = 'dist'
+        NODE_ENV           = 'production'
+        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_PASS        = 'Hfln@1024'
         HARBOR_RETENTION_ID = '1'
     }
 
@@ -59,14 +62,95 @@ pipeline {
             }
         }
 
+        stage('🔍 测试节点能否拉取镜像') {
+            steps {
+                script {
+                    echo ">>> 测试节点能否拉取镜像..."
+                    sh """
+                        ssh root@${NODE1_IP} docker login -u ${HARBOR_USER} -p ${HARBOR_PASS} ${HARBOR_HOST} && docker pull ${IMAGE_TAG} || echo '[❌ 节点 node1 拉取失败]'
+                        ssh root@${NODE2_IP} docker login -u ${HARBOR_USER} -p ${HARBOR_PASS} ${HARBOR_HOST} && docker pull ${IMAGE_TAG} || echo '[❌ 节点 node2 拉取失败]'
+                    """
+                }
+            }
+        }
+
         stage('📦 Kubernetes 部署') {
             steps {
                 script {
+                    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 ">>> 开始部署至 Kubernetes 命名空间:${params.NAMESPACE}"
+
                     sh """
                         export KUBECONFIG=${KUBECONFIG_PATH}
-                        kubectl -n ${params.NAMESPACE} set image deployment/${PROJECT_NAME} ${PROJECT_NAME}=${IMAGE_TAG}
+                        kubectl get ns ${params.NAMESPACE} || kubectl create ns ${params.NAMESPACE}
+
+                        kubectl apply -n ${params.NAMESPACE} -f - <<EOF
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+  name: ${PROJECT_NAME}
+spec:
+  replicas: 2
+  selector:
+    matchLabels:
+      app: ${PROJECT_NAME}
+  template:
+    metadata:
+      labels:
+        app: ${PROJECT_NAME}
+    spec:
+      containers:
+      - name: ${PROJECT_NAME}
+        image: ${IMAGE_TAG}
+        ports:
+        - containerPort: 80
+        env:
+        - name: NODE_ENV
+          value: "${params.env}"
+---
+apiVersion: v1
+kind: Service
+metadata:
+  name: ${PROJECT_NAME}
+spec:
+  type: NodePort
+  selector:
+    app: ${PROJECT_NAME}
+  ports:
+  - port: 80
+    targetPort: 80
+    nodePort: 30088
+${ingressBlock}
+EOF
                     """
-                    echo "✅ 已更新部署镜像至 K8s"
+
+                    if (domain) {
+                        echo ">>> ✅ 部署完成,访问地址:http://${domain}/"
+                    } else {
+                        echo ">>> ✅ 部署完成,访问地址:http://${NODE1_IP}:30088/"
+                    }
                 }
             }
         }
@@ -122,4 +206,4 @@ pipeline {
             cleanWs()
         }
     }
-}
+}