91在线一级黄片|91视频在线观看18|成人夜间呦呦网站|91资源欧美日韩超碰|久久最新免费精品视频一区二区三区|国产探花视频在线观看|黄片真人免费三级片毛片|国产人无码视频在线|精品成人影视无码三区|久久视频爱久久免费精品

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

新聞中心

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

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

作者:陽(yáng)明 2021-06-18 05:48:02

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

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

創(chuàng)建流水線

比如我們這里的流水線流程為先運(yùn)行 test 任務(wù),如果通過(guò)了再執(zhí)行后面的 build-and-push 這個(gè)任務(wù),那么我們可以創(chuàng)建一個(gè)名為 test-pipeline.yaml 的資源對(duì)象,內(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)用測(cè)試 
  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 # 測(cè)試任務(wù)執(zhí)行之后 
  27.       resources: 
  28.         inputs: 
  29.         - name: repo  # 指定輸入的git倉(cāng)庫(kù)資源 
  30.           resource: demo-git 
  31.         outputs:  # 指定輸出的鏡像資源 
  32.         - name: builtImage 
  33.           resource: harbor-image 

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

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

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

前面我們提到過(guò)和通過(guò)創(chuàng)建 TaskRun 去觸發(fā) Task 任務(wù)類似,我們可以通過(guò)創(chuàng)建一個(gè) PipelineRun 對(duì)象來(lái)運(yùn)行流水線。這里我們創(chuàng)建一個(gè)名為 test-pipelinerun.yaml 的 PipelineRun 對(duì)象來(lái)運(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倉(cāng)庫(kù)資源 
  11.     resourceRef: 
  12.       name: demo-git 
  13.   - name: harbor-image  # 指定輸出的鏡像資源 
  14.     resourceRef: 
  15.       name: harbor-image 

定義方式和 TaskRun 幾乎一樣,通過(guò) serviceAccountName 屬性指定 ServiceAccount 對(duì)象,pipelineRef 關(guān)聯(lián)流水線對(duì)象。同樣直接創(chuàng)建這個(gè)資源,創(chuàng)建后就會(huì)觸發(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 集群上,定義了一個(gè) Task,并通過(guò) YAML 清單和 Tekton CLI 創(chuàng)建 TaskRun 對(duì)其進(jìn)行了測(cè)試。我們創(chuàng)建了由兩個(gè)任務(wù)組成的 Tektok 流水線,第一個(gè)任務(wù)是從 GitHub 克隆代碼并運(yùn)行應(yīng)用程序測(cè)試,第二個(gè)任務(wù)是構(gòu)建一個(gè) Docker 鏡像并將其推送到 Docker Hub 上。

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

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

這里我們可以通過(guò)定義一個(gè) Task 任務(wù),然后通過(guò) script 腳本去獲取到數(shù)據(jù)后傳入到 results 中去,我們可以把這些 results 數(shù)據(jù)傳遞到流水線中的其他任務(wù)中去,比如我們想要獲取 git commit 的 SHA 值,或者生成一個(gè)隨機(jī)的 ID 來(lái)作為鏡像 TAG,比如這里我們創(chuàng)建一個(gè)名為 generate-build-id 的 Task 任務(wù),定義了 get-timestamp 和 get-buildid 兩個(gè) Steps,一個(gè)用于生成時(shí)間戳,一個(gè)用于生成一個(gè)包含基本版本的結(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 中來(lái)使用這個(gè) Task 了,用來(lái)生成構(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)用測(cè)試 
  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 # 測(cè)試任務(wù)執(zhí)行之后 
  36.       resources: 
  37.         inputs: 
  38.         - name: repo  # 指定輸入的git倉(cāng)庫(kù)資源 
  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ù)中通過(guò) "$(tasks.get-build-id.results.build-id)" 獲取構(gòu)建的 ID,將這個(gè) ID 作為參數(shù)傳入任務(wù)中去,所以我們也需要在 build-and-push 任務(wù)中增加 build-id 這個(gè)參數(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的那個(gè)倉(cāng)庫(kù) 
  10.       type: git 
  11.     outputs: # 定義輸出資源 
  12.     - name: builtImage # 輸出鏡像名字 
  13.       type: image 
  14.   params: 
  15.   - name: pathToDockerfile #指明 dockerfile 在倉(cāng)庫(kù)中的哪個(gè)位置 
  16.     type: string 
  17.     default: $(resources.inputs.repo.path)/Dockerfile # repo資源的路徑 
  18.     description: The path to the dockerfile to build 
  19.   - name: pathToContext #指明 dockerfile 在倉(cāng)庫(kù)中的哪個(gè)位置 
  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)來(lái),使用宿主機(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 這個(gè) output 資源的 url 定義中將鏡像 tag 去掉,在 PipelineRun 對(duì)象中新增 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倉(cāng)庫(kù)資源 
  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í)行我們的整個(gè)流水線即可。

  
 
 
 
  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,最后也通過(guò) results 傳遞到了下面的構(gòu)建任務(wù)中去,鏡像的 TAG 也更新了。

Tekton Catalog

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

到這里我們就完成了使用 Tekton 創(chuàng)建 CI/CD 流水線的一個(gè)簡(jiǎn)單示例,不過(guò)這個(gè)示例還比較簡(jiǎn)單,接下來(lái)我們?cè)偻ㄟ^(guò)一個(gè)稍微復(fù)雜點(diǎn)的應(yīng)用來(lái)完成我們前面的 Jenkins 流水線。


新聞名稱:一篇帶你創(chuàng)建Tekton流水線
URL分享:http://m.jiaoqi3.com/article/cogjssh.html