在K8s或OpenShift中Tekton Pipeline是通过CRDs的方式进行定义的。Tekton Pipeline包括以下几种核心对象:
apiVersion: tekton.dev/v1alpha1
kind: Task
metadata:
name: echo-hello-world
spec:
steps:
- name: echo
image: ubuntu
command:
- echo
args:
- "hello world"
在运行Tekton Pipeline的时候,OpenShift会使用TaskRun和PipelineRun对象分别运行Tesk和Pipeline。Pipeline会按照指定的顺序执行Task,并获取结果。
本CICD Pipeline场景会部署两个模块,api和ui。这两个部分都是从git上获取代码,然后使用S2I方式构建镜像,然后再部署运行。
本实验已经验证的运行环境:
$ curl -L https://github.com/tektoncd/cli/releases/download/v0.9.0/tkn_0.9.0_Linux_x86_64.tar.gz | tar -xzf -
$ mv tkn /usr/bin/
$ oc api-resources --api-group=tekton.dev
NAME SHORTNAMES APIGROUP NAMESPACED KIND
clustertasks tekton.dev false ClusterTask
conditions tekton.dev true Condition
eventlisteners el tekton.dev true EventListener
pipelineresources tekton.dev true PipelineResource
pipelineruns pr,prs tekton.dev true PipelineRun
pipelines tekton.dev true Pipeline
taskruns tr,trs tekton.dev true TaskRun
tasks tekton.dev true Task
triggerbindings tb tekton.dev true TriggerBinding
triggertemplates tt tekton.dev true TriggerTemplate
$ oc get pod -n openshift-pipelines
NAME READY STATUS RESTARTS AGE
tekton-pipelines-controller-cbbbb9b6-2vhc2 1/1 Running 0 43m
tekton-pipelines-webhook-5d467b4747-q2k9t 1/1 Running 0 43m
tekton-triggers-controller-84766fbf76-8f29r 1/1 Running 0 43m
tekton-triggers-webhook-66456d7fbc-fxv28 1/1 Running 0 43m
$ oc get config
NAME AGE
cluster 4m
$ oc new-project pipelines-tutorial
$ oc get serviceaccount pipeline
NAME SECRETS AGE
pipeline 2 12h
这里我们创建的独立的Task对象,而在后面步骤中在我们创建的Pipeline对象中包含多个tasks,这些不是独立的Task对象,而只是Pipeline对象执行tasks的说明。
$ oc create -f https://raw.githubusercontent.com/liuxiaoyu-git/pipelines-tutorial/release-v0.9/pipeline/update_deployment_task.yaml
task.tekton.dev/update-deployment created
$ oc create -f https://raw.githubusercontent.com/liuxiaoyu-git/pipelines-tutorial/release-v0.9/pipeline/apply_manifest_task.yaml
task.tekton.dev/apply-manifests created
$ oc get task
NAME AGE
apply-manifests 26m
update-deployment 26m
$ tkn task ls
NAME AGE
apply-manifests 26 minutes ago
update-deployment 27 minutes ago
$ tkn clustertask ls
NAME AGE
buildah 5 minutes ago
buildah-v0-10-0 5 minutes ago
jib-maven 5 minutes ago
kn 5 minutes ago
maven 5 minutes ago
openshift-client 5 minutes ago
openshift-client-v0-10-0 5 minutes ago
s2i 5 minutes ago
s2i-go 5 minutes ago
s2i-go-v0-10-0 5 minutes ago
s2i-java-11 5 minutes ago
s2i-java-11-v0-10-0 5 minutes ago
s2i-java-8 5 minutes ago
s2i-java-8-v0-10-0 5 minutes ago
s2i-nodejs 5 minutes ago
s2i-nodejs-v0-10-0 5 minutes ago
s2i-perl 5 minutes ago
s2i-perl-v0-10-0 5 minutes ago
s2i-php 5 minutes ago
s2i-php-v0-10-0 5 minutes ago
s2i-python-3 5 minutes ago
s2i-python-3-v0-10-0 5 minutes ago
s2i-ruby 5 minutes ago
s2i-ruby-v0-10-0 5 minutes ago
s2i-v0-10-0 5 minutes ago
tkn 5 minutes ago
$ oc create -f https://raw.githubusercontent.com/liuxiaoyu-git/pipelines-tutorial/release-v0.9/pipeline/pipeline.yaml
pipeline.tekton.dev/build-and-deploy created
$ tkn pipeline ls
NAME AGE LAST RUN STARTED DURATION STATUS
build-and-deploy 2 minutes ago --- --- --- ---
$ oc create -f https://raw.githubusercontent.com/liuxiaoyu-git/pipelines-tutorial/release-v0.9/pipeline/resources.yaml
pipelineresource.tekton.dev/api-repo created
pipelineresource.tekton.dev/api-image created
pipelineresource.tekton.dev/ui-repo created
pipelineresource.tekton.dev/ui-image created
$ tkn resource ls
NAME TYPE DETAILS
api-repo git url: http://github.com/openshift-pipelines/vote-api.git
ui-repo git url: http://github.com/openshift-pipelines/vote-ui.git
api-image image url: image-registry.openshift-image-registry.svc:5000/pipelines-tutorial/api:latest
ui-image image url: image-registry.openshift-image-registry.svc:5000/pipelines-tutorial/ui:latest
$ tkn pipeline start build-and-deploy
? Choose the git resource to use for api-repo: api-repo (http://github.com/liuxiaoyu-git/vote-api.git)
? Choose the image resource to use for api-image: api-image (image-registry.openshift-image-registry.svc:5000/pipelines-tutorial/api:latest)
? Choose the git resource to use for ui-repo: ui-repo (http://github.com/liuxiaoyu-git/vote-ui.git)
? Choose the image resource to use for ui-image: ui-image (image-registry.openshift-image-registry.svc:5000/pipelines-tutorial/ui:latest)
Pipelinerun started: build-and-deploy-run-vv57k
In order to track the pipelinerun progress run:
tkn pipelinerun logs build-and-deploy-run-vv57k -f -n pipelines-tutorial
$ tkn pipeline list
NAME AGE LAST RUN STARTED DURATION STATUS
build-and-deploy 41 minutes ago build-and-deploy-run-vv57k 1 minute ago --- Running
此时在OpenShift控制台的Developer视图中的Pipelines中可以查看build-and-deploy的PipelineRun情况,可以看到build-api和build-ui是同时在运行。
3. 执行以下命令可以查看TaskRun和PipelineRun的执行状态(根据Pipeline执行速度,可能看到的执行状态和下面不同)。从STARTTIME可以看出名为build-api和build-ui的taskrun是同时运行的。
$ oc get pipelineruns -n pipelines-tutorial
NAME SUCCEEDED REASON STARTTIME COMPLETIONTIME
build-and-deploy-run-vv57k Unknown Running 4m34s
$ oc get taskruns -n pipelines-tutorial
NAME SUCCEEDED REASON STARTTIME COMPLETIONTIME
build-and-deploy-run-7fhbd-apply-api-manifests-gxcvd True Succeeded 71s 52s
build-and-deploy-run-7fhbd-build-api-smt6v True Succeeded 3m30s 71s
build-and-deploy-run-7fhbd-build-ui-fjszj Unknown Running 3m30s
build-and-deploy-run-7fhbd-update-api-image-jhsmg Unknown Running 52s
$ tkn pipeline logs -f
....
[build-ui : push] {"level":"info","ts":1584697662.9880128,"logger":"fallback-logger","caller":"logging/config.go:69","msg":"Fetch GitHub commit ID from kodata failed: \"KO_DATA_PATH\" does not exist or is empty"}
[build-ui : push] Getting image source signatures
[build-ui : push] Copying blob sha256:cedd25c356a04d0fb467d4715483c20e0be63ba58fdfdccc62eeaa4cd02873cb
[build-ui : push] Copying blob sha256:c7fbe90ae90e9c6452e5d809f069907907e6f32532565104921f600fb956306c
[build-ui : push] Copying blob sha256:74d760a83a4b8bcb3d01e7726e06c11469f0bb2ce4645474cb91a607c27bf482
[build-ui : push] Copying blob sha256:35817540a17b5b90cb4426078d53813b16e70c75e1cce3db116d2fbbca7fbf10
[build-ui : push] Copying blob sha256:0673f18b23fcf8f750bca483ac32b42ac2db5383abc339f664f8b64aa3fcfb5f
[build-ui : push] Copying blob sha256:84ecc5257b90d8d8b51cf749f244f3b7b5d949e4d2761f7522bebd81f07d2ecb
[build-ui : push] Copying blob sha256:5ce88cda89ea3a3d86009a982df0044d0ef98a408eb24e3c066308d9bf86caf2
[build-ui : push] Copying blob sha256:4c88f4710799a4df8881e57abc4274b6b5cf6d14b49d1075c70fcb272342b391
[build-ui : push] Copying config sha256:95de826888a9086ad00fa10731d1ac94263d6d1eca5424db81bc5bb4d0010235
[build-ui : push] Writing manifest to image destination
[build-ui : push] Copying config sha256:95de826888a9086ad00fa10731d1ac94263d6d1eca5424db81bc5bb4d0010235
[build-ui : push] Writing manifest to image destination
[build-ui : push] Storing signatures
[build-ui : image-digest-exporter-lbbl5] {"level":"info","ts":1584697665.2419577,"logger":"fallback-logger","caller":"logging/config.go:69","msg":"Fetch GitHub commit ID from kodata failed: \"KO_DATA_PATH\" does not exist or is empty"}
[build-ui : image-digest-exporter-lbbl5] {"level":"info","ts":1584697938.3112879,"logger":"fallback-logger","caller":"logging/config.go:69","msg":"Fetch GitHub commit ID from kodata failed: \"KO_DATA_PATH\" does not exist or is empty"}
[build-ui : image-digest-exporter-lbbl5] {"level":"info","ts":1584697938.3113863,"logger":"fallback-logger","caller":"imagedigestexporter/main.go:58","msg":"No index.json found for: ui-image"}
[update-ui-image : patch] deployment.extensions/ui patched
$ oc expose svc vote-ui -n pipelines-tutorial
在控制台上通过S2I部署应用的时候,OpenShift能够自动生成Pipeline来描述构建应用CI/CD的过程。
说明:本部分操作只适用于OpenShift 4.3以上版本的OpenShift Console。
$ oc delete -f https://raw.githubusercontent.com/liuxiaoyu-git/pipelines-tutorial/release-v0.9/pipeline/update_deployment_task.yaml
xiaoyliu@DESKTOP-M6BG8KP C:\MyLab\tekton
$ oc delete -f https://raw.githubusercontent.com/liuxiaoyu-git/pipelines-tutorial/release-v0.9/pipeline/apply_manifest_task.yaml
$ oc delete -f https://raw.githubusercontent.com/liuxiaoyu-git/pipelines-tutorial/release-v0.9/pipeline/pipeline.yaml
$ tkn resource delete --all -f
$ tkn pipelinerun delete --all -f
$ tkn taskrun delete --all -f
$ oc delete deployment --all
$ oc delete rs --all
$ oc delete pod --all
$ oc delete svc --all
$ oc delete route --all
$ oc delete is --all
$ oc get all
No resources found in pipelines-tutorial namespace.
以上对Pipeline的操作还可在VSCode中实现,这需要用到VSCode针对OpenShift的Tekton Pipeline扩展,具体可参见以下链接中的说明,本文不再赘述。
https://marketplace.visualstudio.com/items?itemName=redhat.vscode-tekton-pipelines