-
Notifications
You must be signed in to change notification settings - Fork 28
/
github.go
165 lines (141 loc) · 4.43 KB
/
github.go
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
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
// SPDX-License-Identifier: Apache-2.0
package github
import (
"context"
"fmt"
"net/url"
"github.com/google/go-github/v63/github"
"github.com/sirupsen/logrus"
"golang.org/x/oauth2"
)
const (
defaultURL = "https://github.com/" // Default GitHub URL
defaultAPI = "https://api.github.com/" // Default GitHub API URL
// events for repo webhooks.
eventPush = "push"
eventPullRequest = "pull_request"
eventDeployment = "deployment"
eventIssueComment = "issue_comment"
eventRepository = "repository"
eventInitialize = "initialize"
)
type config struct {
// specifies the address to use for the GitHub client
Address string
// specifies the API endpoint to use for the GitHub client
API string
// specifies the OAuth client ID from GitHub to use for the GitHub client
ClientID string
// specifies the OAuth client secret from GitHub to use for the GitHub client
ClientSecret string
// specifies the Vela server address to use for the GitHub client
ServerAddress string
// specifies the Vela server address that the scm provider should use to send Vela webhooks
ServerWebhookAddress string
// specifies the context for the commit status to use for the GitHub client
StatusContext string
// specifies the Vela web UI address to use for the GitHub client
WebUIAddress string
// specifies the OAuth scopes to use for the GitHub client
Scopes []string
}
type client struct {
config *config
OAuth *oauth2.Config
AuthReq *github.AuthorizationRequest
// https://pkg.go.dev/github.com/sirupsen/logrus#Entry
Logger *logrus.Entry
}
// New returns a SCM implementation that integrates with
// a GitHub or a GitHub Enterprise instance.
//
//nolint:revive // ignore returning unexported client
func New(opts ...ClientOpt) (*client, error) {
// create new GitHub client
c := new(client)
// create new fields
c.config = new(config)
c.OAuth = new(oauth2.Config)
c.AuthReq = new(github.AuthorizationRequest)
// create new logger for the client
//
// https://pkg.go.dev/github.com/sirupsen/logrus?tab=doc#StandardLogger
logger := logrus.StandardLogger()
// create new logger for the client
//
// https://pkg.go.dev/github.com/sirupsen/logrus?tab=doc#NewEntry
c.Logger = logrus.NewEntry(logger).WithField("scm", c.Driver())
// apply all provided configuration options
for _, opt := range opts {
err := opt(c)
if err != nil {
return nil, err
}
}
// create the GitHub OAuth config object
c.OAuth = &oauth2.Config{
ClientID: c.config.ClientID,
ClientSecret: c.config.ClientSecret,
Scopes: c.config.Scopes,
Endpoint: oauth2.Endpoint{
AuthURL: fmt.Sprintf("%s/login/oauth/authorize", c.config.Address),
TokenURL: fmt.Sprintf("%s/login/oauth/access_token", c.config.Address),
},
}
var githubScopes []github.Scope
for _, scope := range c.config.Scopes {
githubScopes = append(githubScopes, github.Scope(scope))
}
// create the GitHub authorization object
c.AuthReq = &github.AuthorizationRequest{
ClientID: &c.config.ClientID,
ClientSecret: &c.config.ClientSecret,
Scopes: githubScopes,
}
return c, nil
}
// NewTest returns a SCM implementation that integrates with the provided
// mock server. Only the url from the mock server is required.
//
// This function is intended for running tests only.
//
//nolint:revive // ignore returning unexported client
func NewTest(urls ...string) (*client, error) {
address := urls[0]
server := address
// check if multiple URLs were provided
if len(urls) > 1 {
server = urls[1]
}
return New(
WithAddress(address),
WithClientID("foo"),
WithClientSecret("bar"),
WithServerAddress(server),
WithServerWebhookAddress(""),
WithStatusContext("continuous-integration/vela"),
WithWebUIAddress(address),
)
}
// helper function to return the GitHub OAuth client.
func (c *client) newClientToken(ctx context.Context, token string) *github.Client {
// create the token object for the client
ts := oauth2.StaticTokenSource(
&oauth2.Token{AccessToken: token},
)
// create the OAuth client
tc := oauth2.NewClient(context.Background(), ts)
// if c.SkipVerify {
// tc.Transport.(*oauth2.Transport).Base = &http.Transport{
// Proxy: http.ProxyFromEnvironment,
// TLSClientConfig: &tls.Config{
// InsecureSkipVerify: true,
// },
// }
// }
// create the GitHub client from the OAuth client
github := github.NewClient(tc)
// ensure the proper URL is set in the GitHub client
github.BaseURL, _ = url.Parse(c.config.API)
return github
}