天天看點

Jenkins on ACK實戰(二):這是一條簡單的流水線

上一篇結束的時候,我們已經部署了一套Jenkins環境,今天我們就在這套環境裡來建立一條簡單的流水線來做應用的建構并釋出到這個叢集

開始之前

  • 在叢集中建立用到的registry的通路密鑰,這裡我們使用阿裡雲容器鏡像服務的北京區域
    $ docker login -u xxx -p xxx registry.cn-beijing.aliyuncs.com
    Login Succeeded
    
    $ kubectl create secret generic jenkins-docker-cfg -n ci --from-file=/root/.docker/config.json           
    > 注意:如果是在Mac上操作,需要先把~/.docker/config.json裡的`credsStore`參數項删除再去login
               
  • 建立流水線部署的目标環境,這裡我們選擇部署到這個叢集的pro namespace,對于正式環境,請選擇不同的叢集
    $ kubectl create ns pro           
  • 在jenkins中建立通路目标叢集的密鑰
    $ kubectl -n kube-system get serviceaccount admin -o go-template --template='{{range .secrets}}{{.name}}{{"\n"}}{{end}}'
    ${admin-token-6xbcz}
    
    $ kubectl -n kube-system get secrets ${admin-token-6xbcz} -o go-template --template '{{index .data "token"}}' | base64 -D
    eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2V[...]           
  • 将擷取到的token儲存在Jenkins裡
    Jenkins on ACK實戰(二):這是一條簡單的流水線

配置流水線

  • 建立流水線項目
    Jenkins on ACK實戰(二):這是一條簡單的流水線
  • 配置pipeline邏輯,将下面一段pipeline代碼寫入項目的

    Pipeline script

    Jenkins on ACK實戰(二):這是一條簡單的流水線
    pipeline {
        agent {
            kubernetes {
                label 'jenkins-pod'
                defaultContainer 'jnlp'
                yaml """
                apiVersion: v1
                kind: Pod
                metadata:
                  labels:
                    app: jenkins-slave-pod
                spec:
                  containers:
                  - name: golang
                    image: golang:1.12
                    command:
                    - cat
                    tty: true
                  - name: kaniko
                    image: registry.cn-beijing.aliyuncs.com/acs-sample/jenkins-slave-kaniko:0.6.0
                    command:
                    - cat
                    tty: true
                    volumeMounts:
                    - name: ymian
                      mountPath: /root/.docker
                  - name: kubectl
                    image: roffe/kubectl:v1.13.2
                    command:
                    - cat
                    tty: true
                  - name: busybox
                    image: ymian/busybox
                    command:
                    - cat
                    tty: true
                  volumes:
                  - name: ymian
                    secret:
                      secretName: jenkins-docker-cfg
                      items:
                      - key: config.json
                        path: config.json
                """
            }
        }
    
        stages {
            stage('Build') {
                steps {
                    container('golang') {
                        git url: 'https://github.com/HYmian/gin-sample.git'
                        sh """
                        go build -mod vendor -v
                        """
                    }
                }
            }
    
            stage('Image Build And Publish') {
                steps {
                    container("kaniko") {
                        sh "kaniko -f `pwd`/Dockerfile -c `pwd` -d registry.cn-beijing.aliyuncs.com/${your_repo}/gin-sample"
                    }
                }
            }
    
            stage('Deploy to pro') {
                steps {
                    container("kubectl") {
                        withKubeConfig(
                            [
                                credentialsId: 'pro-env',
                                serverUrl: 'https://kubernetes.default.svc.cluster.local'
                            ]
                        ) {
                            sh '''
                            kubectl apply -f `pwd`/deploy.yaml -n pro
                            kubectl wait --for=condition=Ready pod -l app=gin-sample --timeout=60s -n pro
                            '''
                        }
                    }
                }
            }
        }
    }           
    • 我們這裡為了示範友善,直接在Jenkins裡寫pipeline的邏輯,但是在正式使用時,應該将pipeline儲存為單獨的檔案并和項目的代碼放在同一個倉庫裡
    • 注意将代碼裡的${your_repo}替換成自己的倉庫名稱
  • 驗證流水線,手動觸發,成功後可以在

    blue ocean

    中看到結果
    Jenkins on ACK實戰(二):這是一條簡單的流水線

小結

本文配置了一條包含建構、打包、部署三個stage的簡單流水線,pipeline是Jenkins 2.0開始引入的概念,關于pipeline的優勢可以參考官方給出的

說明

可能在上面一節裡,關于agent這一段的定義會讓大家更迷惑一點,在下一篇文章裡,我們會着重給大家介紹這一部分

繼續閱讀