av激情亚洲男人的天堂国语,日韩欧美精品一中文字幕,无码av一区二区三区无码,国产又色又爽又刺激的a片,国产又色又爽又刺激的a片

使用Tekton重構(gòu)自動(dòng)化流水線

使用 Tekton 重構(gòu)自動(dòng)化流水線

作者:陽明 2021-06-28 06:32:46

云計(jì)算

自動(dòng)化 在 Tekton 中我們就可以將這些階段直接轉(zhuǎn)換成 Task 任務(wù),clone 代碼在 Tekton 中不需要我們主動(dòng)定義一個(gè)任務(wù),只需要在執(zhí)行的任務(wù)上面指定一個(gè)輸入的代碼資源即可

前面我們講解了使用 Jenkins 流水線來實(shí)現(xiàn) Kubernetes 應(yīng)用的 CI/CD,現(xiàn)在我們來將這個(gè)流水線遷移到 Tekton 上面來,其實(shí)整體思路都是一樣的,就是把要整個(gè)工作流劃分成不同的任務(wù)來執(zhí)行,前面工作流的階段劃分了以下幾個(gè)階段:Clone 代碼 -> 單元測(cè)試 -> Golang 編譯打包 -> Docker 鏡像構(gòu)建/推送 -> Kubectl 部署服務(wù)。

在 Tekton 中我們就可以將這些階段直接轉(zhuǎn)換成 Task 任務(wù),Clone 代碼在 Tekton 中不需要我們主動(dòng)定義一個(gè)任務(wù),只需要在執(zhí)行的任務(wù)上面指定一個(gè)輸入的代碼資源即可。下面我們就來將上面的工作流一步一步來轉(zhuǎn)換成 Tekton 流水線,代碼倉庫同樣還是 http://git.k8s.local/course/devops-demo.git。

Clone 代碼

