charts/pipelines-library/templates/tasks/gitlab-set-status.yaml (132 lines of code) (raw):
{{ if .Values.pipelines.deployableResources.tasks }}
apiVersion: tekton.dev/v1
kind: Task
metadata:
name: gitlab-set-status
labels:
app.kubernetes.io/version: "0.1"
annotations:
tekton.dev/pipelines.minVersion: "0.12.1"
tekton.dev/categories: Git
tekton.dev/tags: gitlab, git
tekton.dev/displayName: "Set Gitlab commit status"
tekton.dev/platforms: "linux/amd64"
spec:
description: >-
This task will set the status of the CI job to the specified value along
with a link to the specified target URL where developers can follow the
progress of the CI job.
The `gitlab-set-status` task allows external services to mark GitLab commits
with an `error`, `failure`, `pending`, or `success` state, which is then
reflected in merge requests involving those commits. Statuses include as well a
`description` and a `target_url`, to give the user informations about the CI
statuses or a direct link to the full log.
params:
- name: GITLAB_HOST_URL
description: |
The GitLab host, adjust this if you run a GitLab enterprise. In EDP we use git_ssh_url
value from the event payload, format: "git@example.com:mike/diaspora.git"
default: "gitlab.com"
type: string
- name: API_PATH_PREFIX
description: |
The API path prefix, GitLab Enterprise has a prefix e.g. /api/v4
default: "/api/v4"
type: string
- name: REPO_FULL_NAME
description: |
The GitLab repository full name, e.g.: tektoncd/catalog
type: string
- name: GITLAB_TOKEN_SECRET_NAME
description: |
The name of the kubernetes secret that contains the GitLab token, default: gitlab-api-secret
type: string
default: gitlab-api-secret
- name: GITLAB_TOKEN_SECRET_KEY
description: |
The key within the kubernetes secret that contains the GitLab token, default: token
type: string
default: token
- name: SHA
description: |
Commit SHA to set the status for.
type: string
- name: TARGET_URL
description: |
The target URL to associate with this status. This URL will be linked
from the GitLab UI to allow users to easily see the source of the
status.
type: string
- name: DESCRIPTION
description: |
A short description of the status.
type: string
- name: CONTEXT
description: |
The GitLab context, A string label to differentiate this status from
the status of other systems. ie: "continuous-integration/tekton"
default: "continuous-integration/tekton"
type: string
- name: STATE
description: |
The state of the status. Can be one of the following `pending`,
`running`, `success`, `failed`, or `canceled`.
type: string
steps:
- name: set-status
image: registry.access.redhat.com/ubi8/python-38@sha256:af6f93b81f9313de95966e8cd681edb9dbcb5fdbddc5a4cc365af8e4534096ef
script: |
#!/usr/libexec/platform-python
import os
import sys
import json
import http.client
import urllib.parse
GITLAB_TOKEN = os.getenv("GITLAB_TOKEN")
GITLAB_HOST_URL = "ssh://$(params.GITLAB_HOST_URL)"
API_PATH_PREFIX = "$(params.API_PATH_PREFIX)"
REPO_FULL_NAME = "$(params.REPO_FULL_NAME)"
SHA = "$(params.SHA)"
STATE = "$(params.STATE)"
CONTEXT = "$(params.CONTEXT)"
TARGET_URL = "$(params.TARGET_URL)"
DESCRIPTION = "$(params.DESCRIPTION)"
headers = {
"User-Agent": "TektonCD, the peaceful cat",
"Authorization": f"Bearer {GITLAB_TOKEN}",
}
URLENCODED_REPO_NAME = urllib.parse.quote(REPO_FULL_NAME, safe="")
params = {
"state": STATE,
"context": CONTEXT,
"target_url": TARGET_URL,
"description": DESCRIPTION
}
encoded_params = urllib.parse.urlencode(params)
api_url = f"{API_PATH_PREFIX}/projects/{URLENCODED_REPO_NAME}/statuses/{SHA}?{encoded_params}"
# we need to adapt to EDP approach and extract the host from the git_ssh_url
# which is in the format: git@example.com:mike/diaspora.git
GITLAB_HOST_URL = urllib.parse.urlparse(GITLAB_HOST_URL).hostname
print(f"POST to {GITLAB_HOST_URL}{api_url}")
if GITLAB_HOST_URL.startswith("http://"):
conn = http.client.HTTPConnection(GITLAB_HOST_URL[7:])
elif GITLAB_HOST_URL.startswith("https://"):
conn = http.client.HTTPSConnection(GITLAB_HOST_URL[8:])
else:
conn = http.client.HTTPSConnection(GITLAB_HOST_URL)
try:
conn.request("POST", api_url, headers=headers)
resp = conn.getresponse()
if not str(resp.status).startswith("2"):
print(f"{resp.status} | Unable to set status")
response_data = json.dumps(json.loads(resp.read()), indent=4)
print(response_data)
sys.exit(1)
else:
print(f"Just set status of {REPO_FULL_NAME}#{SHA} to {STATE}")
finally:
conn.close()
env:
- name: GITLAB_TOKEN
valueFrom:
secretKeyRef:
name: $(params.GITLAB_TOKEN_SECRET_NAME)
key: $(params.GITLAB_TOKEN_SECRET_KEY)
{{ end }}