日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
一篇帶你創(chuàng)建Tekton流水線

一篇帶你創(chuàng)建 Tekton 流水線

作者:陽明 2021-06-18 05:48:02

云計算 前面我們創(chuàng)建的兩個任務(wù) test 和 build-and-push 都已經(jīng)完成了,我們還可以創(chuàng)建一個流水線來將這兩個任務(wù)組織起來,形成一個流水線,這里就是我們要使用的 Pipeline 這個 CRD 對象。

 前面我們創(chuàng)建的兩個任務(wù) test 和 build-and-push 都已經(jīng)完成了,我們還可以創(chuàng)建一個流水線來將這兩個任務(wù)組織起來,形成一個流水線,這里就是我們要使用的 Pipeline 這個 CRD 對象。

創(chuàng)建流水線

比如我們這里的流水線流程為先運(yùn)行 test 任務(wù),如果通過了再執(zhí)行后面的 build-and-push 這個任務(wù),那么我們可以創(chuàng)建一個名為 test-pipeline.yaml 的資源對象,內(nèi)容如下所示:

  
 
 
 
  1. # test-pipeline.yaml 
  2. apiVersion: tekton.dev/v1beta1 
  3. kind: Pipeline 
  4. metadata: 
  5.   name: test-pipeline 
  6. spec: 
  7.   resources:  # 為 Tasks 提供輸入和輸出資源聲明 
  8.     - name: demo-git 
  9.       type: git 
  10.     - name: harbor-image 
  11.       type: image 
  12.   tasks:  # 添加task到流水線中 
  13.     # 運(yùn)行應(yīng)用測試 
  14.     - name: test 
  15.       taskRef: 
  16.         name: test 
  17.       resources: 
  18.         inputs: 
  19.           - name: repo # Task 輸入名稱 
  20.             resource: demo-git # Pipeline 資源名稱 
  21.     # 構(gòu)建并推送 Docker 鏡像 
  22.     - name: build-and-push 
  23.       taskRef: 
  24.         name: build-and-push 
  25.       runAfter: 
  26.       - test # 測試任務(wù)執(zhí)行之后 
  27.       resources: 
  28.         inputs: 
  29.         - name: repo  # 指定輸入的git倉庫資源 
  30.           resource: demo-git 
  31.         outputs:  # 指定輸出的鏡像資源 
  32.         - name: builtImage 
  33.           resource: harbor-image 

首先我們需要定義流水線需要哪些資源,可以是輸入或者輸出的資源,在這里我們只有一個輸入,那就是命名為 repo 的應(yīng)用程序源碼的 GitHub 倉庫。接下來定義任務(wù),每個任務(wù)都通過 taskRef 進(jìn)行引用,并傳遞任務(wù)需要的輸入?yún)?shù)。

同樣直接創(chuàng)建這個資源對象即可:

  
 
 
 
  1. $ kubectl apply -f test-pipeline.yaml 
  2. pipeline.tekton.dev/test-pipeline created 

前面我們提到過和通過創(chuàng)建 TaskRun 去觸發(fā) Task 任務(wù)類似,我們可以通過創(chuàng)建一個 PipelineRun 對象來運(yùn)行流水線。這里我們創(chuàng)建一個名為 test-pipelinerun.yaml 的 PipelineRun 對象來運(yùn)行流水線,文件內(nèi)容如下所示:

  
 
 
 
  1. apiVersion: tekton.dev/v1beta1 
  2. kind: PipelineRun 
  3. metadata: 
  4.   name: test-pipelinerun 
  5. spec: 
  6.   serviceAccountName: build-sa 
  7.   pipelineRef: 
  8.     name: test-pipeline 
  9.   resources: 
  10.   - name: demo-git  # 指定輸入的git倉庫資源 
  11.     resourceRef: 
  12.       name: demo-git 
  13.   - name: harbor-image  # 指定輸出的鏡像資源 
  14.     resourceRef: 
  15.       name: harbor-image 

