Jenkinsfile 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. pipeline {
  2. agent any
  3. environment {
  4. REGISTRY = "harbor.xxx.com"
  5. IMAGE_NAME = "portal-service-frontend"
  6. IMAGE_TAG = "latest"
  7. NAMESPACE = "portal-frontends"
  8. INGRESS_NAME = "portal-service-frontend"
  9. INGRESS_HOST = "radar-power.asia"
  10. TLS_SECRET = "portal-tls"
  11. }
  12. stages {
  13. stage('Build Image') {
  14. steps {
  15. script {
  16. sh """
  17. docker build -t ${REGISTRY}/${NAMESPACE}/${IMAGE_NAME}:${IMAGE_TAG} .
  18. docker login ${REGISTRY} -u harbor-username -p harbor-password
  19. docker push ${REGISTRY}/${NAMESPACE}/${IMAGE_NAME}:${IMAGE_TAG}
  20. """
  21. }
  22. }
  23. }
  24. stage('Deploy to Kubernetes') {
  25. steps {
  26. script {
  27. sh """
  28. kubectl create namespace ${NAMESPACE} --dry-run=client -o yaml | kubectl apply -f -
  29. # 创建 Deployment
  30. cat <<EOF | kubectl apply -f -
  31. apiVersion: apps/v1
  32. kind: Deployment
  33. metadata:
  34. name: ${IMAGE_NAME}
  35. namespace: ${NAMESPACE}
  36. spec:
  37. replicas: 2
  38. selector:
  39. matchLabels:
  40. app: ${IMAGE_NAME}
  41. template:
  42. metadata:
  43. labels:
  44. app: ${IMAGE_NAME}
  45. spec:
  46. containers:
  47. - name: ${IMAGE_NAME}
  48. image: ${REGISTRY}/${NAMESPACE}/${IMAGE_NAME}:${IMAGE_TAG}
  49. ports:
  50. - containerPort: 80
  51. EOF
  52. # 创建 Service
  53. cat <<EOF | kubectl apply -f -
  54. apiVersion: v1
  55. kind: Service
  56. metadata:
  57. name: ${IMAGE_NAME}
  58. namespace: ${NAMESPACE}
  59. spec:
  60. selector:
  61. app: ${IMAGE_NAME}
  62. ports:
  63. - port: 80
  64. targetPort: 80
  65. type: ClusterIP
  66. EOF
  67. # 创建 Ingress
  68. cat <<EOF | kubectl apply -f -
  69. apiVersion: networking.k8s.io/v1
  70. kind: Ingress
  71. metadata:
  72. name: ${INGRESS_NAME}
  73. namespace: ${NAMESPACE}
  74. annotations:
  75. nginx.ingress.kubernetes.io/rewrite-target: /
  76. spec:
  77. ingressClassName: nginx
  78. rules:
  79. - host: ${INGRESS_HOST}
  80. http:
  81. paths:
  82. - path: /
  83. pathType: Prefix
  84. backend:
  85. service:
  86. name: ${IMAGE_NAME}
  87. port:
  88. number: 80
  89. tls:
  90. - hosts:
  91. - ${INGRESS_HOST}
  92. secretName: ${TLS_SECRET}
  93. EOF
  94. """
  95. }
  96. }
  97. }
  98. stage('Fix Ingress Controller Service') {
  99. steps {
  100. script {
  101. echo "检查 ingress-nginx-controller Service 是否是 NodePort..."
  102. def svcType = sh(script: "kubectl get svc ingress-nginx-controller -n ingress-nginx -o jsonpath='{.spec.type}'", returnStdout: true).trim()
  103. if (svcType != "NodePort") {
  104. echo "修改 ingress-nginx-controller Service 类型为 NodePort..."
  105. sh """
  106. kubectl patch svc ingress-nginx-controller -n ingress-nginx -p '{"spec": {"type": "NodePort"}}'
  107. """
  108. } else {
  109. echo "ingress-nginx-controller 已经是 NodePort,无需修改"
  110. }
  111. sh "kubectl get svc ingress-nginx-controller -n ingress-nginx -o wide"
  112. }
  113. }
  114. }
  115. }
  116. }