Pipelines com o Tekton - Introdução

Posted on Mar 1, 2021

Tekton


Características

  • É um projeto Open Source mantido pela CNCF;
  • Todas os elementos são objetos do Kubernetes;
  • É focado em reutilização(TriggerBinding, TriggerTemplate, Pipeline, Task);
  • Seu funcionamento se dá pela implementação de CRDs(Custom Resource Definition) customizados para cada um dos elementos descritos posteriormente.

Ecossistema

  • Tekton Triggers - Pacote com os CRDs referentes a escuta de eventos e como respondê-los;
  • Tekton Pipelines - Pacote com os CRDs referentes a construção de tasks, recursos e elementos referentes a pipeline;
  • Tekton Dashboard - Interface para consumir informações de execuções de pipelines;
  • Tekton Hub - Coleção de tasks disponíveis para execução de determinadas tarefas;
  • CLI Tool - Ferramenta de linha de comando para consumir informações e executar ações no ecossistema;

Tekton Triggers

  • EventListener - Elemento responsável por interceptar as requisições feitas ao endereço do Ingress;
  • Trigger - Elemento responsável por configurar os gatilhos que ativarão determinadas TriggerTemplates;
  • TriggerBinding - Permite a captura de informações de um evento, e transformação em um parâmetro consumível pela Pipeline;
  • TriggerTemplate - Cria um template de invocação de algum elemento do pacote de pipelines. (Eg. PipelineRun, TaskRun).

EventListener

  • Cria uma Service que pode ser anexado a um Ingress para receber requisições externas (eg. Endereço utilizado no webhook do repositório);
  • É a entidade que aglomerá os Triggers que tratarão as requisições ao EventListener.

Trigger

  • O chaveamento entre qual pipeline deve ser executada é feito utilizando interceptors;
  • Por padrão possui interceptors para Github, Gitlab, Github e CEL.
  • O interceptor CEL é o mais versátil, definindo filtros e overlays às informações.
    • Filtros: Informa quais campos da requisição vai disparar o gatilho. (eg. "header.match('X-GitHub-Event', 'pull_request')");
    • Overlays: Executa transformações em campos da requisição, para consumo na pipeline. (eg. "body.pull_request.head.sha.truncate(7)").

TriggerBinding

  • Traduz campos da requisição para parâmetros que serão consumidos na pipeline.
  • Os campos do envolope HTTP disponíveis são os Headers e Body.
- name: triggered-event
  value: $(header.X-Github-Event)
- name: event-action
  value: $(body.action)

TriggerTemplate

  • Neste objeto são configurados os templates padrão para cada evento disparado em um dos Triggers;
  • Recebe os parâmetros de uma TriggerBinding e os atribui a um PipelineRun ou TaskRun;

graph TD;
    GithubWebhookEvent(Github Event)-->|Envia um json para o webhook|IngressEventListener(Ingress);
    IngressEventListener-->
|Chama a Service exposta|EventListener(EventListener);
    EventListener -->|Carrega todos os triggers configurados| Trigger;
    Trigger -->|Passa o conteúdo do evento| TriggerBinding;
    TriggerBinding -->|Cria variáveis que serão consumidas | TriggerTemplate;
    TriggerTemplate -->|Invoca uma execução de pipeline| PipelineRun;

Tekton Pipelines

  • Pipeline - Objeto que agrupa Tasks comuns à pipeline;
  • PipelineRun - Instancia e executa uma Pipeline;
  • PipelineResource - Objetos que serão utilizados como entradas/saídas de uma Task;
  • Task - É uma coleção de Steps a serem executados para conclusão de uma determinada tarefa;
  • TaskRun - Instancia e executa uma determinada Task;

Pipeline

  • Agrupa Tasks para um fim específico;
  • Os parâmetros são inputados por um objeto PipelineRun;
  • Pode possuir recursos que são esperados.(Eg. repositório, pullrequest, imagem docker)
  • Vários repositórios podem consumir a mesma pipeline, com parâmetros diferentes.
  • Os volumes, utilizados para transição de informações entre Tasks são denominados workspaces.
  • Workspaces podem ser utilizados para reutilizar bibliotecas e acelerar o processo de build (node_modules(nodejs/frontend), .terraform(:P), .m2(JAVA), vendor(PHP))

PipelineResource

  • Ajudam a abstrair os recursos consumidos por uma Pipeline/Task;
  • Podem ser de entrada(input), ou de saída(output);
  • Podem ser dos tipos: Git, PullRequest, Image, Cluster, GCS e CloudEvent.

Task

  • O padrão init-container é utilizado para garantir a execução ordenada das tasks
  • É executada em um Pod no cluster;
  • Possui uma versão que transpõem o namespace ClusterTask;
  • Cada Step dentro de uma Task é traduzido em um container sendo executado.
  • Como um objeto do Kubernetes, pode consumir outros objetos, como ConfigMaps e Secrets.

apiVersion: tekton.dev/v1beta1
kind: ClusterTask
metadata:
  name: webhook-debug
  annotations:
    description: |
            Imprime as informações informadas pelo webhook
spec:
  params:
    - name: pipelinerun-name
      description: Nome do pipelinerun executado
    - name: repo-name
      description: Nome do repositório
  steps:
    - name: print-webhook-informations
      image: alpine:latest
      script: |
        #!/usr/bin/env sh
        echo "$(inputs.params.pipelinerun-name)"
        echo "$(inputs.params.repo-name)"        

graph TD;
    PipelineRun -->|Instancia uma pipeline com determinados parâmetros| Pipeline;
    Pipeline -->|Instancia uma lista de tarefas| TaskRun;
    TaskRun -->|Instancia uma tarefa| Task;
    Task -->|Executa procedimentos para execução de uma tarefa| Steps;