-
Notifications
You must be signed in to change notification settings - Fork 110
/
tekton-kind-label.yaml
102 lines (96 loc) · 3.07 KB
/
tekton-kind-label.yaml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
apiVersion: tekton.dev/v1beta1
kind: Task
metadata:
name: kind-label
namespace: tekton-ci
spec:
description: |
Verifies that a PR has one valid kind label
params:
- name: labels
description: The labels attached to the Pull Request
volumes:
- name: label-config-v2
configMap:
name: label-config-v2
stepTemplate:
env:
- name: HOME
value: /tekton/home
steps:
- name: install-pyyaml
image: python:3-alpine
script: |
pip install pyyaml --user
- name: check-labels
image: python:3-alpine
volumeMounts:
- name: label-config-v2
mountPath: /etc/config
env:
- name: LABELS
value: $(params.labels)
script: |
#!/usr/bin/env python
import json
import yaml
import sys
import os
prLabelsText = os.getenv('LABELS')
prLabels = json.loads(prLabelsText)
availableLabels = None
with open("/etc/config/labels.yaml", "r") as stream:
availableLabels = yaml.safe_load(stream)["default"]["labels"]
availableKindLabels = {x.get("name"):x.get("description") for x in availableLabels if x.get("name").startswith("kind/")}
foundKindLabels = set([x.get("name") for x in prLabels if x.get("name").startswith("kind/") and x.get("name")])
validKindLabels = set([x for x in foundKindLabels if x in availableKindLabels])
# Check that we have one and only one kind label
foundLabels = len(validKindLabels)
if (foundLabels > 1 or foundLabels == 0):
msg = "Error: {} valid \"kind/*\" labels found".format(foundLabels)
if foundLabels > 1:
msg += "({})".format(validKindLabels)
msg += ", expecting exactly one."
invalidKindLabels = foundKindLabels - validKindLabels
if len(invalidKindLabels) > 0:
msg += " Invalid labels found: {}".format(invalidKindLabels)
print(msg)
print("\nAvailable \"kind/*\" labels are:")
for label, description in availableKindLabels.items():
print("\t{}: {}".format(label, description))
# Check failed. Return exit code 1.
sys.exit(1)
else:
print("Exactly one \"kind/*\" label found: {}".format(validKindLabels))
---
apiVersion: tekton.dev/v1beta1
kind: Pipeline
metadata:
name: tekton-kind-label
spec:
params:
- name: checkName
description: The name of the GitHub check that this pipeline is used for
- name: gitHubCommand
description: The command that was used to trigger testing
- name: labels
description: The labels attached to the Pull Request
tasks:
- name: check-name-matches
taskRef:
name: check-name-matches
params:
- name: gitHubCommand
value: $(params.gitHubCommand)
- name: checkName
value: $(params.checkName)
- name: kind-label
when: # implicit dependency on the check tasks
- input: $(tasks.check-name-matches.results.check)
operator: in
values: ["passed"]
taskRef:
name: "kind-label"
params:
- name: labels
value: $(params.labels)