[Book] [OK!] GitOps Cookbook: 06. Cloud Native CI/CD: Tekton: 6.7 Create a Tekton Pipeline to Build and Deploy an App to Kubernetes


Задача:
Создать Pipeline для компиляции, упаковки и деплоя приложения с помощью tekton в kubernetes


Делаю:
2025.12.03


Вариант с использованием Task подготовленными профессионалами


Задача:
Создать Pipeline для компиляции, упаковки и деплоя приложения с помощью tekton в kubernetes


Уже созданы на предыдущем шаге:

  • Secret на hub.docker.com
  • ServiceAccount
  • Role
  • RoleBinding


// Удаляем созданные на прошлом шагу
$ kubectl delete svc tekton-greeter
$ kubectl delete deployment tekton-greeter


https://hub.tekton.dev


$ tkn hub install task git-clone
$ tkn hub install task maven
$ tkn hub install task buildah
$ tkn hub install task kubernetes-actions


$ kubectl get tasks
NAME                 AGE
buildah              66s
git-clone            82s
kubectl              18m
kubernetes-actions   62s
maven                70s


$ cat << 'EOF' | kubectl create -f -
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: app-source-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
EOF


$ kubectl get pvc
NAME             STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
app-source-pvc   Bound    pvc-c675c620-2268-43a3-835d-8a99743edf69   1Gi        RWO            standard       5s


$ envsubst << 'EOF' | cat | kubectl create -f -
apiVersion: tekton.dev/v1
kind: Pipeline
metadata:
  name: tekton-greeter-pipeline-hub
spec:
  params:
  - default: https://github.com/gitops-cookbook/tekton-tutorial-greeter.git
    name: GIT_REPO
    type: string
  - default: master
    name: GIT_REF
    type: string
  - default: webmakaka/tekton-greeter:latest
    name: DESTINATION_IMAGE
    type: string
  - default: kubectl create deploy tekton-greeter --image=webmakaka/tekton-greeter:latest
    name: SCRIPT
    type: string
  - default: ./Dockerfile
    name: CONTEXT_DIR
    type: string
  - default: .
    name: IMAGE_DOCKERFILE
    type: string
  - default: .
    name: IMAGE_CONTEXT_DIR
    type: string
  tasks:
  - name: fetch-repo
    params:
    - name: url
      value: $(params.GIT_REPO)
    - name: revision
      value: $(params.GIT_REF)
    - name: deleteExisting
      value: "true"
    - name: verbose
      value: "true"
    taskRef:
      kind: Task
      name: git-clone
    workspaces:
    - name: output
      workspace: app-source
  - name: build-app
    params:
    - name: GOALS
      value:
      - -DskipTests
      - clean
      - package
    - name: CONTEXT_DIR
      value: $(params.CONTEXT_DIR)
    runAfter:
    - fetch-repo
    taskRef:
      kind: Task
      name: maven
    workspaces:
    - name: maven-settings
      workspace: maven-settings
    - name: source
      workspace: app-source
  - name: build-push-image
    params:
    - name: IMAGE
      value: $(params.DESTINATION_IMAGE)
    - name: DOCKERFILE
      value: $(params.IMAGE_DOCKERFILE)
    - name: CONTEXT
      value: $(params.IMAGE_CONTEXT_DIR)
    runAfter:
    - build-app
    taskRef:
      kind: Task
      name: buildah
    workspaces:
    - name: source
      workspace: app-source
  - name: deploy
    params:
    - name: script
      value: $(params.SCRIPT)
    runAfter:
    - build-push-image
    taskRef:
      kind: Task
      name: kubernetes-actions
  workspaces:
  - name: app-source
  - name: maven-settings
EOF


$ cat << 'EOF' | kubectl create -f -
apiVersion: tekton.dev/v1
kind: PipelineRun
metadata:
  generateName: tekton-greeter-pipeline-hub-
spec:
  taskRunTemplate:
    serviceAccountName: tekton-deployer-sa
  params:
  - name: GIT_REPO
    value: https://github.com/gitops-cookbook/tekton-tutorial-greeter.git
  - name: GIT_REF
    value: "master"
  - name: DESTINATION_IMAGE
    value: webmakaka/tekton-greeter:latest
  - name: CONTEXT_DIR
    value: "quarkus"
  - name: IMAGE_DOCKERFILE
    value: "quarkus/Dockerfile"
  - name: IMAGE_CONTEXT_DIR
    value: "quarkus"
  - name: SCRIPT
    value: |
      kubectl create deploy tekton-greeter --image=webmakaka/tekton-greeter:latest
  pipelineRef:
    name: tekton-greeter-pipeline-hub
  workspaces:
  - name: app-source
    persistentVolumeClaim:
      claimName: app-source-pvc
  - emptyDir: {}
    name: maven-settings
EOF


// Аналогичный запуск в командной строке
// OK!
$ tkn pipeline start tekton-greeter-pipeline-hub \
    --serviceaccount='tekton-deployer-sa' \
    --param GIT_REPO='https://github.com/gitops-cookbook/tekton-tutorial-greeter.git' \
    --param GIT_REF='master' \
    --param CONTEXT_DIR='quarkus' \
    --param DESTINATION_IMAGE=webmakaka/tekton-greeter:latest \
    --param IMAGE_DOCKERFILE='quarkus/Dockerfile' \
    --param IMAGE_CONTEXT_DIR='quarkus' \
    --param SCRIPT='kubectl create deploy tekton-greeter --image=webmakaka/tekton-greeter:latest' \
    --workspace name=app-source,claimName=app-source-pvc \
    --workspace name=maven-settings,emptyDir="" \
    --use-param-defaults \
    --showlog


$ tkn pipelinerun ls
NAME                                    STARTED        DURATION   STATUS
tekton-greeter-pipeline-hub-run-42pdx   2 minutes ago    1m39s      Succeeded


$ tkn pipelinerun logs tekton-greeter-pipeline-hub-run-42pdx -f


$ kubectl get deploy
NAME             READY   UP-TO-DATE   AVAILABLE   AGE
tekton-greeter   1/1     1            1           73


$ kubectl expose deploy/tekton-greeter --port 8080
$ kubectl port-forward svc/tekton-greeter 8080:8080


$ curl localhost:8080
Meeow!! from Tekton 😺🚀⏎


Посмотреть результаты в UI

$ kubectl --namespace tekton-pipelines port-forward svc/tekton-dashboard 8080:9097


$ localhost:8080 -> PipelineRuns