1. 程式人生 > >5分鐘在阿里雲Kubernetes服務上搭建jenkins環境並完成應用構建到部署的流水線作業

5分鐘在阿里雲Kubernetes服務上搭建jenkins環境並完成應用構建到部署的流水線作業

本文主要演示如何在阿里雲Kubernetes服務上快速搭建jenkins持續整合環境,並基於提供的示例應用快速完成應用原始碼編譯、映象構建和推送以及應用部署的流水線。

先決條件:
阿里雲Kubernetes叢集。

一 快速開始

1. 部署jenkins

容器服務-Kubernetes -> 市場 -> 應用目錄 -> jenkins:

image

點選 引數 選單修改 AdminPassword 欄位, 選擇Kubernetes叢集、填寫名稱空間釋出名稱並點選 建立
ps:如未設定登陸密碼,則可在部署完畢後使用如下命名檢視:

$ printf $(kubectl get secret --namespace ci jenkins-ci-jenkins -o jsonpath="{.data.jenkins-admin-password}" | base64 --decode);echo

image

訪問jenkins服務並登陸:
image

image

2. 建立叢集證書、映象倉庫證書並構建和部署示例應用

(1)建立k8s叢集證書:
系統管理 -> 系統設定 -> Cloud -> Kubernetes.Credentials:
image
點選新增證書:
image
測試連通性:
image

(2)建立jenkins-docker-cfg secret用於映象倉庫許可權設定
本示例中使用了阿里雲映象服務提供的北京區域映象倉庫:

$ 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

(3)構建demo-pipeline並訪問應用服務
根據自己映象倉庫資訊修改構建引數, 本示例中原始碼倉庫分支為master,映象為registry.cn-beijing.aliyuncs.com/haoshuwei:stable

image

image

完成。

二 構建環境與示例專案說明

1. 構建環境配置說明

(1)kubernetes叢集動態分配構建pod的配置;
image

(2)slave-pipeline 使用了4個container分別完成流水線中各個stage的構建,Kubernetes Pod Templates配置

container jnlp:
image
container kaniko:
image
container kubectl

:
image
container maven:
image

(3) 使用到的構建映象:

  • jenkins-slave-jnlp 用於構建節點jnlp連線master:

    registry.cn-beijing.aliyuncs.com/acs-sample/jenkins-slave-jnlp:3.14-1
  • jenkins-slave-maven 用於mvn打包構建:

     registry.cn-beijing.aliyuncs.com/acs-sample/jenkins-slave-maven:3.3.9-jdk-8-alpine
  • jenkins-slave-kaniko 用於映象構建和推送:

    registry.cn-beijing.aliyuncs.com/acs-sample/jenkins-slave-kaniko:0.6.0
  • jenkins-slave-kubectl 用於kubectl部署應用:

    registry.cn-beijing.aliyuncs.com/acs-sample/jenkins-slave-kubectl:1.11.5

    (4) kaniko配置映象倉庫許可權:

image

2. 示例專案說明

(1)示例專案中使用的原始碼倉庫

https://github.com/AliyunContainerService/jenkins-demo.git

(2)kaniko 構建和推送docker映象說明

kaniko可以不依賴docker daemon並在使用者空間執行完成Dockerfile中的每一行命令,最終完成docker映象的構建和推送。

kaniko -f `pwd`/Dockerfile -c `pwd` --destination=${origin_repo}/${repo}:${image_tag}

(3)部署應用到Kubernetes叢集外掛說明

外掛配置如下:
image

對應的Pipeline語法為:

step([$class: 'KubernetesDeploy', authMethod: 'certs', apiServerUrl: 'https://kubernetes.default.svc.cluster.local:443', credentialsId:'k8sCertAuth', config: 'deployment.yaml',variableState: 'ORIGIN_REPO,REPO,IMAGE_TAG'])

宣告的變數ORIGIN_REPO,REPO,IMAGE_TAG可在構建執行時把deployment.yaml檔案中對應的變數值替換為實際值:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: jenkins-java-demo
spec:
  replicas: 2
  selector:
    matchLabels:
      app: jenkins-java-demo
  template:
    metadata:
      labels:
        app: jenkins-java-demo
    spec:
      containers:
      - name: jenkins-java-demo
        image: ${ORIGIN_REPO}/${REPO}:${IMAGE_TAG}
        imagePullPolicy: Always
        ports:
        - containerPort: 8080

---
apiVersion: v1
kind: Service
metadata:
  name: jenkins-java-demo
spec:
  ports:
  - port: 80
    targetPort: 8080
    name: jenkins-java-demo
  selector:
    app: jenkins-java-demo
  type: LoadBalancer

(4)Jenkinsfile說明

pipeline{
      // 定義groovy指令碼中使用的環境變數
      environment{
        // 本示例中使用DEPLOY_TO_K8S變數來決定把應用部署到哪套容器叢集環境中,如“Production Environment”, “Staging001 Environment”等
        IMAGE_TAG =  sh(returnStdout: true,script: 'echo $image_tag').trim()
        ORIGIN_REPO =  sh(returnStdout: true,script: 'echo $origin_repo').trim()
        REPO =  sh(returnStdout: true,script: 'echo $repo').trim()
        BRANCH =  sh(returnStdout: true,script: 'echo $branch').trim()
      }

      // 定義本次構建使用哪個標籤的構建環境,本示例中為 “slave-pipeline”
      agent{
        node{
          label 'slave-pipeline'
        }
      }

      // "stages"定義專案構建的多個模組,可以新增多個 “stage”, 可以多個 “stage” 序列或者並行執行
      stages{
        // 定義第一個stage, 完成克隆原始碼的任務
        stage('Git'){
          steps{
            git branch: '${BRANCH}', credentialsId: '', url: 'https://github.com/AliyunContainerService/jenkins-demo.git'
          }
        }

        // 新增第二個stage, 執行原始碼打包命令
        stage('Package'){
          steps{
              container("maven") {
                  sh "mvn package -B -DskipTests"
              }
          }
        }


        // 新增第四個stage, 執行容器映象構建和推送命令, 用到了environment中定義的groovy環境變數
        stage('Image Build And Publish'){
          steps{
              container("kaniko") {
                  sh "kaniko -f `pwd`/Dockerfile -c `pwd` --destination=${ORIGIN_REPO}/${REPO}:${IMAGE_TAG}"
              }
          }
        }


        stage('Deploy to Kubernetes') {
            parallel {
                stage('Deploy to Production Environment') {
                    when {
                        expression {
                            "$BRANCH" == "master"
                        }
                    }
                    steps {
                        container('kubectl') {
                            step([$class: 'KubernetesDeploy', authMethod: 'certs', apiServerUrl: 'https://kubernetes.default.svc.cluster.local:443', credentialsId:'k8sCertAuth', config: 'deployment.yaml',variableState: 'ORIGIN_REPO,REPO,IMAGE_TAG'])
                        }
                    }
                }
                stage('Deploy to Staging001 Environment') {
                    when {
                        expression {
                            "$BRANCH" == "latest"
                        }
                    }
                    steps {
                        container('kubectl') {
                            step([$class: 'KubernetesDeploy', authMethod: 'certs', apiServerUrl: 'https://kubernetes.default.svc.cluster.local:443', credentialsId:'k8sCertAuth', config: 'deployment.yaml',variableState: 'ORIGIN_REPO,REPO,IMAGE_TAG'])
                        }
                    }
                }
            }
        }
      }
    }

瞭解更多阿里雲容器服務內容,請訪問 https://www.aliyun.com/product/containerservice
瞭解更多kaniko內容請參考:
https://github.com/GoogleContainerTools/kaniko