Skip to content

Commit 5820f2c

Browse files
feat(projects): manage merge request approval configuration on Project
GitLab exposes project-level merge request approval settings (reset-on-push, author/committer self-approval, reauthentication, etc.) through a dedicated /projects/:id/approvals endpoint that is separate from the main project update API. Expose it as an optional `approvals` block on the existing Project resource, following the same pattern as `pushRules`, rather than a separate CRD, since it has no independent identity or lifecycle apart from the project it belongs to. Fields are only reconciled when `approvals` is set in the spec, so existing Project resources are unaffected.
1 parent c2a24e3 commit 5820f2c

17 files changed

Lines changed: 1111 additions & 6 deletions

File tree

apis/cluster/projects/v1alpha1/zz_generated.deepcopy.go

Lines changed: 50 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

apis/cluster/projects/v1alpha1/zz_project_types.go

Lines changed: 43 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

apis/namespaced/projects/v1alpha1/project_types.go

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -386,6 +386,14 @@ type ProjectParameters struct {
386386
// +optional
387387
PushRules *PushRules `json:"pushRules,omitempty"`
388388

389+
// Approvals configures the project's merge request approval
390+
// configuration. Fields left unset are not managed by this provider.
391+
//
392+
// GitLab API docs:
393+
// https://docs.gitlab.com/api/merge_request_approvals/#update-approval-configuration-for-a-project
394+
// +optional
395+
Approvals *Approvals `json:"approvals,omitempty"`
396+
389397
// Enable Delete source branch option by default for all new merge requests.
390398
// +optional
391399
RemoveSourceBranchAfterMerge *bool `json:"removeSourceBranchAfterMerge,omitempty"`
@@ -509,6 +517,41 @@ type PushRules struct {
509517
RejectNonDCOCommits *bool `json:"rejectNonDcoCommits,omitempty"`
510518
}
511519

520+
// Approvals configures a project's merge request approval configuration.
521+
//
522+
// GitLab API docs:
523+
// https://docs.gitlab.com/api/merge_request_approvals/#update-approval-configuration-for-a-project
524+
type Approvals struct {
525+
// ResetApprovalsOnPush resets approvals on a new push to the merge request.
526+
// +optional
527+
ResetApprovalsOnPush *bool `json:"resetApprovalsOnPush,omitempty"`
528+
529+
// DisableOverridingApproversPerMergeRequest prevents users from overriding
530+
// approvers per merge request.
531+
// +optional
532+
DisableOverridingApproversPerMergeRequest *bool `json:"disableOverridingApproversPerMergeRequest,omitempty"`
533+
534+
// MergeRequestsAuthorApproval allows merge request authors to self-approve
535+
// their own merge requests.
536+
// +optional
537+
MergeRequestsAuthorApproval *bool `json:"mergeRequestsAuthorApproval,omitempty"`
538+
539+
// MergeRequestsDisableCommittersApproval prevents committers from
540+
// approving their own merge requests.
541+
// +optional
542+
MergeRequestsDisableCommittersApproval *bool `json:"mergeRequestsDisableCommittersApproval,omitempty"`
543+
544+
// RequireReauthenticationToApprove requires the reauthentication password
545+
// to approve merge requests.
546+
// +optional
547+
RequireReauthenticationToApprove *bool `json:"requireReauthenticationToApprove,omitempty"`
548+
549+
// SelectiveCodeOwnerRemovals allows removing individual code owner
550+
// approval requirements for a merge request.
551+
// +optional
552+
SelectiveCodeOwnerRemovals *bool `json:"selectiveCodeOwnerRemovals,omitempty"`
553+
}
554+
512555
// ProjectNamespace represents a project namespace.
513556
type ProjectNamespace struct {
514557
ID int64 `json:"ID"`

apis/namespaced/projects/v1alpha1/zz_generated.deepcopy.go

Lines changed: 50 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

examples/projects/project.yaml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,15 @@ spec:
1111
name: example-group
1212
description: "example project description"
1313
buildGitStrategy: "fetch"
14+
# Merge request approval configuration for the project. Fields left
15+
# unset here are not managed by this provider.
16+
approvals:
17+
resetApprovalsOnPush: true
18+
disableOverridingApproversPerMergeRequest: false
19+
mergeRequestsAuthorApproval: false
20+
mergeRequestsDisableCommittersApproval: true
21+
requireReauthenticationToApprove: true
22+
selectiveCodeOwnerRemovals: false
1423
providerConfigRef:
1524
name: gitlab-provider
1625
kind: ProviderConfig

package/crds/projects.gitlab.crossplane.io_projects.yaml

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,44 @@ spec:
7878
description: Set whether or not merge requests can be merged with
7979
skipped jobs.
8080
type: boolean
81+
approvals:
82+
description: |-
83+
Approvals configures the project's merge request approval
84+
configuration. Fields left unset are not managed by this provider.
85+
86+
GitLab API docs:
87+
https://docs.gitlab.com/api/merge_request_approvals/#update-approval-configuration-for-a-project
88+
properties:
89+
disableOverridingApproversPerMergeRequest:
90+
description: |-
91+
DisableOverridingApproversPerMergeRequest prevents users from overriding
92+
approvers per merge request.
93+
type: boolean
94+
mergeRequestsAuthorApproval:
95+
description: |-
96+
MergeRequestsAuthorApproval allows merge request authors to self-approve
97+
their own merge requests.
98+
type: boolean
99+
mergeRequestsDisableCommittersApproval:
100+
description: |-
101+
MergeRequestsDisableCommittersApproval prevents committers from
102+
approving their own merge requests.
103+
type: boolean
104+
requireReauthenticationToApprove:
105+
description: |-
106+
RequireReauthenticationToApprove requires the reauthentication password
107+
to approve merge requests.
108+
type: boolean
109+
resetApprovalsOnPush:
110+
description: ResetApprovalsOnPush resets approvals on a new
111+
push to the merge request.
112+
type: boolean
113+
selectiveCodeOwnerRemovals:
114+
description: |-
115+
SelectiveCodeOwnerRemovals allows removing individual code owner
116+
approval requirements for a merge request.
117+
type: boolean
118+
type: object
81119
approvalsBeforeMerge:
82120
description: |-
83121
How many approvers should approve merge request by default.More actions

package/crds/projects.gitlab.m.crossplane.io_projects.yaml

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,44 @@ spec:
6464
description: Set whether or not merge requests can be merged with
6565
skipped jobs.
6666
type: boolean
67+
approvals:
68+
description: |-
69+
Approvals configures the project's merge request approval
70+
configuration. Fields left unset are not managed by this provider.
71+
72+
GitLab API docs:
73+
https://docs.gitlab.com/api/merge_request_approvals/#update-approval-configuration-for-a-project
74+
properties:
75+
disableOverridingApproversPerMergeRequest:
76+
description: |-
77+
DisableOverridingApproversPerMergeRequest prevents users from overriding
78+
approvers per merge request.
79+
type: boolean
80+
mergeRequestsAuthorApproval:
81+
description: |-
82+
MergeRequestsAuthorApproval allows merge request authors to self-approve
83+
their own merge requests.
84+
type: boolean
85+
mergeRequestsDisableCommittersApproval:
86+
description: |-
87+
MergeRequestsDisableCommittersApproval prevents committers from
88+
approving their own merge requests.
89+
type: boolean
90+
requireReauthenticationToApprove:
91+
description: |-
92+
RequireReauthenticationToApprove requires the reauthentication password
93+
to approve merge requests.
94+
type: boolean
95+
resetApprovalsOnPush:
96+
description: ResetApprovalsOnPush resets approvals on a new
97+
push to the merge request.
98+
type: boolean
99+
selectiveCodeOwnerRemovals:
100+
description: |-
101+
SelectiveCodeOwnerRemovals allows removing individual code owner
102+
approval requirements for a merge request.
103+
type: boolean
104+
type: object
67105
approvalsBeforeMerge:
68106
description: |-
69107
How many approvers should approve merge request by default.More actions

pkg/cluster/clients/projects/fake/zz_fake.go

Lines changed: 13 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)