Kubernetes DevOps: Jenkins Pipeline (流水线)

作者: Ju4t

Jenkinsfile

pipeline {
    agent none
    stages {
        stage('Clone Code') {
            agent {
                label 'master'
            }
            steps {
                echo "1.Git Clone Code"
                git url: "https://code.aliyun.com/Ju4t/helloword-springboot.git"
            }
        }
        stage('Maven Build') {
            agent {
                docker {
                    image 'maven:3-alpine'
                    args '-v /Users/ju4t/.m2:/root/.m2'
                }
            }
            steps {
                echo "2.Maven Build Stage"
                sh 'mvn -B clean package -Dmaven.test.skip=true'
            }
        }
        stage('Image Build') {
            agent {
                label 'master'
            }
            steps {
            echo "3.Image Build Stage"
            sh 'docker build -f Dockerfile --build-arg jar_name=target/web-0.0.1-SNAPSHOT.jar -t devops-web:${BUILD_ID} . '
            sh 'docker tag devops-web:${BUILD_ID} registry.cn-beijing.aliyuncs.com/ju4t/devops-web:${BUILD_ID}'
            }
        }
        stage('Push') {
            agent {
                label 'master'
            }
            steps {
            echo "4.Push Docker Image Stage"
            sh "docker login --username=jingxiaobing registry.cn-beijing.aliyuncs.com -p 密码"
            sh "docker push registry.cn-beijing.aliyuncs.com/ju4t/devops-web:${BUILD_ID}"
            }
        }
    }
}

node('jenkins-slave') {
    container('jnlp-kubectl') {
        stage('Clone YAML') {
        echo "5. Git Clone YAML To Slave"
        git url: "https://code.aliyun.com/Ju4ts/devops-springboot.git"
        }

        stage('YAML') {
        echo "6. Change YAML File Stage"
        sh 'sed -i "s#{VERSION}#${BUILD_ID}#g" ./jenkins/scripts/spring-api.yaml'
        }

        stage('Deploy') {
        echo "7. Deploy To K8s Stage"
        sh 'kubectl apply -f ./jenkins/scripts/spring-api.yaml'
        }
    }
}

spring-api.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: spring-api-dp
spec:
  replicas: 2
  selector:
    matchLabels:
      app: spring-api
  template:
    metadata:
      labels:
        app: spring-api
    spec:
      containers:
      - name: spring-api
        image: registry.cn-beijing.aliyuncs.com/ju4t/devops-web:{VERSION}
        ports:
        - name: http
          containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
  name: spring-api-svc
spec:
  selector:
    app: spring-api
  ports:
  - name: http
    targetPort: 8080
    port: 8080
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: spring-api-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
  rules:
  - http:
      paths:
        - path: /
          pathType: Prefix
          backend:
            service:
                name: spring-api-svc
                port:
                  number: 8080
        # - path: /abc
        #   pathType: Prefix
        #   backend:
        #     service:
        #         name: abc-svc
        #         port:
        #           number: 8080