Сообщать о состоянии конвейера Tekton в GitLab независимо от того, произошел ли сбой или успех конвейера (используя задачу gitlab-set-status).
Мы уже используем
gitlab-set-status
Задача от Tekton Hub сообщить о состоянии нашего Tekton Pipeline обратно в наш экземпляр GitLab (вот наша установка EKS и установка Tekton , а также пример проекта на gitlab.com ). Нашpipeline.yml
выглядит так и в настоящее время сообщает о
STATE
успех каждый раз, когда запускается Tekton Pipeline:
apiVersion: tekton.dev/v1beta1
kind: Pipeline
metadata:
name: buildpacks-test-pipeline
spec:
params:
- name: IMAGE
type: string
description: image URL to push
- name: SOURCE_URL
type: string
description: A git repo url where the source code resides.
- name: REPO_PATH_ONLY
type: string
description: GitLab group & repo name only (e.g. jonashackt/microservice-api-spring-boot)
- name: SOURCE_REVISION
description: The branch, tag or SHA to checkout.
default: ""
- name: GITLAB_HOST
type: string
description: Your GitLabs host only (e.g. gitlab.com)
- name: TEKTON_DASHBOARD_HOST
type: string
description: The Tekton dashboard host name only
workspaces:
- name: source-workspace # Directory where application source is located. (REQUIRED)
- name: cache-workspace # Directory where cache is stored (OPTIONAL)
tasks:
- name: fetch-repository # This task fetches a repository from github, using the `git-clone` task you installed
taskRef:
name: git-clone
workspaces:
- name: output
workspace: source-workspace
params:
- name: url
value: "$(params.SOURCE_URL)"
- name: revision
value: "$(params.SOURCE_REVISION)"
- name: subdirectory
value: ""
- name: deleteExisting
value: "true"
- name: buildpacks # This task uses the `buildpacks` task to build the application
taskRef:
name: buildpacks
runAfter:
- fetch-repository
workspaces:
- name: source
workspace: source-workspace
- name: cache
workspace: cache-workspace
params:
- name: APP_IMAGE
value: "$(params.IMAGE)"
- name: BUILDER_IMAGE
value: paketobuildpacks/builder:base # This is the builder we want the task to use (REQUIRED)
- name: report-pipeline-end-to-gitlab
taskRef:
name: "gitlab-set-status"
runAfter:
- buildpacks
params:
- name: "STATE"
value: "success"
- name: "GITLAB_HOST_URL"
value: "$(params.GITLAB_HOST)"
- name: "REPO_FULL_NAME"
value: "$(params.REPO_PATH_ONLY)"
- name: "GITLAB_TOKEN_SECRET_NAME"
value: "gitlab-api-secret"
- name: "GITLAB_TOKEN_SECRET_KEY"
value: "token"
- name: "SHA"
value: "$(params.SOURCE_REVISION)"
- name: "TARGET_URL"
value: "$(params.TEKTON_DASHBOARD_HOST)/#/namespaces/default/pipelineruns/$(context.pipelineRun.name)"
- name: "CONTEXT"
value: "tekton-pipeline"
- name: "DESCRIPTION"
value: "Finished building your commit in Tekton"
Как мы можем улучшить наш Tekton Pipeline, чтобы правильно сообщать о состоянии GitLab независимо от каких-либо неудач или успехов?
1 ответ
В v0.14 Tekton представила так называемые Tasks, которые запускаются в конце каждого
Pipeline
- независимо от того, какая Задача не удалась или удалась. Как говорится в документах :
наконец, задачи гарантированно будут выполняться параллельно после завершения всех PipelineTasks в задачах, независимо от успеха или ошибки.
В целом
finally
задачи выглядят так:
spec:
tasks:
- name: tests
taskRef:
name: integration-test
finally:
- name: cleanup-test
taskRef:
name: cleanup
Но как нам создать соответствующий в нашей Задаче? Используя выражения внутри нашего
finally
задачи , которые мы можем запустить, основываясь на общем статусе конвейера (или совокупном статусе конвейера) :
finally:
- name: notify-any-failure # executed only when one or more tasks fail
when:
- input: $(tasks.status)
operator: in
values: ["Failed"]
taskRef:
name: notify-failure
Мы получаем совокупный статус выполнения, просто используя
$(tasks.status)
. Заявлено, что эта переменная имеет 4 возможных статуса:
-
Succeeded
("Все задачи выполнены успешно") -
Completed
(«все задачи успешно завершены, включая одну или несколько пропущенных задач»)
-> что может быть переведено в значение Tasks
success
.
-
Failed
(«одна или более задач не удалась») - («нет доступного совокупного статуса выполнения (т. е. ничего из вышеперечисленного), одна или несколько задач могут быть ожидающими/выполняемыми/отменеными/временными ожиданиями»)
-> который может быть переведен в
gitlab-set-status
Задачи
STATE
ценность
failed
. За
None
это действительно только потому, что мы находимся в
finally task
, поскольку
pending/running
в противном случае также может означать, что конвейер находится в хорошем состоянии.
Имея 4 состояния, которые нам нужно проверить в наших выражениях, нужно ли нам реализовывать отдельную задачу finally для каждого из них? Нет, поскольку, к счастью,
when
выражения «values — это массив строковых значений».. Так что мы можем сделать
when:
- input: $(tasks.status)
operator: in
values: [ "Failed", "None" ]
а также
when:
- input: $(tasks.status)
operator: in
values: [ "Succeeded", "Completed" ]
Наконец, это приводит к блокировке нашего Tekton Pipeline (и реализации двух задач finally).
report-pipeline-failed-to-gitlab
а также
report-pipeline-success-to-gitlab
):
...
finally:
- name: report-pipeline-failed-to-gitlab
when:
- input: $(tasks.status)
operator: in
values: [ "Failed", "None" ] # see aggregated status https://tekton.dev/docs/pipelines/pipelines/#using-aggregate-execution-status-of-all-tasks
taskRef:
name: "gitlab-set-status"
params:
- name: "STATE"
value: "failed"
- name: "GITLAB_HOST_URL"
value: "$(params.GITLAB_HOST)"
- name: "REPO_FULL_NAME"
value: "$(params.REPO_PATH_ONLY)"
- name: "GITLAB_TOKEN_SECRET_NAME"
value: "gitlab-api-secret"
- name: "GITLAB_TOKEN_SECRET_KEY"
value: "token"
- name: "SHA"
value: "$(params.SOURCE_REVISION)"
- name: "TARGET_URL"
value: "$(params.TEKTON_DASHBOARD_HOST)/#/namespaces/default/pipelineruns/$(context.pipelineRun.name)"
- name: "CONTEXT"
value: "tekton-pipeline"
- name: "DESCRIPTION"
value: "An error occurred building your commit in Tekton"
- name: report-pipeline-success-to-gitlab
when:
- input: $(tasks.status)
operator: in
values: [ "Succeeded", "Completed" ] # see aggregated status https://tekton.dev/docs/pipelines/pipelines/#using-aggregate-execution-status-of-all-tasks
taskRef:
name: "gitlab-set-status"
params:
- name: "STATE"
value: "success"
- name: "GITLAB_HOST_URL"
value: "$(params.GITLAB_HOST)"
- name: "REPO_FULL_NAME"
value: "$(params.REPO_PATH_ONLY)"
- name: "GITLAB_TOKEN_SECRET_NAME"
value: "gitlab-api-secret"
- name: "GITLAB_TOKEN_SECRET_KEY"
value: "token"
- name: "SHA"
value: "$(params.SOURCE_REVISION)"
- name: "TARGET_URL"
value: "$(params.TEKTON_DASHBOARD_HOST)/#/namespaces/default/pipelineruns/$(context.pipelineRun.name)"
- name: "CONTEXT"
value: "tekton-pipeline"
- name: "DESCRIPTION"
value: "Finished building your commit in Tekton"
О выполнении нашего конвейера Tekton теперь следует правильно сообщать в GitLab. Неудачи выглядят так:
Успешные пайплайны выглядят так: