Dans cet article, nous allons créer un pipeline d'intégration continue (CI) avec Tekton , un framework open source pour la création de pipelines CI / CD dans Kubernetes.
Nous allons provisionner un cluster Kubernetes local via kind et installer Tekton dessus. Après cela, nous allons créer un pipeline en deux étapes qui exécutera des tests unitaires de l'application, créerons une image Docker et la pousserons vers DockerHub.
C'est la partie 1 sur 2 dans laquelle nous installerons Tekton et créerons une tâche qui exécute un test de notre application. La deuxième partie est disponible ici .
Créer un cluster k8s
Nous utilisons kind pour créer un cluster Kubernetes pour notre installation Tekton:
$ kind create cluster --name tekton
Installation de Tekton
Nous pouvons installer Tekton en utilisant le fichier release.yaml du dernier référentiel tektoncd / pipeline sur 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.
Tous les exemples de code sont disponibles ici .
Dans la partie suivante, nous allons créer une tâche qui utilisera Kaniko pour créer une image Docker pour notre application, puis la soumettre à DockerHub. Ensuite, nous créerons un pipeline qui exécutera séquentiellement nos deux tâches (exécuter des tests d'application, créer et soumettre).
La partie 2 est disponible ici .