Сообщать о состоянии конвейера 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. Неудачи выглядят так:

Успешные пайплайны выглядят так:

Другие вопросы по тегам