En este artículo, vamos a construir una canalización de integración continua (CI) con Tekton , un marco de código abierto para construir canalizaciones CI / CD en Kubernetes.
Vamos a aprovisionar un clúster de Kubernetes local a través de kind e instalar Tekton en él. Después de eso, crearemos una canalización de dos pasos que ejecutará pruebas unitarias de la aplicación, creará una imagen de Docker y la enviará a DockerHub.
Esta es la parte 1 de 2 en la que instalaremos Tekton y crearemos una tarea que ejecuta una prueba de nuestra aplicación. La segunda parte está disponible aquí .
Crear un clúster de k8s
Usamos kind para crear un clúster de Kubernetes para nuestra instalación de Tekton:
$ kind create cluster --name tekton
Instalación de Tekton
Podemos instalar Tekton usando el archivo release.yaml del último repositorio de tektoncd / pipeline en GitHub:
$ kubectl apply -f https://storage.googleapis.com/tekton-releases/pipeline/previous/v0.20.1/release.yaml
Tekton tekton-pipelines. , , .
$ kubectl get pods --namespace tekton-pipelines NAME READY STATUS RESTARTS AGE tekton-pipelines-controller-74848c44df-m42gf 1/1 Running 0 20s tekton-pipelines-webhook-6f764dc8bf-zq44s 1/1 Running 0 19s
Tekton CLI
, , , kubectl, Tekton. , , .
Homebrew:
$ brew tap tektoncd/tools $ brew install tektoncd/tools/tektoncd-cli $ tkn version Client version: 0.16.0 Pipeline version: v0.20.1
Tekton (CRD) Kubernetes, . :
: , ( CircleCI Job).
: ( CircleCI Workflow)
PipelineResource: Pipeline (, git tar)
:
TaskRun
:PipelineRun
:
, , TaskRun
. : PipelineRun
.
Pipeline Go, . , Dockerfile src/
.
git. 01-task-test.yaml :
apiVersion: tekton.dev/v1beta1 kind: Task metadata: name: test spec: resources: inputs: - name: repo type: git steps: - name: run-test image: golang:1.14-alpine workingDir: /workspace/repo/src command: ["go"] args: ["test"]
resources: , . ( run-test) git tekton , PipelineResource.
apiVersion: tekton.dev/v1alpha1 kind: PipelineResource metadata: name: arthurk-tekton-example spec: type: git params: - name: url value: https://github.com/arthurk/tekton-example - name: revision value: master
git git /workspace/$input_name
. repo, /workspace/repo
. foobar, /workspace/foobar
.
(steps:
) Docker, . golang Docker, Go .
go test . /workspace/repo
, tekton Go src
. , : /workspace/repo/src
.
(go test
), , (go
) args (test
) YAML.
Task PipelineResource kubectl:
$ kubectl apply -f 01-task-test.yaml task.tekton.dev/test created $ kubectl apply -f 02-pipelineresource.yaml pipelineresource.tekton.dev/arthurk-tekton-example created
, TaskRun
, (PipelineResource
).
apiVersion: tekton.dev/v1beta1 kind: TaskRun metadata: name: testrun spec: taskRef: name: test resources: inputs: - name: repo resourceRef: name: arthurk-tekton-example
(taskRef
— test) git tekton-example (resourceRef
— PipelineResource
arthurk-tekton-example
) .
kubectl, Pods TaskRun. Pod Init:0/2
PodInitializing
, :
$ kubectl apply -f 03-taskrun.yaml pipelineresource.tekton.dev/arthurk-tekton-example created $ kubectl get pods NAME READY STATUS RESTARTS AGE testrun-pod-pds5z 0/2 Completed 0 4m27s $ kubectl get taskrun NAME SUCCEEDED REASON STARTTIME COMPLETIONTIME testrun True Succeeded 70s 57s
, . testrun-pod-pds5z
( ).
$ kubectl logs testrun-pod-pds5z --all-containers {"level":"info","ts":1588477119.3692405,"caller":"git/git.go:136","msg":"Successfully cloned https://github.com/arthurk/tekton-example @ 301aeaa8f7fa6ec01218ba6c5ddf9095b24d5d98 (grafted, HEAD, origin/master) in path /workspace/repo"} {"level":"info","ts":1588477119.4230678,"caller":"git/git.go:177","msg":"Successfully initialized and updated submodules in path /workspace/repo"} PASS ok _/workspace/repo/src 0.003s
, . Tekton CLI, , .
Tekton CLI
Tekton CLI .
, TaskRun, , ( test), TaskRun ( ) :
$ tkn task start test --inputresource repo=arthurk-tekton-example --showlog Taskrun started: test-run-8t46m Waiting for logs to be available... [git-source-arthurk-tekton-example-dqjfb] {"level":"info","ts":1588477372.740875,"caller":"git/git.go:136","msg":"Successfully cloned https://github.com/arthurk/tekton-example @ 301aeaa8f7fa6ec01218ba6c5ddf9095b24d5d98 (grafted, HEAD, origin/master) in path /workspace/repo"} [git-source-arthurk-tekton-example-dqjfb] {"level":"info","ts":1588477372.7954974,"caller":"git/git.go:177","msg":"Successfully initialized and updated submodules in path /workspace/repo"} [run-test] PASS [run-test] ok _/workspace/repo/src 0.006s
Tekton Kubernetes, , TaskRun YAML, Tekton CLI tkn.
Todo el código de muestra está disponible aquí .
En la siguiente parte, crearemos una tarea que usará Kaniko para crear una imagen de Docker para nuestra aplicación y luego enviarla a DockerHub. Luego, crearemos una canalización que ejecutará nuestras dos tareas secuencialmente (ejecutar pruebas de aplicación, compilar y enviar).
La parte 2 está disponible aquí .