定義方式和 TaskRun 幾乎一樣,通過 serviceAccountName 屬性指定 ServiceAccount 對象,pipelineRef 關(guān)聯(lián)流水線對象。同樣直接創(chuàng)建這個資源,創(chuàng)建后就會觸發(fā)我們的流水線任務(wù)了:

  
 
 
 
  1. $ kubectl apply -f test-pipelinerun.yaml 
  2. pipelinerun.tekton.dev/test-pipelinerun created 
  3. $ github kubectl get pods | grep test-pipelinerun 
  4. test-pipelinerun-build-and-push-62g65-pod-6jqqf   0/4     Init:1/2    0          3s 
  5. test-pipelinerun-test-c4r9m-pod-j7jjd             0/2     Completed   0          12s 
  6. $ tkn pipelinerun describe test-pipelinerun 
  7. Name:              test-pipelinerun 
  8. Namespace:         default 
  9. Pipeline Ref:      test-pipeline 
  10. Service Account:   build-sa 
  11. Timeout:           1h0m0s 
  12. Labels: 
  13.  tekton.dev/pipeline=test-pipeline 
  14.  
  15. ?  Status 
  16.  
  17. STARTED          DURATION     STATUS 
  18. 47 seconds ago   22 seconds   Succeeded 
  19.  
  20.  Resources 
  21.  
  22.  NAME             RESOURCE REF 
  23.  ? demo-git       demo-git 
  24.  ? harbor-image   harbor-image 
  25.  
  26.  Params 
  27.  
  28.  No params 
  29.  
  30.  Results 
  31.  
  32.  No results 
  33.  
  34.  Workspaces 
  35.  
  36.  No workspaces 
  37.  
  38.   Taskruns 
  39.  
  40.  NAME                                      TASK NAME        STARTED          DURATION     STATUS 
  41.  ? test-pipelinerun-build-and-push-62g65   build-and-push   38 seconds ago   13 seconds   Succeeded 
  42.  ? test-pipelinerun-test-c4r9m             test             46 seconds ago   8 seconds    Succeeded 

到這里證明我們的流水線執(zhí)行成功了。我們將 Tekton 安裝在 Kubernetes 集群上,定義了一個 Task,并通過 YAML 清單和 Tekton CLI 創(chuàng)建 TaskRun 對其進(jìn)行了測試。我們創(chuàng)建了由兩個任務(wù)組成的 Tektok 流水線,第一個任務(wù)是從 GitHub 克隆代碼并運(yùn)行應(yīng)用程序測試,第二個任務(wù)是構(gòu)建一個 Docker 鏡像并將其推送到 Docker Hub 上。

使用 Results 傳遞數(shù)據(jù)

上面我們在構(gòu)建鏡像的時候可以看到鏡像的 TAG 我們是寫死的,或者需要在每次執(zhí)行的時候通過參數(shù)傳遞進(jìn)去,比較麻煩,那么有沒有什么辦法可以自動生成鏡像 TAG 呢?比如根據(jù)時間戳來生成一個構(gòu)建的ID。

