1
0
mirror of https://github.com/tektoncd/catalog.git synced 2024-11-26 06:23:37 +00:00

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.
This commit is contained in:
Andrea Frittoli 2020-09-23 10:23:08 +01:00 committed by tekton-robot
parent 1f6d742aab
commit efed2e9641
2 changed files with 206 additions and 0 deletions

View File

@ -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
```

View File

@ -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) ")