From efed2e96416f8623e8fce8bd9d4dbb3e35255805 Mon Sep 17 00:00:00 2001 From: Andrea Frittoli Date: Wed, 23 Sep 2020 10:23:08 +0100 Subject: [PATCH] Add the ability to specify secret name and key Rather than forcing task users to create a secret with a fixed name, allow setting the secret name and key as parameter. The new parameters are optional, in the sense that they default to the previous hardcoded values. --- task/github-set-status/0.2/README.md | 79 +++++++++++ .../0.2/github-set-status.yaml | 127 ++++++++++++++++++ 2 files changed, 206 insertions(+) create mode 100644 task/github-set-status/0.2/README.md create mode 100644 task/github-set-status/0.2/github-set-status.yaml diff --git a/task/github-set-status/0.2/README.md b/task/github-set-status/0.2/README.md new file mode 100644 index 00000000..7bc612b3 --- /dev/null +++ b/task/github-set-status/0.2/README.md @@ -0,0 +1,79 @@ +# GitHub Set Status + +GitHub Set Status is part of a collection of GitHub tasks to help working +with the [GitHub API](https://docs.github.com/en/rest/reference). + +## GitHub token + +This task expects a secret set in the kubernetes secret `github` +with a GitHub token in the key `token`; you can easily create it on the +command line with `kubectl` like this : + +``` +kubectl create secret generic github --from-literal token="MY_TOKEN" +``` + +## Set Status on a Commit/PR + +The `github-set-status` task uses the [status api](https://docs.github.com/en/rest/reference/repos#statuses) +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. + +### Install the Task + +``` +kubectl apply -f https://raw.githubusercontent.com/tektoncd/catalog/master/task/github-set-status/0.2/github-set-status.yaml +``` + +### Parameters + +* **REPO_FULL_NAME**: The GitHub repository full name, _e.g:_ `tektoncd/catalog` +* **GITHUB_HOST_URL**: The GitHub host domain _default:_ `api.github.com` +* **API_PATH_PREFIX**: The GitHub Enterprise has a prefix for the API path. _e.g:_ `/api/v3` +* **SHA**: The commit SHA to set the status for _e.g_: `tektoncd/catalog` +* **TARGET_URL**: 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. For example you can link to a + [dashboard](https://github.com/tektoncd/dashboard) URL so users can follow a + Pipeline/Task run. +* **DESCRIPTION**: A short description of the status. _e.g:_ `Building your PR` +* **CONTEXT**: The GitHub context, A string label to differentiate this status + from the status of other systems. _e.g:_ `continuous-integration/tekton` +* **STATE**: The state of the status. Can be one of the following `error`, + `failure`, `pending`, or `success`. +* **GITHUB_TOKEN_SECRET_NAME** \[optional\]: The name of the kubernetes secret that + contains the GitHub token. Default value: `github` +* **GITHUB_TOKEN_SECRET_KEY** \[optional\]: The key within the kubernetes secret that + contains the GitHub token. Default value: `token` + +## Usage + +This TaskRun sets a commit on GitHub to `pending` getting tested by the CI. + +```yaml +--- +apiVersion: tekton.dev/v1beta1 +kind: TaskRun +metadata: + labels: + tekton.dev/task: github-set-status + name: github-set-status-run-on-commit-bd93 +spec: + taskRef: + kind: Task + name: github-set-status + params: + - name: REPO_FULL_NAME + value: tektoncd/catalog + - name: SHA + value: bd93869b489258cef567ccf85e7ef6bc0d6949ea + - name: DESCRIPTION + value: "Build has started" + - name: STATE + value: pending + - name: TARGET_URL + value: https://tekton/dashboard/taskrun/log +``` diff --git a/task/github-set-status/0.2/github-set-status.yaml b/task/github-set-status/0.2/github-set-status.yaml new file mode 100644 index 00000000..3a923370 --- /dev/null +++ b/task/github-set-status/0.2/github-set-status.yaml @@ -0,0 +1,127 @@ +--- +apiVersion: tekton.dev/v1beta1 +kind: Task +metadata: + name: github-set-status + labels: + app.kubernetes.io/version: "0.2" + annotations: + tekton.dev/pipelines.minVersion: "0.12.1" + tekton.dev/tags: github + tekton.dev/displayName: "set github status" +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 + steps: + - name: set-status + env: + - name: GITHUBTOKEN + valueFrom: + secretKeyRef: + name: $(params.GITHUB_TOKEN_SECRET_NAME) + key: $(params.GITHUB_TOKEN_SECRET_KEY) + + image: registry.access.redhat.com/ubi8/python-38:1-34.1599745032 + script: | + #!/usr/libexec/platform-python + import json + import os + import http.client + + 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) + + conn = http.client.HTTPSConnection("$(params.GITHUB_HOST_URL)") + r = conn.request( + "POST", + status_url, + body=json.dumps(data), + headers={ + "User-Agent": "TektonCD, the peaceful cat", + "Authorization": "Bearer " + os.environ["GITHUBTOKEN"], + "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) ")