Skip to content

Commit a2aebdd

Browse files
committed
gitlab: automatically detect private instances
1 parent 6498ebc commit a2aebdd

File tree

2 files changed

+25
-11
lines changed

2 files changed

+25
-11
lines changed

pkg/provider/gitlab/README.md

+3-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,9 @@
1313
- Get files via APIs
1414
- Webhook via api token attached to repo secret
1515
- Auto secret attached for git-clone support on private repo.
16-
- Private instance is supported via the Repository CR on `spec.provider.url` i.e:
16+
- Private instance is supported, the private instance is not required to be
17+
specified in config since auto detect but if for whatever reason you want to
18+
set another api url you can do this on Repository :
1719

1820
```yaml
1921
kind: Repository

pkg/provider/gitlab/gitlab.go

+22-10
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import (
1515
)
1616

1717
const (
18-
apiPublicURL = "https://gitlab.com/api/v4"
18+
apiPublicURL = "https://gitlab.com"
1919
taskStatusTemplate = `
2020
<table>
2121
<tr><th>Status</th><th>Duration</th><th>Name</th></tr>
@@ -33,12 +33,14 @@ const (
3333
)
3434

3535
type Provider struct {
36-
Client *gitlab.Client
37-
Token *string
38-
targetProjectID int
39-
sourceProjectID int
40-
mergeRequestID int
41-
userID int
36+
Client *gitlab.Client
37+
Token *string
38+
targetProjectID int
39+
sourceProjectID int
40+
mergeRequestID int
41+
userID int
42+
pathWithNamespace string
43+
repoURL string
4244
}
4345

4446
// If I understood properly, you can have "personal" projects and groups
@@ -84,7 +86,8 @@ func (v *Provider) ParsePayload(ctx context.Context, run *params.Run, payload st
8486
v.sourceProjectID = event.ObjectAttributes.SourceProjectID
8587
v.userID = event.User.ID
8688

87-
processedevent.Organization, processedevent.Repository = getOrgRepo(event.ObjectAttributes.Target.PathWithNamespace)
89+
v.pathWithNamespace = event.ObjectAttributes.Target.PathWithNamespace
90+
processedevent.Organization, processedevent.Repository = getOrgRepo(v.pathWithNamespace)
8891
processedevent.TriggerTarget = "pull_request"
8992
case *gitlab.PushEvent:
9093
processedevent = &info.Event{
@@ -98,7 +101,8 @@ func (v *Provider) ParsePayload(ctx context.Context, run *params.Run, payload st
98101
BaseBranch: event.Ref,
99102
}
100103
processedevent.TriggerTarget = "push"
101-
processedevent.Organization, processedevent.Repository = getOrgRepo(event.Project.PathWithNamespace)
104+
v.pathWithNamespace = event.Project.PathWithNamespace
105+
processedevent.Organization, processedevent.Repository = getOrgRepo(v.pathWithNamespace)
102106
v.targetProjectID = event.ProjectID
103107
v.sourceProjectID = event.ProjectID
104108
v.userID = event.UserID
@@ -114,7 +118,9 @@ func (v *Provider) ParsePayload(ctx context.Context, run *params.Run, payload st
114118
BaseBranch: event.MergeRequest.TargetBranch,
115119
HeadBranch: event.MergeRequest.SourceBranch,
116120
}
117-
processedevent.Organization, processedevent.Repository = getOrgRepo(event.Project.PathWithNamespace)
121+
122+
v.pathWithNamespace = event.Project.PathWithNamespace
123+
processedevent.Organization, processedevent.Repository = getOrgRepo(v.pathWithNamespace)
118124
processedevent.TriggerTarget = "pull_request"
119125

120126
v.mergeRequestID = event.MergeRequest.IID
@@ -131,6 +137,8 @@ func (v *Provider) ParsePayload(ctx context.Context, run *params.Run, payload st
131137
// really use it anymore we good to do whatever we want with it for
132138
// cosmetics.
133139
processedevent.EventType = strings.ReplaceAll(run.Info.Event.EventType, " Hook", "")
140+
141+
v.repoURL = processedevent.URL
134142
return processedevent, nil
135143
}
136144

@@ -147,9 +155,13 @@ func (v *Provider) SetClient(ctx context.Context, opts *info.PacOpts) error {
147155
return fmt.Errorf("no git_provider.secret has been set in the repo crd")
148156
}
149157

158+
// Try to detect automatically theapi url if url is not coming from public
159+
// gitlab. Unless user has set a spec.provider.url in its repo crd
150160
apiURL := apiPublicURL
151161
if opts.ProviderURL != "" {
152162
apiURL = opts.ProviderURL
163+
} else if !strings.HasPrefix(v.repoURL, apiPublicURL) {
164+
apiURL = strings.ReplaceAll(v.repoURL, v.pathWithNamespace, "")
153165
}
154166

155167
v.Client, err = gitlab.NewClient(opts.ProviderToken, gitlab.WithBaseURL(apiURL))

0 commit comments

Comments
 (0)