這里我們可以通過定義一個 Task 任務(wù),然后通過 script 腳本去獲取到數(shù)據(jù)后傳入到 results 中去,我們可以把這些 results 數(shù)據(jù)傳遞到流水線中的其他任務(wù)中去,比如我們想要獲取 git commit 的 SHA 值,或者生成一個隨機(jī)的 ID 來作為鏡像 TAG,比如這里我們創(chuàng)建一個名為 generate-build-id 的 Task 任務(wù),定義了 get-timestamp 和 get-buildid 兩個 Steps,一個用于生成時間戳,一個用于生成一個包含基本版本的結(jié)果值,將結(jié)果添加到 results 中去。

  
 
 
 
  1. # generate-build-id.yaml 
  2. apiVersion: tekton.dev/v1beta1 
  3. kind: Task 
  4. metadata: 
  5.   name: generate-build-id 
  6. spec: 
  7.   description: >- 
  8.     Given a base version, this task generates a unique build id by appending 
  9.     the base-version to the current timestamp. 
  10.   params: 
  11.     - name: base-version 
  12.       description: Base product version 
  13.       type: string 
  14.       default: "1.0" 
  15.   results: 
  16.     - name: timestamp 
  17.       description: Current timestamp 
  18.     - name: build-id 
  19.       description: ID of the current build 
  20.   steps: 
  21.     - name: get-timestamp 
  22.       image: bash:5.0.18 
  23.       script: | 
  24.         #!/usr/bin/env bash 
  25.         ts=`date "+%Y%m%d-%H%M%S"` 
  26.         echo "Current Timestamp: ${ts}" 
  27.         echo ${ts} | tr -d "\n" | tee $(results.timestamp.path) 
  28.     - name: get-buildid 
  29.       image: bash:5.0.18 
  30.       script: | 
  31.         #!/usr/bin/env bash 
  32.         ts=`cat $(results.timestamp.path)` 
  33.         buildId=$(inputs.params.base-version)-${ts} 
  34.         echo ${buildId} | tr -d "\n" | tee $(results.build-id.path) 

直接創(chuàng)建上面的 Task:

  
 
 
 
  1. kubectl apply -f generate-build-id.yaml 

創(chuàng)建完成后,現(xiàn)在我們就可以在 Pipeline 中來使用這個 Task 了,用來生成構(gòu)建 ID,修改 test-pipeline.yaml,增加 generate-build-id 任務(wù):

  
 
 
 
  1. # test-pipeline.yaml 
  2. apiVersion: tekton.dev/v1beta1 
  3. kind: Pipeline 
  4. metadata: 
  5.   name: test-pipeline 
  6. spec: 
  7.   resources:  # 為 Tasks 提供輸入和輸出資源聲明 
  8.     - name: demo-git 
  9.       type: git 
  10.     - name: harbor-image 
  11.       type: image 
  12.   params: 
  13.   - name: image-tag 
  14.     type: string 
  15.   tasks:  # 添加task到流水線中 
  16.     # 運(yùn)行應(yīng)用測試 
  17.     - name: test 
  18.       taskRef: 
  19.         name: test 
  20.       resources: 
  21.         inputs: 
  22.           - name: repo # Task 輸入名稱 
  23.             resource: demo-git # Pipeline 資源名稱 
  24.     - name: get-build-id 
  25.       taskRef: 
  26.         name: generate-build-id 
  27.       params: 
  28.       - name: base-version 
  29.         value: $(params.image-tag) 
  30.     # 構(gòu)建并推送 Docker 鏡像 
  31.     - name: build-and-push 
  32.       taskRef: 
  33.         name: build-and-push 
  34.       runAfter: 
  35.       - test # 測試任務(wù)執(zhí)行之后 
  36.       resources: 
  37.         inputs: 
  38.         - name: repo  # 指定輸入的git倉庫資源 
  39.           resource: demo-git 
  40.         outputs:  # 指定輸出的鏡像資源 
  41.         - name: builtImage 
  42.           resource: harbor-image 
  43.       params: 
  44.       - name: imageTag 
  45.         value: "$(tasks.get-build-id.results.build-id)" 

