Création de pipelines CI avec Tekton (dans Kubernetes). Partie 1/2

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.







02-pipelineresource.yaml:







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



).







03-taskrun.yaml :







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 .








All Articles