Skip to content

Commit 8c981e1

Browse files
committed
project: Add merge_pipelines_enabled and merge_trains_enabled. Closes #623
This allows for managing Merged Results Pipelines and Merge Trains.
1 parent cab5d6d commit 8c981e1

File tree

7 files changed

+151
-0
lines changed

7 files changed

+151
-0
lines changed

docs/data-sources/project.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,9 @@ data "gitlab_project" "example" {
3838
- **http_url_to_repo** (String) URL that can be provided to `git clone` to clone the
3939
- **issues_enabled** (Boolean) Enable issue tracking for the project.
4040
- **lfs_enabled** (Boolean) Enable LFS for the project.
41+
- **merge_pipelines_enabled** (Boolean) Whether merged results pipelines are enabled or not.
4142
- **merge_requests_enabled** (Boolean) Enable merge requests for the project.
43+
- **merge_trains_enabled** (Boolean) Whether merge trains are enabled or not.
4244
- **name** (String) The name of the project.
4345
- **namespace_id** (Number) The namespace (group or user) of the project. Defaults to your user.
4446
- **path** (String) The path of the repository.

docs/data-sources/projects.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,9 @@ Read-Only:
100100
- **last_activity_at** (String)
101101
- **lfs_enabled** (Boolean)
102102
- **merge_method** (String)
103+
- **merge_pipelines_enabled** (Boolean)
103104
- **merge_requests_enabled** (Boolean)
105+
- **merge_trains_enabled** (Boolean)
104106
- **mirror** (Boolean)
105107
- **mirror_overwrites_diverged_branches** (Boolean)
106108
- **mirror_trigger_builds** (Boolean)

docs/resources/project.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,10 @@ resource "gitlab_project" "example-two" {
6060
- **issues_template** (String) Sets the template for new issues in the project.
6161
- **lfs_enabled** (Boolean) Enable LFS for the project.
6262
- **merge_method** (String) Set to `ff` to create fast-forward merges
63+
- **merge_pipelines_enabled** (Boolean) Enable or disable merge pipelines.
6364
- **merge_requests_enabled** (Boolean) Enable merge requests for the project.
6465
- **merge_requests_template** (String) Sets the template for new merge requests in the project.
66+
- **merge_trains_enabled** (Boolean) Enable or disable merge trains. Requires `merge_pipelines_enabled` to be set to `true` to take effect.
6567
- **mirror** (Boolean) Enable project pull mirror.
6668
- **mirror_overwrites_diverged_branches** (Boolean) Enable overwrite diverged branches for a mirrored project.
6769
- **mirror_trigger_builds** (Boolean) Enable trigger builds on pushes for a mirrored project.

internal/provider/data_source_gitlab_project.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,16 @@ var _ = registerDataSource("gitlab_project", func() *schema.Resource {
139139
Type: schema.TypeBool,
140140
Computed: true,
141141
},
142+
"merge_pipelines_enabled": {
143+
Description: "Whether merged results pipelines are enabled or not.",
144+
Type: schema.TypeBool,
145+
Computed: true,
146+
},
147+
"merge_trains_enabled": {
148+
Description: "Whether merge trains are enabled or not.",
149+
Type: schema.TypeBool,
150+
Computed: true,
151+
},
142152
// lintignore: S031 // TODO: Resolve this tfproviderlint issue
143153
"push_rules": {
144154
Description: "Push rules for the project.",
@@ -247,6 +257,8 @@ func dataSourceGitlabProjectRead(ctx context.Context, d *schema.ResourceData, me
247257
d.Set("runners_token", found.RunnersToken)
248258
d.Set("archived", found.Archived)
249259
d.Set("remove_source_branch_after_merge", found.RemoveSourceBranchAfterMerge)
260+
d.Set("merge_pipelines_enabled", found.MergePipelinesEnabled)
261+
d.Set("merge_trains_enabled", found.MergeTrainsEnabled)
250262

251263
log.Printf("[DEBUG] Reading Gitlab project %q push rules", d.Id())
252264

internal/provider/data_source_gitlab_projects.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,8 @@ func flattenProjects(projects []*gitlab.Project) (values []map[string]interface{
165165
"packages_enabled": project.PackagesEnabled,
166166
"build_coverage_regex": project.BuildCoverageRegex,
167167
"ci_forward_deployment_enabled": project.CIForwardDeploymentEnabled,
168+
"merge_pipelines_enabled": project.MergePipelinesEnabled,
169+
"merge_trains_enabled": project.MergeTrainsEnabled,
168170
}
169171
values = append(values, v)
170172
}
@@ -777,6 +779,16 @@ var _ = registerDataSource("gitlab_projects", func() *schema.Resource {
777779
Type: schema.TypeBool,
778780
Computed: true,
779781
},
782+
"merge_pipelines_enabled": {
783+
Description: "Whether merged results pipelines are enabled or not.",
784+
Type: schema.TypeBool,
785+
Computed: true,
786+
},
787+
"merge_trains_enabled": {
788+
Description: "Whether merge trains are enabled or not.",
789+
Type: schema.TypeBool,
790+
Computed: true,
791+
},
780792
},
781793
},
782794
},

internal/provider/resource_gitlab_project.go

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -375,6 +375,18 @@ var resourceGitLabProjectSchema = map[string]*schema.Schema{
375375
Optional: true,
376376
Default: true,
377377
},
378+
"merge_pipelines_enabled": {
379+
Description: "Enable or disable merge pipelines.",
380+
Type: schema.TypeBool,
381+
Optional: true,
382+
Default: false,
383+
},
384+
"merge_trains_enabled": {
385+
Description: "Enable or disable merge trains. Requires `merge_pipelines_enabled` to be set to `true` to take effect.",
386+
Type: schema.TypeBool,
387+
Optional: true,
388+
Default: false,
389+
},
378390
}
379391

380392
var _ = registerResource("gitlab_project", func() *schema.Resource {
@@ -447,6 +459,8 @@ func resourceGitlabProjectSetToState(client *gitlab.Client, d *schema.ResourceDa
447459
d.Set("merge_requests_template", project.MergeRequestsTemplate)
448460
d.Set("ci_config_path", project.CIConfigPath)
449461
d.Set("ci_forward_deployment_enabled", project.CIForwardDeploymentEnabled)
462+
d.Set("merge_pipelines_enabled", project.MergePipelinesEnabled)
463+
d.Set("merge_trains_enabled", project.MergeTrainsEnabled)
450464
return nil
451465
}
452466

@@ -702,6 +716,14 @@ func resourceGitlabProjectCreate(ctx context.Context, d *schema.ResourceData, me
702716
editProjectOptions.MergeRequestsTemplate = gitlab.String(v.(string))
703717
}
704718

719+
if v, ok := d.GetOk("merge_pipelines_enabled"); ok {
720+
editProjectOptions.MergePipelinesEnabled = gitlab.Bool(v.(bool))
721+
}
722+
723+
if v, ok := d.GetOk("merge_trains_enabled"); ok {
724+
editProjectOptions.MergeTrainsEnabled = gitlab.Bool(v.(bool))
725+
}
726+
705727
if (editProjectOptions != gitlab.EditProjectOptions{}) {
706728
if _, _, err := client.Projects.EditProject(d.Id(), &editProjectOptions, gitlab.WithContext(ctx)); err != nil {
707729
return diag.Errorf("Could not update project %q: %s", d.Id(), err)
@@ -896,6 +918,14 @@ func resourceGitlabProjectUpdate(ctx context.Context, d *schema.ResourceData, me
896918
options.CIForwardDeploymentEnabled = gitlab.Bool(d.Get("ci_forward_deployment_enabled").(bool))
897919
}
898920

921+
if d.HasChange("merge_pipelines_enabled") {
922+
options.MergePipelinesEnabled = gitlab.Bool(d.Get("merge_pipelines_enabled").(bool))
923+
}
924+
925+
if d.HasChange("merge_trains_enabled") {
926+
options.MergeTrainsEnabled = gitlab.Bool(d.Get("merge_trains_enabled").(bool))
927+
}
928+
899929
if *options != (gitlab.EditProjectOptions{}) {
900930
log.Printf("[DEBUG] update gitlab project %s", d.Id())
901931
_, _, err := client.Projects.EditProject(d.Id(), options, gitlab.WithContext(ctx))

internal/provider/resource_gitlab_project_test.go

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,8 @@ func TestAccGitlabProject_basic(t *testing.T) {
5555
MergeRequestsTemplate: "",
5656
CIConfigPath: ".gitlab-ci.yml@mynamespace/myproject",
5757
CIForwardDeploymentEnabled: true,
58+
MergePipelinesEnabled: true,
59+
MergeTrainsEnabled: true,
5860
}
5961

6062
defaultsMainBranch = defaults
@@ -102,6 +104,8 @@ func TestAccGitlabProject_basic(t *testing.T) {
102104
PagesAccessLevel: gitlab.DisabledAccessControl,
103105
BuildCoverageRegex: "bar",
104106
CIForwardDeploymentEnabled: false,
107+
MergePipelinesEnabled: false,
108+
MergeTrainsEnabled: false,
105109
}, &received),
106110
),
107111
},
@@ -463,6 +467,60 @@ func TestAccGitlabProject_IssueMergeRequestTemplates(t *testing.T) {
463467
})
464468
}
465469

470+
func TestAccGitlabProject_MergePipelines(t *testing.T) {
471+
var project gitlab.Project
472+
rInt := acctest.RandInt()
473+
474+
resource.Test(t, resource.TestCase{
475+
PreCheck: func() { testAccPreCheck(t) },
476+
ProviderFactories: providerFactories,
477+
CheckDestroy: testAccCheckGitlabProjectDestroy,
478+
Steps: []resource.TestStep{
479+
{
480+
SkipFunc: isRunningInCE,
481+
Config: testAccGitLabProjectMergePipelinesEnabled(rInt),
482+
Check: resource.ComposeTestCheckFunc(
483+
testAccCheckGitlabProjectExists("gitlab_project.foo", &project),
484+
func(s *terraform.State) error {
485+
if project.MergePipelinesEnabled != true {
486+
return fmt.Errorf("expected merge pipelines to be enabled")
487+
}
488+
489+
return nil
490+
},
491+
),
492+
},
493+
},
494+
})
495+
}
496+
497+
func TestAccGitlabProject_MergeTrains(t *testing.T) {
498+
var project gitlab.Project
499+
rInt := acctest.RandInt()
500+
501+
resource.Test(t, resource.TestCase{
502+
PreCheck: func() { testAccPreCheck(t) },
503+
ProviderFactories: providerFactories,
504+
CheckDestroy: testAccCheckGitlabProjectDestroy,
505+
Steps: []resource.TestStep{
506+
{
507+
SkipFunc: isRunningInCE,
508+
Config: testAccGitLabProjectMergeTrainsEnabled(rInt),
509+
Check: resource.ComposeTestCheckFunc(
510+
testAccCheckGitlabProjectExists("gitlab_project.foo", &project),
511+
func(s *terraform.State) error {
512+
if project.MergeTrainsEnabled != true {
513+
return fmt.Errorf("expected merge trains to be enabled")
514+
}
515+
516+
return nil
517+
},
518+
),
519+
},
520+
},
521+
})
522+
}
523+
466524
func TestAccGitlabProject_willError(t *testing.T) {
467525
var received, defaults gitlab.Project
468526
rInt := acctest.RandInt()
@@ -1283,6 +1341,8 @@ resource "gitlab_project" "foo" {
12831341
pages_access_level = "disabled"
12841342
build_coverage_regex = "bar"
12851343
ci_forward_deployment_enabled = false
1344+
merge_pipelines_enabled = false
1345+
merge_trains_enabled = false
12861346
}
12871347
`, rInt, rInt)
12881348
}
@@ -1507,3 +1567,34 @@ resource "gitlab_project" "foo" {
15071567
}
15081568
`, rInt, rInt)
15091569
}
1570+
1571+
func testAccGitLabProjectMergePipelinesEnabled(rInt int) string {
1572+
return fmt.Sprintf(`
1573+
resource "gitlab_project" "foo" {
1574+
name = "foo-%d"
1575+
path = "foo.%d"
1576+
description = "Terraform acceptance tests"
1577+
merge_pipelines_enabled = true
1578+
1579+
# So that acceptance tests can be run in a gitlab organization
1580+
# with no billing
1581+
visibility_level = "public"
1582+
}
1583+
`, rInt, rInt)
1584+
}
1585+
1586+
func testAccGitLabProjectMergeTrainsEnabled(rInt int) string {
1587+
return fmt.Sprintf(`
1588+
resource "gitlab_project" "foo" {
1589+
name = "foo-%d"
1590+
path = "foo.%d"
1591+
description = "Terraform acceptance tests"
1592+
merge_pipelines_enabled = true
1593+
merge_trains_enabled = true
1594+
1595+
# So that acceptance tests can be run in a gitlab organization
1596+
# with no billing
1597+
visibility_level = "public"
1598+
}
1599+
`, rInt, rInt)
1600+
}

0 commit comments

Comments
 (0)