[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