jenkins利用pipeline构建CI/CD-示例(二)

nodejs前端项目

Jenkins全局传参配置

pipeline配置(根据k8s的yaml进行配置)

podTemplate(label: 'jnlp-slave', cloud: 'kubernetes')
{
    node ('jnlp-slave') {
        stage('git-npm') {
            sh '''
            mkdir -p /root/.ssh
            cp -r /kubectl/.ssh/id_rsa /root/.ssh/
            chmod 0600 /root/.ssh/id_rsa
            echo "StrictHostKeyChecking no">>/etc/ssh/ssh_config
            echo "UserKnownHostsFile /dev/null" >>/etc/ssh/ssh_config
            git clone -b $branch $gitURL
            cd $PROJECT_NAME
            npm install
            npm run build
            '''
        }
        stage('docker_build') {
       withCredentials([usernamePassword(credentialsId: '074faeca-f34f-43ba-9807-b988044123c5', passwordVariable: 'PASSWORD', usernameVariable: 'USERNAME')]) {
         sh "docker login hub.kce.ksyun.com -u $USERNAME -p $PASSWORD"
        }

            sh '''
            cd $PROJECT_NAME
            tar zcvf dist.tar.gz dist
            cd kubernetes
            mv ../dist.tar.gz ./
            TAG=$(date +%y%m%d%H%M)
            docker build -t $DOCKER_IMG/${PROJECT_NAME}:$TAG -f Dockerfile .
            docker push $DOCKER_IMG/${PROJECT_NAME}:$TAG
            echo "y"| docker system prune -a
            echo "推送镜像到金山云仓库成功"

            echo "开始development"

            if [ $ENV = gaea ];then
                cp -r /kubectl/gaea/.kube /root/
                echo "is gaea"
            elif [ $ENV = prod ];then
                cp -r /kubectl/prod/.kube /root/
                echo "is prod"
            else
                cp -r /kubectl/pre/.kube /root/
                echo "is pre"
            fi

            cp /kubectl/kubectl /usr/local/bin/
            mkdir -p yaml
            cp -r /kubectl/pre/nodejs/projec.yaml ./yaml/
            cp -rf /kubectl/pre/service/service.yaml ./yaml/
            sed -i "s#IMG_NAME:IMG_TAG#${DOCKER_IMG}/${PROJECT_NAME}:$TAG#g" yaml/*
            sed -i "s#project_name#${PROJECT_NAME_PRE}#g" yaml/*
            sed -i "s#_port_#${PORT}#g" yaml/*
            number=$(kubectl get pods -n default | awk '{print $1}' | grep ${PROJECT_NAME_PRE}|wc -l)
            if [ $number != 0 ];then kubectl delete -f ./yaml && kubectl create -f ./yaml ;else kubectl create -f ./yaml ;fi
            sleep 10s
            kubectl get all -n default | grep ${PROJECT_NAME_PRE}
            '''
        }
    }
}
  • yaml模板
---
apiVersion: "extensions/v1beta1"
kind: "Deployment"
metadata:
  labels:
    ksyun-app: "project_name"
  name: "project_name"
  namespace: "default"
spec:
  minReadySeconds: 38
  progressDeadlineSeconds: 2147483647
  replicas: 2
  revisionHistoryLimit: 2147483647
  selector:
    matchLabels:
      ksyun-app: "project_name"
  strategy:
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 1
    type: "RollingUpdate"
  template:
    metadata:
      labels:
        ksyun-app: "project_name"
    spec:
      containers:
      - image: "IMG_NAME:IMG_TAG"
        imagePullPolicy: "Always"
        securityContext:
          runAsUser: 0       #设置以ROOT用户运行容器
          privileged: true
        livenessProbe:
          failureThreshold: 3
          initialDelaySeconds: 35
          periodSeconds: 20
          successThreshold: 1
          tcpSocket:
            port: _port_
          timeoutSeconds: 20
        name: "project_name"
        readinessProbe:
          failureThreshold: 3
          initialDelaySeconds: 30
          periodSeconds: 20
          successThreshold: 1
          tcpSocket:
            port: _port_
          timeoutSeconds: 20
        name: "project_name"
        resources:
          limits:
            cpu: "1"
            memory: "2Gi"
          requests:
            cpu: "1"
            memory: "2Gi"
        terminationMessagePath: "/dev/termination-log"
        terminationMessagePolicy: "File"
      dnsPolicy: "ClusterFirst"
      imagePullSecrets:
      - name: "ksyunregistrykey"
      restartPolicy: "Always"
      schedulerName: "default-scheduler"
      securityContext: {}
      terminationGracePeriodSeconds: 30
---
apiVersion: "v1"
kind: "Service"
metadata:
  annotations:
      # 配置绑定SLB
    service.beta.kubernetes.io/ksc-loadbalancer-id: "57b2321e-3adf-420f-842c-353939a691d3"
  name: "project_name"
  namespace: "default"
