Criação de pipelines de CI com Tekton (dentro do Kubernetes). Parte 1/2

Neste artigo, vamos construir um pipeline de integração contínua (CI) com Tekton , uma estrutura de código aberto para construir pipelines de CI / CD no Kubernetes.







Vamos provisionar um cluster Kubernetes local por meio do tipo e instalar o Tekton nele. Depois disso, criaremos um pipeline de duas etapas que executará testes de unidade do aplicativo, construiremos uma imagem Docker e enviaremos por push para DockerHub.







Esta é a parte 1 de 2 na qual instalaremos o Tekton e criaremos uma tarefa que executa um teste de nosso aplicativo. A segunda parte está disponível aqui .







Criação de um cluster k8s



Usamos kind para criar um cluster Kubernetes para nossa instalação Tekton:







$ kind create cluster --name tekton
      
      





Instalando Tekton



Podemos instalar o Tekton usando o arquivo release.yaml do repositório tektoncd / pipeline mais recente no 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.







Todo o código de amostra está disponível aqui .







Na próxima parte, vamos criar uma tarefa que usará Kaniko para construir uma imagem Docker para nosso aplicativo e, em seguida, enviá-la ao DockerHub. Em seguida, criaremos um pipeline que executará sequencialmente ambas as nossas tarefas (executar testes de aplicativo, construir e enviar).







A parte 2 está disponível aqui .








All Articles