雖然我們可以不用單獨(dú)定義一個(gè) Clone 代碼的任務(wù),直接使用 git 類型的輸入資源即可,由于這里涉及到的任務(wù)較多,而且很多時(shí)候都需要先 Clone 代碼然后再進(jìn)行操作,所以最好的方式是將代碼 Clone 下來過后通過 Workspace 共享給其他任務(wù),這里我們可以直接使用 Catalog git-clone 來實(shí)現(xiàn)這個(gè)任務(wù),我們可以根據(jù)自己的需求做一些定制,對(duì)應(yīng)的 Task 如下所示:

  
 
 
 
  1. # task-clone.yaml 
  2. apiVersion: tekton.dev/v1beta1 
  3. kind: Task 
  4. metadata: 
  5.   name: git-clone 
  6. spec: 
  7.   workspaces: 
  8.     - name: output 
  9.       description: The git repo will be cloned onto the volume backing this Workspace. 
  10.     - name: basic-auth 
  11.       optional: true 
  12.       description: | 
  13.         A Workspace containing a .gitconfig and .git-credentials file. These 
  14.         will be copied to the user's home before any git commands are run. Any 
  15.         other files in this Workspace are ignored. It is strongly recommended 
  16.         to use ssh-directory over basic-auth whenever possible and to bind a 
  17.         Secret to this Workspace over other volume types. 
  18.   params: 
  19.     - name: url 
  20.       description: Repository URL to clone from. 
  21.       type: string 
  22.     - name: revision 
  23.       description: Revision to checkout. (branch, tag, sha, ref, etc...) 
  24.       type: string 
  25.       default: "" 
  26.     - name: refspec 
  27.       description: Refspec to fetch before checking out revision. 
  28.       default: "" 
  29.     - name: submodules 
  30.       description: Initialize and fetch git submodules. 
  31.       type: string 
  32.       default: "true" 
  33.     - name: depth 
  34.       description: Perform a shallow clone, fetching only the most recent N commits. 
  35.       type: string 
  36.       default: "1" 
  37.     - name: sslVerify 
  38.       description: Set the `http.sslVerify` global git config. Setting this to `false` is not advised unless you are sure that you trust your git remote. 
  39.       type: string 
  40.       default: "true" 
  41.     - name: subdirectory 
  42.       description: Subdirectory inside the `output` Workspace to clone the repo into. 
  43.       type: string 
  44.       default: "" 
  45.     - name: sparseCheckoutDirectories 
  46.       description: Define the directory patterns to match or exclude when performing a sparse checkout. 
  47.       type: string 
  48.       default: "" 
  49.     - name: deleteExisting 
  50.       description: Clean out the contents of the destination directory if it already exists before cloning. 
  51.       type: string 
  52.       default: "true" 
  53.     - name: verbose 
  54.       description: Log the commands that are executed during `git-clone`'s operation. 
  55.       type: string 
  56.       default: "true" 
  57.     - name: gitInitImage 
  58.       description: The image providing the git-init binary that this Task runs. 
  59.       type: string 
  60.       default: "cnych/tekton-git-init:v0.24.1" 
  61.     - name: userHome 
  62.       description: | 
  63.         Absolute path to the user's home directory. Set this explicitly if you are running the image as a non-root user or have overridden 
  64.         the gitInitImage param with an image containing custom user configuration. 
  65.       type: string 
  66.       default: "/root" 
  67.   results: 
  68.     - name: commit 
  69.       description: The precise commit SHA that was fetched by this Task. 
  70.     - name: url 
  71.       description: The precise URL that was fetched by this Task. 
  72.   steps: 
  73.     - name: clone 
  74.       image: "$(params.gitInitImage)" 
  75.       env: 
  76.       - name: HOME 
  77.         value: "$(params.userHome)" 
  78.       - name: PARAM_URL 
  79.         value: $(params.url) 
  80.       - name: PARAM_REVISION 
  81.         value: $(params.revision) 
  82.       - name: PARAM_REFSPEC 
  83.         value: $(params.refspec) 
  84.       - name: PARAM_SUBMODULES 
  85.         value: $(params.submodules) 
  86.       - name: PARAM_DEPTH 
  87.         value: $(params.depth) 
  88.       - name: PARAM_SSL_VERIFY 
  89.         value: $(params.sslVerify) 
  90.       - name: PARAM_SUBDIRECTORY 
  91.         value: $(params.subdirectory) 
  92.       - name: PARAM_DELETE_EXISTING 
  93.         value: $(params.deleteExisting) 
  94.       - name: PARAM_VERBOSE 
  95.         value: $(params.verbose) 
  96.       - name: PARAM_SPARSE_CHECKOUT_DIRECTORIES 
  97.         value: $(params.sparseCheckoutDirectories) 
  98.       - name: PARAM_USER_HOME 
  99.         value: $(params.userHome) 
  100.       - name: WORKSPACE_OUTPUT_PATH 
  101.         value: $(workspaces.output.path) 
  102.       - name: WORKSPACE_BASIC_AUTH_DIRECTORY_BOUND 
  103.         value: $(workspaces.basic-auth.bound) 
  104.       - name: WORKSPACE_BASIC_AUTH_DIRECTORY_PATH 
  105.         value: $(workspaces.basic-auth.path) 
  106.       script: | 
  107.         #!/usr/bin/env sh 
  108.         set -eu 
  109.  
  110.         if [ "${PARAM_VERBOSE}" = "true" ] ; then 
  111.           set -x 
  112.         fi 
  113.  
  114.         if [ "${WORKSPACE_BASIC_AUTH_DIRECTORY_BOUND}" = "true" ] ; then 
  115.           cp "${WORKSPACE_BASIC_AUTH_DIRECTORY_PATH}/.git-credentials" "${PARAM_USER_HOME}/.git-credentials" 
  116.           cp "${WORKSPACE_BASIC_AUTH_DIRECTORY_PATH}/.gitconfig" "${PARAM_USER_HOME}/.gitconfig" 
  117.           chmod 400 "${PARAM_USER_HOME}/.git-credentials" 
  118.           chmod 400 "${PARAM_USER_HOME}/.gitconfig" 
  119.         fi 
  120.  
  121.         CHECKOUT_DIR="${WORKSPACE_OUTPUT_PATH}/${PARAM_SUBDIRECTORY}" 
  122.  
  123.         cleandir() { 
  124.           # Delete any existing contents of the repo directory if it exists. 
  125.           # 
  126.           # We don't just "rm -rf ${CHECKOUT_DIR}" because ${CHECKOUT_DIR} might be "/" 
  127.           # or the root of a mounted volume. 
  128.           if [ -d "${CHECKOUT_DIR}" ] ; then 
  129.             # Delete non-hidden files and directories 
  130.             rm -rf "${CHECKOUT_DIR:?}"/* 
  131.             # Delete files and directories starting with . but excluding .. 
  132.             rm -rf "${CHECKOUT_DIR}"/.[!.]* 
  133.             # Delete files and directories starting with .. plus any other character 
  134.             rm -rf "${CHECKOUT_DIR}"/..?* 
  135.           fi 
  136.         } 
  137.  
  138.         if [ "${PARAM_DELETE_EXISTING}" = "true" ] ; then 
  139.           cleandir 
  140.         fi 
  141.  
  142.         /ko-app/git-init \ 
  143.           -url="${PARAM_URL}" \ 
  144.           -revision="${PARAM_REVISION}" \ 
  145.           -refspec="${PARAM_REFSPEC}" \ 
  146.           -path="${CHECKOUT_DIR}" \ 
  147.           -sslVerify="${PARAM_SSL_VERIFY}" \ 
  148.           -submodules="${PARAM_SUBMODULES}" \ 
  149.           -depth="${PARAM_DEPTH}" \ 
  150.           -sparseCheckoutDirectories="${PARAM_SPARSE_CHECKOUT_DIRECTORIES}" 
  151.         cd "${CHECKOUT_DIR}" 
  152.         RESULT_SHA="$(git rev-parse HEAD)" 
  153.         EXIT_CODE="$?" 
  154.         if [ "${EXIT_CODE}" != 0 ] ; then 
  155.           exit "${EXIT_CODE}" 
  156.         fi 
  157.         printf "%s" "${RESULT_SHA}" > "$(results.commit.path)" 
  158.         printf "%s" "${PARAM_URL}" > "$(results.url.path)" 

一般來說我們只需要提供 output 這個(gè)個(gè)用于持久化代碼的 workspace,然后還包括 url 和 revision 這兩個(gè)參數(shù),其他使用默認(rèn)的即可。

單元測(cè)試

單元測(cè)試階段比較簡(jiǎn)單,正常來說也是只是單純執(zhí)行一個(gè)測(cè)試命令即可,我們這里沒有真正執(zhí)行單元測(cè)試,所以簡(jiǎn)單測(cè)試下即可,編寫一個(gè)如下所示的 Task:

  
 
 
 
  1. # task-test.yaml 
  2. apiVersion: tekton.dev/v1beta1 
  3. kind: Task 
  4. metadata: 
  5.   name: test 
  6. spec: 
  7.   steps: 
  8.     - name: test 
  9.       image: golang:1.14-alpine 
  10.       command: ['echo'] 
  11.       args: ['this is a test task'] 

編譯打包

然后第二個(gè)階段是編譯打包階段,因?yàn)槲覀冞@個(gè)項(xiàng)目的 Dockerfile 不是使用的多階段構(gòu)建,所以需要先用一個(gè)任務(wù)去將應(yīng)用編譯打包成二進(jìn)制文件,然后將這個(gè)編譯過后的文件傳遞到下一個(gè)任務(wù)進(jìn)行鏡像構(gòu)建。

我們已經(jīng)明確了這個(gè)階段要做的事情,編寫任務(wù)也就簡(jiǎn)單了,創(chuàng)建如下所的 Task 任務(wù),首先需要通過定義一個(gè) workspace 把 clone 任務(wù)里面的代碼關(guān)聯(lián)過來:

  
 
 
 
  1. # task-build.yaml 
  2. apiVersion: tekton.dev/v1beta1 
  3. kind: Task 
  4. metadata: 
  5.   name: build 
  6. spec: 
  7.   workspaces: 
  8.     - name: go-repo 
  9.       mountPath: /workspace/repo 
  10.   steps: 
  11.     - name: build 
  12.       image: golang:1.14-alpine 
  13.       workingDir: /workspace/repo 
  14.       script: | 
  15.         go build -v -o app 
  16.       env: 
  17.         - name: GOPROXY 
  18.           value: https://goproxy.cn 
  19.         - name: GOOS 
  20.           value: linux 
  21.         - name: GOARCH 
  22.           value: amd64 

這個(gè)構(gòu)建任務(wù)也很簡(jiǎn)單,只是我們將需要用到的環(huán)境變量直接通過 env 注入了,當(dāng)然直接寫入到 script 中也是可以的,或者直接使用 command 來執(zhí)行任務(wù)都可以,然后構(gòu)建生成的 app 這個(gè)二進(jìn)制文件保留在代碼根目錄,這樣也就可以通過 workspace 進(jìn)行共享了。

Docker 鏡像

接下來就是構(gòu)建并推送 Docker 鏡像了,前面我們介紹過使用 Kaniko、DooD、DinD 3種模式的鏡像構(gòu)建方式,這里我們直接使用 DinD 這種模式,我們這里要構(gòu)建的鏡像 Dockerfile 非常簡(jiǎn)單:

  
 
 
 
  1. FROM alpine 
  2. WORKDIR /home 
  3.  
  4. # 修改alpine源為阿里云 
  5. RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories && \ 
  6.   apk update && \ 
  7.   apk upgrade && \ 
  8.   apk add ca-certificates && update-ca-certificates && \ 
  9.   apk add --update tzdata && \ 
  10.   rm -rf /var/cache/apk/* 
  11.  
  12. COPY app /home/ 
  13. ENV TZ=Asia/Shanghai 
  14.  
  15. EXPOSE 8080 
  16.  
  17. ENTRYPOINT ./app 

就行直接將編譯好的二進(jìn)制文件拷貝到鏡像中即可,所以我們這里同樣需要通過 Workspace 去獲取上一個(gè)構(gòu)建任務(wù)的制品,當(dāng)然要使用 DinD 模式構(gòu)建鏡像,需要用到 sidecar 功能,創(chuàng)建一個(gè)如下所示的任務(wù):

  
 
 
 
  1. # task-docker.yaml 
  2. apiVersion: tekton.dev/v1beta1 
  3. kind: Task 
  4. metadata: 
  5.   name: docker 
  6. spec: 
  7.   workspaces: 
  8.     - name: go-repo 
  9.   params: 
  10.     - name: image 
  11.       description: Reference of the image docker will produce. 
  12.     - name: registry_mirror 
  13.       description: Specific the docker registry mirror 
  14.       default: "" 
  15.     - name: registry_url 
  16.       description: private docker images registry url 
  17.   steps: 
  18.     - name: docker-build # 構(gòu)建步驟 
  19.       image: docker:stable 
  20.       env: 
  21.         - name: DOCKER_HOST # 用 TLS 形式通過 TCP 鏈接 sidecar 
  22.           value: tcp://localhost:2376 
  23.         - name: DOCKER_TLS_VERIFY # 校驗(yàn) TLS 
  24.           value: "1" 
  25.         - name: DOCKER_CERT_PATH # 使用 sidecar 守護(hù)進(jìn)程生成的證書 
  26.           value: /certs/client 
  27.         - name: DOCKER_PASSWORD 
  28.           valueFrom: 
  29.             secretKeyRef: 
  30.               name: harbor-auth 
  31.               key: password 
  32.         - name: DOCKER_USERNAME 
  33.           valueFrom: 
  34.             secretKeyRef: 
  35.               name: harbor-auth 
  36.               key: username 
  37.       workingDir: $(workspaces.go-repo.path) 
  38.       script: | # docker 構(gòu)建命令 
  39.         docker login $(params.registry_url) -u $DOCKER_USERNAME -p $DOCKER_PASSWORD 
  40.         docker build --no-cache -f ./Dockerfile -t $(params.image) . 
  41.         docker push $(params.image) 
  42.       volumeMounts: # 聲明掛載證書目錄 
  43.         - mountPath: /certs/client 
  44.           name: dind-certs 
  45.   sidecars: # sidecar 模式,提供 docker daemon服務(wù),實(shí)現(xiàn)真正的 DinD 模式 
  46.     - image: docker:dind 
  47.       name: server 
  48.       args: 
  49.         - --storage-driver=vfs 
  50.         - --userland-proxy=false 
  51.         - --debug 
  52.         - --insecure-registry=$(params.registry_url) 
  53.         - --registry-mirror=$(params.registry_mirror) 
  54.       securityContext: 
  55.         privileged: true 
  56.       env: 
  57.         - name: DOCKER_TLS_CERTDIR # 將生成的證書寫入與客戶端共享的路徑 
  58.           value: /certs 
  59.       volumeMounts: 
  60.         - mountPath: /certs/client 
  61.           name: dind-certs 
  62.       readinessProbe: # 等待 dind daemon 生成它與客戶端共享的證書 
  63.         periodSeconds: 1 
  64.         exec: 
  65.           command: ["ls", "/certs/client/ca.pem"] 
  66.   volumes: # 使用 emptyDir 的形式即可 
  67.     - name: dind-certs 
  68.       emptyDir: {} 

這個(gè)任務(wù)的重點(diǎn)還是要去聲明一個(gè) Workspace,當(dāng)執(zhí)行任務(wù)的時(shí)候要使用和前面構(gòu)建任務(wù)同一個(gè) Workspace,這樣就可以獲得上面編譯成的 app 這個(gè)二進(jìn)制文件了。

部署

接下來的部署階段,我們同樣可以參考之前 Jenkins 流水線里面的實(shí)現(xiàn),由于項(xiàng)目中我們包含了 Helm Chart 包,所以直接使用 Helm 來部署即可,要實(shí)現(xiàn) Helm 部署,當(dāng)然我們首先需要一個(gè)包含 helm 命令的鏡像,當(dāng)然完全可以自己去編寫一個(gè)這樣的任務(wù),此外我們還可以直接去 hub.tekton.dev 上面查找 Catalog,因?yàn)檫@上面就有很多比較通用的一些任務(wù)了,比如 helm-upgrade-from-source 這個(gè) Task 任務(wù)就完全可以滿足我們的需求了:

helm tekton

這個(gè) Catalog 下面也包含完整的使用文檔了,我們可以將該任務(wù)直接下載下來根據(jù)我們自己的需求做一些定制修改,如下所示:

  
 
 
 
  1. # task-deploy.yaml 
  2. apiVersion: tekton.dev/v1beta1 
  3. kind: Task 
  4. metadata: 
  5.   name: deploy 
  6. spec: 
  7.   params: 
  8.     - name: charts_dir 
  9.       description: The directory in source that contains the helm chart 
  10.     - name: release_name 
  11.       description: The helm release name 
  12.     - name: release_namespace 
  13.       description: The helm release namespace 
  14.       default: "" 
  15.     - name: overwrite_values 
  16.       description: "Specify the values you want to overwrite, comma separated: autoscaling.enabled=true,replicas=1" 
  17.       default: "" 
  18.     - name: values_file 
  19.       description: "The values file to be used" 
  20.       default: "values.yaml" 
  21.     - name: helm_image 
  22.       description: "helm image to be used" 
  23.       default: "docker.io/lachlanevenson/k8s-helm:v3.3.4@sha256:e1816be207efbd342cba9d3d32202e237e3de20af350617f8507dc033ea66803" #tag: v3.3.4 
  24.   workspaces: 
  25.     - name: source 
  26.   results: 
  27.     - name: helm-status 
  28.       description: Helm deploy status 
  29.   steps: 
  30.     - name: upgrade 
  31.       image: $(params.helm_image) 
  32.       workingDir: /workspace/source 
  33.       script: | 
  34.         echo current installed helm releases 
  35.         helm list --namespace "$(params.release_namespace)" 
  36.  
  37.         echo installing helm chart... 
  38.         helm upgrade --install --wait --values "$(params.charts_dir)/$(params.values_file)" --create-namespace --namespace "$(params.release_namespace)" $(params.release_name) $(params.charts_dir) --debug --set "$(params.overwrite_values)" 
  39.  
  40.         status=`helm status $(params.release_name) --namespace "$(params.release_namespace)" | awk '/STATUS/ {print $2}'` 
  41.         echo ${status} | tr -d "\n" | tee $(results.helm-status.path) 

因?yàn)槲覀兊?Helm Chart 模板就在代碼倉庫中,所以不需要從 Chart Repo 倉庫中獲取,只需要指定 Chart 路徑即可,其他可配置的參數(shù)都通過 params 參數(shù)暴露出去了,非常靈活,最后我們還獲取了 Helm 部署的狀態(tài),寫入到了 Results 中,方便后續(xù)任務(wù)處理。

回滾

最后應(yīng)用部署完成后可能還需要回滾,因?yàn)榭赡懿渴鸬膽?yīng)用有錯(cuò)誤,當(dāng)然這個(gè)回滾動(dòng)作最好是我們自己去觸發(fā),但是在某些場(chǎng)景下,比如 helm 部署已經(jīng)明確失敗了,那么我們當(dāng)然可以自動(dòng)回滾了,所以就需要判斷當(dāng)部署失敗的時(shí)候再執(zhí)行回滾,也就是這個(gè)任務(wù)并不是一定會(huì)發(fā)生的,只在某些場(chǎng)景下才會(huì)出現(xiàn),我們可以在流水線中通過使用 WhenExpressions 來實(shí)現(xiàn)這個(gè)功能,之前版本中是使用 Conditions,不過已經(jīng)廢棄了。要只在滿足某些條件時(shí)運(yùn)行任務(wù),可以使用 when 字段來保護(hù)任務(wù)執(zhí)行,when 字段允許你列出對(duì) WhenExpressions 的一系列引用。

WhenExpressions 由 Input、Operator 和 Values 幾部分組成:

  • Input 是 WhenExpressions 的輸入,它可以是一個(gè)靜態(tài)的輸入或變量(Params 或 Results),如果未提供輸入,則默認(rèn)為空字符串
  • Operator 是一個(gè)運(yùn)算符,表示 Input 和 Values 之間的關(guān)系,有效的運(yùn)算符包括 in、notin
  • Values 是一個(gè)字符串?dāng)?shù)組,必須提供一個(gè)非空的 Values 數(shù)組,它同樣可以包含靜態(tài)值或者變量(Params、Results 或者 Workspaces 綁定)

當(dāng)在一個(gè) Task 任務(wù)中配置了 WhenExpressions,在執(zhí)行 Task 之前會(huì)評(píng)估聲明的 WhenExpressions,如果結(jié)果為 True,則執(zhí)行任務(wù),如果為 False,則不會(huì)執(zhí)行該任務(wù)。

我們這里創(chuàng)建的回滾任務(wù)如下所示:

  
 
 
 
  1. # task-rollback.yaml 
  2. apiVersion: tekton.dev/v1beta1 
  3. kind: Task 
  4. metadata: 
  5.   name: rollback 
  6. spec: 
  7.   params: 
  8.     - name: release_name 
  9.       description: The helm release name 
  10.     - name: release_namespace 
  11.       description: The helm release namespace 
  12.       default: "" 
  13.     - name: helm_image 
  14.       description: "helm image to be used" 
  15.       default: "docker.io/lachlanevenson/k8s-helm:v3.3.4@sha256:e1816be207efbd342cba9d3d32202e237e3de20af350617f8507dc033ea66803" #tag: v3.3.4 
  16.   steps: 
  17.     - name: rollback 
  18.       image: $(params.helm_image) 
  19.       script: | 
  20.         echo rollback current installed helm releases 
  21.         helm rollback $(params.release_name) --namespace $(params.release_namespace) 

流水線

現(xiàn)在我們的整個(gè)工作流任務(wù)都已經(jīng)創(chuàng)建完成了,接下來我們就可以將這些任務(wù)全部串聯(lián)起來組成一個(gè) Pipeline 流水線了,將上面定義的幾個(gè) Task 引用到 Pipeline 中來,當(dāng)然還需要聲明 Task 中用到的 resources 或者 workspaces 這些數(shù)據(jù):

  
 
 
 
  1. # pipeline.yaml 
  2. apiVersion: tekton.dev/v1beta1 
  3. kind: Pipeline 
  4. metadata: 
  5.   name: pipeline 
  6. spec: 
  7.   workspaces: # 聲明 workspaces 
  8.     - name: go-repo-pvc 
  9.   params: 
  10.     # 定義代碼倉庫 
  11.     - name: git_url 
  12.     - name: revision 
  13.       type: string 
  14.       default: "master" 
  15.     # 定義鏡像參數(shù) 
  16.     - name: image 
  17.     - name: registry_url 
  18.       type: string 
  19.       default: "harbor.k8s.local" 
  20.     - name: registry_mirror 
  21.       type: string 
  22.       default: "https://ot2k4d59.mirror.aliyuncs.com/" 
  23.     # 定義 helm charts 參數(shù) 
  24.     - name: charts_dir 
  25.     - name: release_name 
  26.     - name: release_namespace 
  27.       default: "default" 
  28.     - name: overwrite_values 
  29.       default: "" 
  30.     - name: values_file 
  31.       default: "values.yaml" 
  32.   tasks: # 添加task到流水線中 
  33.     - name: clone 
  34.       taskRef: 
  35.         name: git-clone 
  36.       workspaces: 
  37.         - name: output 
  38.           workspace: go-repo-pvc 
  39.       params: 
  40.         - name: url 
  41.           value: $(params.git_url) 
  42.         - name: revision 
  43.           value: $(params.revision) 
  44.     - name: test 
  45.       taskRef: 
  46.         name: test 
  47.     - name: build # 編譯二進(jìn)制程序 
  48.       taskRef: 
  49.         name: build 
  50.       runAfter: # 測(cè)試任務(wù)執(zhí)行之后才執(zhí)行 build task 
  51.         - test 
  52.         - clone 
  53.       workspaces: # 傳遞 workspaces 
  54.         - name: go-repo 
  55.           workspace: go-repo-pvc 
  56.     - name: docker # 構(gòu)建并推送 Docker 鏡像 
  57.       taskRef: 
  58.         name: docker 
  59.       runAfter: 
  60.         - build 
  61.       workspaces: # 傳遞 workspaces 
  62.         - name: go-repo 
  63.           workspace: go-repo-pvc 
  64.       params: # 傳遞參數(shù) 
  65.         - name: image 
  66.           value: $(params.image) 
  67.         - name: registry_url 
  68.           value: $(params.registry_url) 
  69.         - name: registry_mirror 
  70.           value: $(params.registry_mirror) 
  71.     - name: deploy # 部署應(yīng)用 
  72.       taskRef: 
  73.         name: deploy 
  74.       runAfter: 
  75.         - docker 
  76.       workspaces: 
  77.         - name: source 
  78.           workspace: go-repo-pvc 
  79.       params: 
  80.         - name: charts_dir 
  81.           value: $(params.charts_dir) 
  82.         - name: release_name 
  83.           value: $(params.release_name) 
  84.         - name: release_namespace 
  85.           value: $(params.release_namespace) 
  86.         - name: overwrite_values 
  87.           value: $(params.overwrite_values) 
  88.         - name: values_file 
  89.           value: $(params.values_file) 
  90.     - name: rollback # 回滾 
  91.       taskRef: 
  92.         name: rollback 
  93.       when: 
  94.         - input: "$(tasks.deploy.results.helm-status)" 
  95.           operator: in 
  96.           values: ["failed"] 
  97.       params: 
  98.         - name: release_name 
  99.           value: $(params.release_name) 
  100.         - name: release_namespace 
  101.           value: $(params.release_namespace) 

整體流程比較簡(jiǎn)單,就是在 Pipeline 需要先聲明使用到的 Workspace、Resource、Params 這些資源,然后將聲明的數(shù)據(jù)傳遞到 Task 任務(wù)中去,需要注意的是最后一個(gè)回滾任務(wù),我們需要根據(jù)前面的 deploy 任務(wù)的結(jié)果來判斷是否需要執(zhí)
文章名稱:使用Tekton重構(gòu)自動(dòng)化流水線
本文地址:http://uogjgqi.cn/article/djojdeo.html

掃二維碼與項(xiàng)目經(jīng)理溝通

我們?cè)谖⑿派?4小時(shí)期待你的聲音

解答本文疑問/技術(shù)咨詢/運(yùn)營(yíng)咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流