--- apiVersion: tekton.dev/v1beta1 kind: Task metadata: name: github-set-status labels: app.kubernetes.io/version: "0.2" annotations: tekton.dev/categories: Git tekton.dev/pipelines.minVersion: "0.12.1" tekton.dev/tags: github tekton.dev/displayName: "set github status" tekton.dev/platforms: "linux/amd64,linux/s390x,linux/ppc64le" tekton.dev/deprecated: "true" spec: description: >- This task will set the status of the CI job to the specified value along witha link to the specified target URL where developers can follow the progress of the CI job. The `github-set-status` task allows external services to mark GitHub commits with an `error`, `failure`, `pending`, or `success` state, which is then reflected in pull 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: GITHUB_HOST_URL description: | The GitHub host, adjust this if you run a GitHub enteprise. default: "api.github.com" type: string - name: API_PATH_PREFIX description: | The API path prefix, GitHub Enterprise has a prefix e.g. /api/v3 default: "" type: string - name: REPO_FULL_NAME description: | The GitHub repository full name, e.g.: tektoncd/catalog type: string - name: GITHUB_TOKEN_SECRET_NAME description: | The name of the kubernetes secret that contains the GitHub token, default: github type: string default: github - name: GITHUB_TOKEN_SECRET_KEY description: | The key within the kubernetes secret that contains the GitHub 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 GitHub 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 GitHub 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 `error`, `failure`, `pending`, or `success`. type: string - name: AUTH_TYPE description: | The type of authentication to use. You could use the less secure "Basic" for example type: string default: Bearer volumes: - name: githubtoken secret: secretName: $(params.GITHUB_TOKEN_SECRET_NAME) steps: - name: set-status volumeMounts: - name: githubtoken mountPath: /etc/github-set-status image: registry.access.redhat.com/ubi8/python-38:1-34.1599745032 script: | #!/usr/libexec/platform-python """This script will set the CI status on GitHub PR""" import json import http.client github_token = open("/etc/github-set-status/$(params.GITHUB_TOKEN_SECRET_KEY)", "r").read() status_url = "$(params.API_PATH_PREFIX)" + "/repos/$(params.REPO_FULL_NAME)/" + \ "statuses/$(params.SHA)" data = { "state": "$(params.STATE)", "target_url": "$(params.TARGET_URL)", "description": "$(params.DESCRIPTION)", "context": "$(params.CONTEXT)" } print("Sending this data to GitHub: ") print(data) authHeader = "$(params.AUTH_TYPE) " + github_token conn = http.client.HTTPSConnection("$(params.GITHUB_HOST_URL)") conn.request( "POST", status_url, body=json.dumps(data), headers={ "User-Agent": "TektonCD, the peaceful cat", "Authorization": authHeader, "Accept": "application/vnd.github.v3+json ", }) resp = conn.getresponse() if not str(resp.status).startswith("2"): print("Error: %d" % (resp.status)) print(resp.read()) else: print("GitHub status '$(params.STATE)' has been set on " "$(params.REPO_FULL_NAME)#$(params.SHA) ")