Skip to content
This repository was archived by the owner on May 9, 2025. It is now read-only.

Commit 79c6f0e

Browse files
committed
feat: create branch protection rules for gitea
1 parent df6be72 commit 79c6f0e

File tree

3 files changed

+83
-15
lines changed

3 files changed

+83
-15
lines changed
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package v1alpha1
2+
3+
const (
4+
// StatusCheckName defines the name of the check a PullRequest will have.
5+
StatusCheckName = "mpas/validation-check"
6+
)

pkg/providers/gitea/gitea.go

Lines changed: 64 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,13 @@ import (
1212
"fmt"
1313

1414
"code.gitea.io/sdk/gitea"
15-
v1 "k8s.io/api/core/v1"
16-
"k8s.io/apimachinery/pkg/types"
17-
"sigs.k8s.io/controller-runtime/pkg/client"
18-
1915
deliveryv1alpha1 "github.com/open-component-model/git-controller/apis/delivery/v1alpha1"
2016
mpasv1alpha1 "github.com/open-component-model/git-controller/apis/mpas/v1alpha1"
2117
"github.com/open-component-model/git-controller/pkg/providers"
18+
v1 "k8s.io/api/core/v1"
19+
"k8s.io/apimachinery/pkg/types"
20+
"sigs.k8s.io/controller-runtime/pkg/client"
21+
"sigs.k8s.io/controller-runtime/pkg/log"
2222
)
2323

2424
const (
@@ -33,7 +33,7 @@ type Client struct {
3333
next providers.Provider
3434
}
3535

36-
// NewClient creates a new GitHub client.
36+
// NewClient creates a new Gitea client.
3737
func NewClient(client client.Client, next providers.Provider) *Client {
3838
return &Client{
3939
client: client,
@@ -170,7 +170,7 @@ func (c *Client) CreatePullRequest(ctx context.Context, branch string, sync deli
170170
domain = repository.Spec.Domain
171171
}
172172

173-
client, err := gitea.NewClient(domain, gitea.SetToken(string(token)))
173+
gclient, err := gitea.NewClient(domain, gitea.SetToken(string(token)))
174174
if err != nil {
175175
return -1, fmt.Errorf("failed to create gitea client: %w", err)
176176
}
@@ -193,7 +193,7 @@ func (c *Client) CreatePullRequest(ctx context.Context, branch string, sync deli
193193
description = sync.Spec.PullRequestTemplate.Description
194194
}
195195

196-
pr, _, err := client.CreatePullRequest(repository.Spec.Owner, repository.GetName(), gitea.CreatePullRequestOption{
196+
pr, _, err := gclient.CreatePullRequest(repository.Spec.Owner, repository.GetName(), gitea.CreatePullRequestOption{
197197
Head: branch,
198198
Base: base,
199199
Title: title,
@@ -206,6 +206,61 @@ func (c *Client) CreatePullRequest(ctx context.Context, branch string, sync deli
206206
return int(pr.ID), nil
207207
}
208208

209-
func (c *Client) CreateBranchProtection(ctx context.Context, obj mpasv1alpha1.Repository) error {
210-
return providers.NotSupportedError
209+
func (c *Client) CreateBranchProtection(ctx context.Context, repository mpasv1alpha1.Repository) error {
210+
logger := log.FromContext(ctx)
211+
212+
logger.Info("using gitea provider to set up branch protection")
213+
214+
if repository.Spec.Provider != providerType {
215+
if c.next == nil {
216+
return fmt.Errorf("can't handle provider type '%s' and no next provider is configured", repository.Spec.Provider)
217+
}
218+
219+
return c.next.CreateBranchProtection(ctx, repository)
220+
}
221+
222+
secret := &v1.Secret{}
223+
if err := c.client.Get(ctx, types.NamespacedName{
224+
Name: repository.Spec.Credentials.SecretRef.Name,
225+
Namespace: repository.Namespace,
226+
}, secret); err != nil {
227+
return fmt.Errorf("failed to get secret: %w", err)
228+
}
229+
230+
token, ok := secret.Data[tokenKey]
231+
if !ok {
232+
return fmt.Errorf("token '%s' not found in secret", tokenKey)
233+
}
234+
235+
logger.Info("got secret")
236+
237+
domain := defaultDomain
238+
if repository.Spec.Domain != "" {
239+
domain = repository.Spec.Domain
240+
}
241+
242+
logger.Info("default domain set", "domain", domain)
243+
244+
gclient, err := gitea.NewClient(domain, gitea.SetToken(string(token)))
245+
if err != nil {
246+
return fmt.Errorf("failed to create gitea client: %w", err)
247+
}
248+
249+
defaultBranch := "main"
250+
if repository.Spec.DefaultBranch != "" {
251+
defaultBranch = repository.Spec.DefaultBranch
252+
}
253+
254+
logger.Info("using default branch", "branch", defaultBranch)
255+
256+
if _, _, err := gclient.CreateBranchProtection(repository.Spec.Owner, repository.Name, gitea.CreateBranchProtectionOption{
257+
BranchName: defaultBranch,
258+
EnablePush: true,
259+
EnableStatusCheck: true,
260+
StatusCheckContexts: []string{deliveryv1alpha1.StatusCheckName},
261+
}); err != nil {
262+
return fmt.Errorf("failed to create branch protection: %w", err)
263+
}
264+
265+
return nil
211266
}

pkg/providers/github/github.go

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,9 @@ import (
2323
)
2424

2525
const (
26-
tokenKey = "password"
27-
providerType = "github"
28-
defaultDomain = github.DefaultDomain
29-
statusCheckName = "mpas/validation-check"
26+
tokenKey = "password"
27+
providerType = "github"
28+
defaultDomain = github.DefaultDomain
3029
)
3130

3231
// Client github.
@@ -77,6 +76,14 @@ func (c *Client) CreateRepository(ctx context.Context, obj mpasv1alpha1.Reposito
7776
}
7877

7978
func (c *Client) CreateBranchProtection(ctx context.Context, obj mpasv1alpha1.Repository) error {
79+
if obj.Spec.Provider != providerType {
80+
if c.next == nil {
81+
return fmt.Errorf("can't handle provider type '%s' and no next provider is configured", obj.Spec.Provider)
82+
}
83+
84+
return c.next.CreateBranchProtection(ctx, obj)
85+
}
86+
8087
token, err := c.retrieveAccessToken(ctx, obj)
8188
if err != nil {
8289
return fmt.Errorf("failed to retrieve token: %w", err)
@@ -91,7 +98,7 @@ func (c *Client) CreateBranchProtection(ctx context.Context, obj mpasv1alpha1.Re
9198
Strict: true,
9299
Checks: []*ggithub.RequiredStatusCheck{
93100
{
94-
Context: statusCheckName,
101+
Context: deliveryv1alpha1.StatusCheckName,
95102
},
96103
},
97104
},
@@ -193,7 +200,7 @@ func (c *Client) createCheckRun(ctx context.Context, repository mpasv1alpha1.Rep
193200
_, _, err = g.Repositories.CreateStatus(ctx, repository.Spec.Owner, repository.Name, *pr.Head.SHA, &ggithub.RepoStatus{
194201
State: ggithub.String("pending"),
195202
Description: ggithub.String("MPAS Validation Check"),
196-
Context: ggithub.String(statusCheckName),
203+
Context: ggithub.String(deliveryv1alpha1.StatusCheckName),
197204
})
198205

199206
if err != nil {

0 commit comments

Comments
 (0)