1616package runners
1717
1818import (
19- "fmt"
2019 "os"
21- "strings"
2220
2321 schemaapi "github.com/chainloop-dev/chainloop/app/controlplane/api/workflowcontract/v1"
2422)
2523
26- const (
27- // Default path for Downward API labels
28- defaultLabelsPath = "/etc/podinfo/labels"
29- // Default Tekton dashboard URL
30- defaultDashboardURL = "https://dashboard.tekton.dev"
31- )
32-
33- type TektonPipeline struct {
34- // Path to the Downward API labels file (configurable for testing)
35- labelsPath string
36- }
24+ type TektonPipeline struct {}
3725
3826func NewTektonPipeline () * TektonPipeline {
39- return & TektonPipeline {
40- labelsPath : defaultLabelsPath ,
41- }
27+ return & TektonPipeline {}
4228}
4329
4430func (r * TektonPipeline ) ID () schemaapi.CraftingSchema_Runner_RunnerType {
@@ -55,158 +41,26 @@ func (r *TektonPipeline) CheckEnv() bool {
5541 return false
5642}
5743
58- // ListEnvVars returns environment variables collected from Downward API labels
5944func (r * TektonPipeline ) ListEnvVars () []* EnvVarDefinition {
60- // Parse labels and convert to environment variable definitions
61- labels := r .parseLabels ()
62- if len (labels ) == 0 {
63- return []* EnvVarDefinition {}
64- }
65-
66- var envVars []* EnvVarDefinition
67-
68- // Map Tekton labels to environment variables (all optional)
69- labelMappings := map [string ]string {
70- "tekton.dev/pipelineRun" : "TEKTON_PIPELINE_RUN" ,
71- "tekton.dev/pipelineRunUID" : "TEKTON_PIPELINE_RUN_UID" ,
72- "tekton.dev/pipeline" : "TEKTON_PIPELINE" ,
73- "tekton.dev/taskRun" : "TEKTON_TASKRUN_NAME" ,
74- "tekton.dev/taskRunUID" : "TEKTON_TASKRUN_UID" ,
75- "tekton.dev/task" : "TEKTON_TASK_NAME" ,
76- }
77-
78- for labelKey , envVarName := range labelMappings {
79- if _ , exists := labels [labelKey ]; exists {
80- envVars = append (envVars , & EnvVarDefinition {
81- Name : envVarName ,
82- Optional : true ,
83- })
84- }
85- }
86-
87- // Add namespace if available
88- if ns := r .getNamespace (); ns != "" {
89- envVars = append (envVars , & EnvVarDefinition {
90- Name : "TEKTON_NAMESPACE" ,
91- Optional : true ,
92- })
93- }
94-
95- return envVars
96- }
97-
98- // parseLabels reads and parses the Downward API labels file
99- // Returns a map of label key-value pairs
100- func (r * TektonPipeline ) parseLabels () map [string ]string {
101- labels := make (map [string ]string )
102-
103- data , err := os .ReadFile (r .labelsPath )
104- if err != nil {
105- return labels
106- }
107-
108- // Parse labels in format: key="value"
109- // Labels are separated by newlines
110- lines := strings .Split (string (data ), "\n " )
111- for _ , line := range lines {
112- line = strings .TrimSpace (line )
113- if line == "" {
114- continue
115- }
116-
117- // Split on first = to get key and quoted value
118- parts := strings .SplitN (line , "=" , 2 )
119- if len (parts ) != 2 {
120- continue
121- }
122-
123- key := strings .TrimSpace (parts [0 ])
124- value := strings .Trim (strings .TrimSpace (parts [1 ]), `"` )
125- labels [key ] = value
126- }
127-
128- return labels
45+ return []* EnvVarDefinition {}
12946}
13047
13148func (r * TektonPipeline ) RunURI () string {
132- labels := r .parseLabels ()
133- namespace := r .getNamespace ()
134-
135- if namespace == "" {
136- return ""
137- }
138-
139- // Get dashboard URL from environment variable or use default
140- dashboardURL := os .Getenv ("TEKTON_DASHBOARD_URL" )
141- if dashboardURL == "" {
142- dashboardURL = defaultDashboardURL
143- }
144-
145- // Priority 1: If we have PipelineRun context, construct PipelineRun URL
146- if pipelineRun , ok := labels ["tekton.dev/pipelineRun" ]; ok && pipelineRun != "" {
147- return fmt .Sprintf ("%s/#/namespaces/%s/pipelineruns/%s" , dashboardURL , namespace , pipelineRun )
148- }
149-
150- // Priority 2: If we have TaskRun context, construct TaskRun URL
151- if taskRun , ok := labels ["tekton.dev/taskRun" ]; ok && taskRun != "" {
152- return fmt .Sprintf ("%s/#/namespaces/%s/taskruns/%s" , dashboardURL , namespace , taskRun )
153- }
154-
155- return ""
156- }
157-
158- // getNamespace attempts to get the namespace from the service account
159- func (r * TektonPipeline ) getNamespace () string {
160- // Read from service account (standard Kubernetes location)
161- if data , err := os .ReadFile ("/var/run/secrets/kubernetes.io/serviceaccount/namespace" ); err == nil {
162- return strings .TrimSpace (string (data ))
163- }
164-
16549 return ""
16650}
16751
16852func (r * TektonPipeline ) ResolveEnvVars () (map [string ]string , []* error ) {
169- result := make (map [string ]string )
170- labels := r .parseLabels ()
171-
172- // Map Tekton labels to environment variable names
173- labelMappings := map [string ]string {
174- "tekton.dev/pipelineRun" : "TEKTON_PIPELINE_RUN" ,
175- "tekton.dev/pipelineRunUID" : "TEKTON_PIPELINE_RUN_UID" ,
176- "tekton.dev/pipeline" : "TEKTON_PIPELINE" ,
177- "tekton.dev/taskRun" : "TEKTON_TASKRUN_NAME" ,
178- "tekton.dev/taskRunUID" : "TEKTON_TASKRUN_UID" ,
179- "tekton.dev/task" : "TEKTON_TASK_NAME" ,
180- }
181-
182- for labelKey , envVarName := range labelMappings {
183- if value , ok := labels [labelKey ]; ok && value != "" {
184- result [envVarName ] = value
185- }
186- }
187-
188- // Add namespace if available
189- if ns := r .getNamespace (); ns != "" {
190- result ["TEKTON_NAMESPACE" ] = ns
191- }
192-
193- // No errors since all variables are optional
194- return result , nil
53+ return resolveEnvVars (r .ListEnvVars ())
19554}
19655
19756func (r * TektonPipeline ) WorkflowFilePath () string {
198- // Tekton doesn't have a single workflow file path concept
199- // Tasks and Pipelines are defined as Kubernetes resources
20057 return ""
20158}
20259
20360func (r * TektonPipeline ) IsAuthenticated () bool {
204- // No OIDC support initially
20561 return false
20662}
20763
20864func (r * TektonPipeline ) Environment () RunnerEnvironment {
209- // Could be enhanced to detect managed Tekton services (e.g., OpenShift Pipelines)
210- // For now, return Unknown
21165 return Unknown
21266}
0 commit comments