spec:
  externalTrafficPolicy: "Cluster"
  ports:
  - port: _port_
    protocol: "TCP"
    targetPort: _port_
  selector:
    ksyun-app: "project_name"
  sessionAffinity: "None"
  type: "LoadBalancer"
status:
  loadBalancer:
    ingress:
    # SLB的IP地址
    - ip: "172.31.252.11"

pipeline (利用kubectl set 命令直接修改镜像版本)

podTemplate(label: 'jnlp-slave', cloud: 'kubernetes')
{
    node ('jnlp-slave') {
        stage('git-npm') {
            sh '''
            mkdir -p /root/.ssh
            cp -r /kubectl/.ssh/id_rsa /root/.ssh/
            chmod 0600 /root/.ssh/id_rsa
            echo "StrictHostKeyChecking no">>/etc/ssh/ssh_config
            echo "UserKnownHostsFile /dev/null" >>/etc/ssh/ssh_config
            git clone -b $branch $gitURL
            cd $PROJECT_NAME
            npm install
            npm run build
            '''
        }
        stage('docker_build') {
       withCredentials([usernamePassword(credentialsId: '074faeca-f34f-43ba-9807-b988044123c5', passwordVariable: 'PASSWORD', usernameVariable: 'USERNAME')]) {
         sh "docker login hub.kce.ksyun.com -u $USERNAME -p $PASSWORD"
        }

            sh '''
            cd $PROJECT_NAME
            tar zcvf dist.tar.gz dist
            cd kubernetes
            mv ../dist.tar.gz ./
            TAG=$(date +%y%m%d%H%M)
            docker build -t $DOCKER_IMG/${PROJECT_NAME}:$TAG -f Dockerfile .
            docker push $DOCKER_IMG/${PROJECT_NAME}:$TAG
            echo "y"| docker system prune -a
            echo "推送镜像到金山云仓库成功"

            echo "开始development"

            if [ $ENV = gaea ];then
                cp -r /kubectl/gaea/.kube /root/
                echo "is gaea"
            elif [ $ENV = prod ];then
                cp -r /kubectl/prod/.kube /root/
                echo "is prod"
            else
                cp -r /kubectl/pre/.kube /root/
                echo "is pre"
            fi

            cp /kubectl/kubectl /usr/local/bin/
            kubectl set image deployment/${PROJECT_NAME_PRE} -n default ${PROJECT_NAME_PRE}=${DOCKER_IMG}/${PROJECT_NAME}:$TAG
            sleep 10s
            kubectl get all -n default | grep ${PROJECT_NAME_PRE}
            '''
        }
    }
}

Java 后端

Jenkins全局传参配置

pipeline(根据k8s的yaml进行配置)

podTemplate(label: 'jnlp-slave', cloud: 'kubernetes')
{
    node ('jnlp-slave') {
        stage('git-maven') {
            sh '''
            export MAVEN_HOME=/maven
            export PATH=$MAVEN_HOME/bin:$PATH
            '''
            checkout([$class: 'GitSCM', branches: [[name: '*/$branch']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: 'e0574254-769a-46c7-a7d3-10dcb90c8d2b', url: 'http://newgit.op.ksyun.com/reorg-aihouse/aiot-uaa-resources.git']]])
            sh '''
            /maven/bin/mvn clean install -Dmaven.test.skip=true
            ls *
            '''
        }
        stage('docker_build') {
       withCredentials([usernamePassword(credentialsId: '074faeca-f34f-43ba-9807-b988044123c5', passwordVariable: 'PASSWORD', usernameVariable: 'USERNAME')]) {
         sh "docker login hub.kce.ksyun.com -u $USERNAME -p $PASSWORD"
        }

            sh '''
            PROJECT_NAME="aiot-uaa-resources"
            PORT="8802"
            DOCKER_IMG="hub.kce.ksyun.com/aihouse"


            cd kubernetes
            mv ../aiot-uaa-resources-api/target/aiot-uaa-resources-api-0.0.1-SNAPSHOT.jar ./
            TAG=$(date +%y%m%d%H%M)
            docker build -t ${PROJECT_NAME}:$TAG .
            docker tag ${PROJECT_NAME}:$TAG $DOCKER_IMG/${PROJECT_NAME}:$TAG
            docker push $DOCKER_IMG/${PROJECT_NAME}:$TAG
            echo "y"| docker system prune -a
            echo "推送镜像到金山云仓库成功"

            echo "开始development"

            if [ $ENV = gaea ];then
                cp -r /kubectl/gaea/.kube /root/
                echo "is gaea"
            elif [ $ENV = prod ];then
                cp -r /kubectl/prod/.kube /root/
                echo "is prod"
            else
                cp -r /kubectl/pre/.kube /root/
                echo "is pre"
            fi

            cp /kubectl/kubectl /usr/local/bin/
            cp -r /kubectl/yaml ./
            sed -i "s#IMG_NAME:IMG_TAG#${DOCKER_IMG}/${PROJECT_NAME}:$TAG#g" yaml/*
            sed -i "s#project_name#${PROJECT_NAME}#g" yaml/*
            sed -i "s#_port_#${PORT}#g" yaml/*
            sed -i "s#ENV#$ENV#g" yaml/*
            number=$(kubectl get pods -n default | awk '{print $1}' | grep ${PROJECT_NAME}|wc -l)
            if [ $number != 0 ];then kubectl delete -f ./yaml && kubectl create -f ./yaml ;else kubectl create -f ./yaml ;fi
            sleep 60s
            kubectl get all -n default | grep ${PROJECT_NAME}
            '''
        }
    }
}

