...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 package buildkite
16
17 import (
18 "context"
19 "fmt"
20 "net/http"
21 "os"
22
23 "github.com/buildkite/agent/v3/api"
24 "github.com/buildkite/agent/v3/logger"
25 "github.com/sigstore/cosign/v2/pkg/cosign/env"
26 "github.com/sigstore/cosign/v2/pkg/providers"
27 )
28
29 func init() {
30 providers.Register("buildkite-agent", &buildkiteAgent{})
31 }
32
33 type buildkiteAgent struct{}
34
35 var _ providers.Interface = (*buildkiteAgent)(nil)
36
37
38 func (ba *buildkiteAgent) Enabled(_ context.Context) bool {
39 return env.Getenv(env.VariableBuildkiteAgentAccessToken) != ""
40 }
41
42
43 func (ba *buildkiteAgent) Provide(ctx context.Context, audience string) (string, error) {
44 agentToken := env.Getenv(env.VariableBuildkiteAgentAccessToken)
45 endpoint := env.Getenv(env.VariableBuildkiteAgentEndpoint)
46 if endpoint == "" {
47 endpoint = "https://agent.buildkite.com/v3"
48 }
49 jobID := env.Getenv(env.VariableBuildkiteJobID)
50 logLevel := env.Getenv(env.VariableBuildkiteAgentLogLevel)
51 if logLevel == "" {
52 logLevel = "notice"
53 }
54
55 l := logger.NewConsoleLogger(logger.NewTextPrinter(os.Stderr), os.Exit)
56 level, err := logger.LevelFromString(logLevel)
57 if err != nil {
58 return "", err
59 }
60 l.SetLevel(level)
61
62 client := api.NewClient(l, api.Config{Token: agentToken, Endpoint: endpoint})
63 token, response, err := client.OIDCToken(ctx, &api.OIDCTokenRequest{Audience: audience, Job: jobID})
64 if err != nil {
65 return "", err
66 }
67 if response != nil && response.StatusCode != http.StatusOK {
68 return "", fmt.Errorf("buildkite agent request failed with status: %s", response.Status)
69 }
70 return token.Token, nil
71 }
72
View as plain text