Skip to content

Commit

Permalink
Merge pull request #232 from promhippie/changelog-and-ghe-app
Browse files Browse the repository at this point in the history
Add support for apps on GitHub Enterprise
  • Loading branch information
tboerger committed Jul 13, 2023
2 parents 8866498 + 2454a5a commit 6c975b7
Show file tree
Hide file tree
Showing 3 changed files with 163 additions and 81 deletions.
7 changes: 7 additions & 0 deletions changelog/unreleased/ghe-app-support.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
Enhancement: Enable app support for GitHub Enterprise

Previously we had support for GitHub applications for the SaaS version only,
with this change you are also able to use application registration for GitHub
Enterprise.

https://github.com/promhippie/github_exporter/issues/228
7 changes: 7 additions & 0 deletions changelog/unreleased/workflow-status.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
Bugfix: Properly handle workflow status results

While a workflow is running the conclusion property provides an empty string, in
order to get a proper value in this case we have changed the metric value to the
status property which offers a useable fallback.

https://github.com/promhippie/github_exporter/issues/230
230 changes: 149 additions & 81 deletions pkg/action/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -35,88 +35,10 @@ func Server(cfg *config.Config, logger log.Logger) error {
"go", version.Go,
)

client := github.NewClient(
oauth2.NewClient(
context.Background(),
oauth2.StaticTokenSource(
&oauth2.Token{
AccessToken: cfg.Target.Token,
},
),
),
)

if cfg.Target.PrivateKey != "" && cfg.Target.AppID != 0 && cfg.Target.InstallID != 0 {
privateKey, err := contentOrDecode(cfg.Target.PrivateKey)

if err != nil {
level.Error(logger).Log(
"msg", "Failed to read GitHub key",
"err", err,
)

return err
}

transport, err := ghinstallation.New(
http.DefaultTransport,
cfg.Target.AppID,
cfg.Target.InstallID,
privateKey,
)

if err != nil {
level.Error(logger).Log(
"msg", "Failed to create GitHub transport",
"err", err,
)

return err
}

client = github.NewClient(
&http.Client{
Transport: transport,
},
)
}

if cfg.Target.BaseURL != "" {
var (
err error
)
client, err := getClient(cfg, logger)

client, err = github.NewEnterpriseClient(
cfg.Target.BaseURL,
cfg.Target.BaseURL,
oauth2.NewClient(
context.WithValue(
context.Background(),
oauth2.HTTPClient,
&http.Client{
Transport: &http.Transport{
TLSClientConfig: &tls.Config{
InsecureSkipVerify: cfg.Target.Insecure,
},
},
},
),
oauth2.StaticTokenSource(
&oauth2.Token{
AccessToken: cfg.Target.Token,
},
),
),
)

if err != nil {
level.Error(logger).Log(
"msg", "Failed to parse base URL",
"err", err,
)

return err
}
if err != nil {
return err
}

var gr run.Group
Expand Down Expand Up @@ -333,3 +255,149 @@ func contentOrDecode(file string) ([]byte, error) {

return decoded, nil
}

func useEnterprise(cfg *config.Config, _ log.Logger) bool {
return cfg.Target.BaseURL != ""
}

func useApplication(cfg *config.Config, _ log.Logger) bool {
return cfg.Target.PrivateKey != "" && cfg.Target.AppID != 0 && cfg.Target.InstallID != 0
}

func getClient(cfg *config.Config, logger log.Logger) (*github.Client, error) {
if useEnterprise(cfg, logger) {
return getEnterprise(cfg, logger)
}

if useApplication(cfg, logger) {
privateKey, err := contentOrDecode(cfg.Target.PrivateKey)

if err != nil {
level.Error(logger).Log(
"msg", "Failed to read GitHub key",
"err", err,
)

return nil, err
}

transport, err := ghinstallation.New(
http.DefaultTransport,
cfg.Target.AppID,
cfg.Target.InstallID,
privateKey,
)

if err != nil {
level.Error(logger).Log(
"msg", "Failed to create GitHub transport",
"err", err,
)

return nil, err
}

return github.NewClient(
&http.Client{
Transport: transport,
},
), nil
}

return github.NewClient(
oauth2.NewClient(
context.Background(),
oauth2.StaticTokenSource(
&oauth2.Token{
AccessToken: cfg.Target.Token,
},
),
),
), nil
}

func getEnterprise(cfg *config.Config, logger log.Logger) (*github.Client, error) {
if useApplication(cfg, logger) {
privateKey, err := contentOrDecode(cfg.Target.PrivateKey)

if err != nil {
level.Error(logger).Log(
"msg", "Failed to read GitHub key",
"err", err,
)

return nil, err
}

transport, err := ghinstallation.New(
http.DefaultTransport,
cfg.Target.AppID,
cfg.Target.InstallID,
privateKey,
)

if err != nil {
level.Error(logger).Log(
"msg", "Failed to create GitHub transport",
"err", err,
)

return nil, err
}

transport.BaseURL = cfg.Target.BaseURL

client, err := github.NewEnterpriseClient(
cfg.Target.BaseURL,
cfg.Target.BaseURL,
&http.Client{
Transport: transport,
},
)

if err != nil {
level.Error(logger).Log(
"msg", "Failed to parse base URL",
"err", err,
)

return nil, err
}

return client, err
}

client, err := github.NewEnterpriseClient(
cfg.Target.BaseURL,
cfg.Target.BaseURL,
oauth2.NewClient(
context.WithValue(
context.Background(),
oauth2.HTTPClient,
&http.Client{
Transport: &http.Transport{
TLSClientConfig: &tls.Config{
InsecureSkipVerify: cfg.Target.Insecure,
},
},
},
),
oauth2.StaticTokenSource(
&oauth2.Token{
AccessToken: cfg.Target.Token,
},
),
),
)

if err != nil {
level.Error(logger).Log(
"msg", "Failed to parse base URL",
"err", err,
)

return nil, err
}

return client, err
}

0 comments on commit 6c975b7

Please sign in to comment.