yaml配置模板

---
apiVersion: "extensions/v1beta1"
kind: "Deployment"
metadata:
  labels:
    ksyun-app: "project_name"
  name: "project_name"
  namespace: "default"
spec:
  minReadySeconds: 38
  progressDeadlineSeconds: 2147483647
  replicas: 2
  revisionHistoryLimit: 2147483647
  selector:
    matchLabels:
      ksyun-app: "project_name"
  strategy:
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 1
    type: "RollingUpdate"
  template:
    metadata:
      labels:
        ksyun-app: "project_name"
    spec:
      containers:
      - args:
        - "start.sh"
        command:
        - "sh"
        env:
        - name: "profiles"
          value: "ENV"
        image: "IMG_NAME:IMG_TAG"
        imagePullPolicy: "Always"
        securityContext:
          runAsUser: 0       #设置以ROOT用户运行容器
          privileged: true
        livenessProbe:
          failureThreshold: 3
          initialDelaySeconds: 35
          periodSeconds: 20
          successThreshold: 1
          tcpSocket:
            port: _port_
          timeoutSeconds: 20
        name: "project_name"
        readinessProbe:
          failureThreshold: 3
          initialDelaySeconds: 30
          periodSeconds: 20
          successThreshold: 1
          tcpSocket:
            port: _port_
          timeoutSeconds: 20
        name: "project_name"
        resources:
          limits:
            cpu: "1"
            memory: "2Gi"
          requests:
            cpu: "1"
            memory: "2Gi"
        terminationMessagePath: "/dev/termination-log"
        terminationMessagePolicy: "File"
      dnsPolicy: "ClusterFirst"
      imagePullSecrets:
      - name: "ksyunregistrykey"
      restartPolicy: "Always"
      schedulerName: "default-scheduler"
      securityContext: {}
      terminationGracePeriodSeconds: 30
---
apiVersion: "v1"
kind: "Service"
metadata:
  name: "project_name"
  namespace: "default"
spec:
  ports:
  - port: _port_
    protocol: "TCP"
    targetPort: _port_
  selector:
    ksyun-app: "project_name"
  sessionAffinity: "None"
  type: "ClusterIP"
status:
  loadBalancer: {}

pipeline(根据k8s的kubectl进行配置)

podTemplate(label: 'jnlp-slave', cloud: 'kubernetes')
{
    node ('jnlp-slave') {
        stage('git-maven') {
            sh '''
            export MAVEN_HOME=/maven
            export PATH=$MAVEN_HOME/bin:$PATH
            '''
            sh '''
            mkdir -p /root/.ssh
            cp -r /kubectl/.ssh/id_rsa /root/.ssh/
            chmod 0600 /root/.ssh/id_rsa
            git clone -b $branch $gitURL
            cd $PROJECT_NAME
            /maven/bin/mvn clean install -Dmaven.test.skip=true
            ls *
            '''
        }
        stage('docker_build') {
       withCredentials([usernamePassword(credentialsId: '074faeca-f34f-43ba-9807-b988044123c5', passwordVariable: 'PASSWORD', usernameVariable: 'USERNAME')]) {
         sh "docker login hub.kce.ksyun.com -u $USERNAME -p $PASSWORD"
        }

            sh '''

            cd $PROJECT_NAME
            cd kubernetes
            mv ../target/aiot-gateway-0.0.1-SNAPSHOT.jar ./
            TAG=$(date +%y%m%d%H%M)
            docker build -t $DOCKER_IMG/${PROJECT_NAME}:$TAG .
            docker push $DOCKER_IMG/${PROJECT_NAME}:$TAG
            echo "y"| docker system prune -a
            echo "推送镜像到金山云仓库成功"

            echo "开始development"

            if [ $ENV = gaea ];then
                cp -r /kubectl/gaea/.kube /root/
                echo "is gaea"
            elif [ $ENV = prod ];then
                cp -r /kubectl/prod/.kube /root/
                echo "is prod"
            else
                cp -r /kubectl/pre/.kube /root/
                echo "is pre"
            fi

            cp /kubectl/kubectl /usr/local/bin/
            kubectl set image deployment/${PROJECT_NAME_PRE} -n default ${PROJECT_NAME_PRE}=${DOCKER_IMG}/${PROJECT_NAME}:$TAG
            sleep 30s
            kubectl get all -n default | grep ${PROJECT_NAME}
            '''
        }
    }
}


   转载规则


《jenkins利用pipeline构建CI/CD-示例(二)》 helen 采用 知识共享署名 4.0 国际许可协议 进行许可。
  目录