然后在 build-and-push 任務(wù)中通過 "$(tasks.get-build-id.results.build-id)" 獲取構(gòu)建的 ID,將這個 ID 作為參數(shù)傳入任務(wù)中去,所以我們也需要在 build-and-push 任務(wù)中增加 build-id 這個參數(shù):

  
 
 
 
  1. # task-build-push.yaml 
  2. apiVersion: tekton.dev/v1beta1 
  3. kind: Task 
  4. metadata: 
  5.   name: build-and-push 
  6. spec: 
  7.   resources: 
  8.     inputs: # 定義輸入資源 
  9.     - name: repo  #輸入資源,就是github的那個倉庫 
  10.       type: git 
  11.     outputs: # 定義輸出資源 
  12.     - name: builtImage # 輸出鏡像名字 
  13.       type: image 
  14.   params: 
  15.   - name: pathToDockerfile #指明 dockerfile 在倉庫中的哪個位置 
  16.     type: string 
  17.     default: $(resources.inputs.repo.path)/Dockerfile # repo資源的路徑 
  18.     description: The path to the dockerfile to build 
  19.   - name: pathToContext #指明 dockerfile 在倉庫中的哪個位置 
  20.     type: string 
  21.     default: $(resources.inputs.repo.path)  # repo資源的路徑 
  22.     description: the build context used by docker daemon 
  23.   - name: imageTag 
  24.     type: string 
  25.     default: "v0.2.0" 
  26.     description: the docker image tag 
  27.   steps: 
  28.     - name: build-and-push 
  29.       image: docker:stable 
  30.       script: | 
  31.         #!/usr/bin/env sh 
  32.         docker login harbor.k8s.local 
  33.         docker build -t $(resources.outputs.builtImage.url):$(params.imageTag) -f $(params.pathToDockerfile) $(params.pathToContext) 
  34.         docker push $(resources.outputs.builtImage.url):$(params.imageTag)  # 這邊的參數(shù)都是在 input 和 output 中定義的 
  35.       volumeMounts: 
  36.         - name: dockersock #將docker.sock文件掛載進(jìn)來,使用宿主機(jī)docker daemon 構(gòu)建鏡像 
  37.           mountPath: /var/run/docker.sock 
  38.   volumes: 
  39.     - name: dockersock 
  40.       hostPath: 
  41.         path: /var/run/docker.sock 

然后需要將 builtImage 這個 output 資源的 url 定義中將鏡像 tag 去掉,在 PipelineRun 對象中新增 image-tag 的參數(shù):

  
 
 
 
  1. # test-pipelinerun.yaml 
  2. apiVersion: tekton.dev/v1beta1 
  3. kind: PipelineRun 
  4. metadata: 
  5.   name: test-pipelinerun 
  6. spec: 
  7.   serviceAccountName: build-sa 
  8.   pipelineRef: 
  9.     name: test-pipeline 
  10.   resources: 
  11.   - name: demo-git  # 指定輸入的git倉庫資源 
  12.     resourceRef: 
  13.       name: demo-git 
  14.   - name: harbor-image  # 指定輸出的鏡像資源 
  15.     resourceRef: 
  16.       name: harbor-image 
  17.   params: 
  18.   - name: image-tag 
  19.     value: "v0.3.0" 

所有修改完成后,重新執(zhí)行我們的整個流水線即可。

  
 
 
 
  1. $ tkn pipelinerun logs test-pipelinerun 
  2. [test : git-source-repo-g68nd] {"level":"info","ts":1623934515.6170688,"caller":"git/git.go:169","msg":"Successfully cloned https://github.com.cnpmjs.org/cnych/tekton-demo @ 5e1e3a1d0f167b9b639df5b802a0f0f81064d21e (grafted, HEAD, origin/master) in path /workspace/repo"} 
  3. [test : git-source-repo-g68nd] {"level":"info","ts":1623934515.6349964,"caller":"git/git.go:207","msg":"Successfully initialized and updated submodules in path /workspace/repo"} 
  4.  
  5. [test : run-test] PASS 
  6. [test : run-test] ok   _/workspace/repo 0.002s 
  7.  
  8. [get-build-id : get-timestamp] Current Timestamp: 20210617-125634 
  9. [get-build-id : get-timestamp] 20210617-125634 
  10.  
  11. [get-build-id : get-buildid] v0.3.0-20210617-125634 
  12.  
  13.  
  14. [build-and-push : git-source-repo-v2lhk] {"level":"info","ts":1623934601.68953,"caller":"git/git.go:169","msg":"Successfully cloned https://github.com.cnpmjs.org/cnych/tekton-demo @ 5e1e3a1d0f167b9b639df5b802a0f0f81064d21e (grafted, HEAD, origin/master) in path /workspace/repo"} 
  15. [build-and-push : git-source-repo-v2lhk] {"level":"info","ts":1623934601.7080255,"caller":"git/git.go:207","msg":"Successfully initialized and updated submodules in path /workspace/repo"} 
  16.  
  17. [build-and-push : build-and-push] Authenticating with existing credentials... 
  18. [build-and-push : build-and-push] Login Succeeded 
  19. [build-and-push : build-and-push] WARNING! Your password will be stored unencrypted in /root/.docker/config.json. 
  20. [build-and-push : build-and-push] Configure a credential helper to remove this warning. See 
  21. [build-and-push : build-and-push] https://docs.docker.com/engine/reference/commandline/login/#credentials-store 
  22. [build-and-push : build-and-push] 
  23. [build-and-push : build-and-push] Sending build context to Docker daemon  154.1kB 
  24. [build-and-push : build-and-push] Step 1/6 : FROM golang:1.14-alpine 
  25. ...... 
  26. [build-and-push : build-and-push] Successfully built 2358e77bbe0e 
  27. [build-and-push : build-and-push] Successfully tagged harbor.k8s.local/course/tekton-demo:v0.3.0-20210617-125634 
  28. [build-and-push : build-and-push] The push refers to repository [harbor.k8s.local/course/tekton-demo] 
  29. [build-and-push : build-and-push] f9a271a3fb3c: Preparing 
  30. ...... 
  31. [build-and-push : build-and-push] 26ec43d351f2: Pushed 
  32. [build-and-push : build-and-push] v0.3.0-20210617-125634: digest: sha256:68be388e3f85dd10a6689a986eb2f7f7f5a5c89bb03f40c3db3178e0ce242752 size: 2198 
  33.  
  34. [build-and-push : image-digest-exporter-t54fb] {"severity":"INFO","timestamp":"2021-06-17T12:56:46.54052284Z","caller":"logging/config.go:116","message":"Successfully created the logger."} 
  35. [build-and-push : image-digest-exporter-t54fb] {"severity":"INFO","timestamp":"2021-06-17T12:56:46.541010181Z","caller":"logging/config.go:117","message":"Logging level set to: info"} 
  36. [build-and-push : image-digest-exporter-t54fb] {"severity":"INFO","timestamp":"2021-06-17T12:56:46.541254959Z","caller":"imagedigestexporter/main.go:59","message":"No index.json found for: builtImage","commit":"7ca5d61"} 

我們可以看到在 get-build-id 任務(wù)中為我們生成了 v0.3.0-20210617-125634 這樣的鏡像 TAG,最后也通過 results 傳遞到了下面的構(gòu)建任務(wù)中去,鏡像的 TAG 也更新了。

Tekton Catalog

當(dāng)然這些任務(wù)其實都具有一定的通用性的,為此 Tekton 官方提供了一個 Catalog 的服務(wù),用來專門提供一些通用的任務(wù),比如我們想要獲取 Git Commit 的相關(guān)信息,可以使用 https://artifacthub.io/packages/tekton-task/tekton-catalog-tasks/git-clone 這個 Catalog,文檔中也包含相關(guān)的使用說明。

到這里我們就完成了使用 Tekton 創(chuàng)建 CI/CD 流水線的一個簡單示例,不過這個示例還比較簡單,接下來我們再通過一個稍微復(fù)雜點(diǎn)的應(yīng)用來完成我們前面的 Jenkins 流水線。


當(dāng)前題目:一篇帶你創(chuàng)建Tekton流水線
轉(zhuǎn)載來于:http://www.dlmjj.cn/article/cogjssh.html