diff --git a/.changelog/7238.txt b/.changelog/7238.txt new file mode 100644 index 00000000000..fecf2e3413e --- /dev/null +++ b/.changelog/7238.txt @@ -0,0 +1,3 @@ +```release-note:enhancement +cloudbuild: added `bitbucket_server_trigger_config` field to `google_cloudbuild_trigger` resource +``` diff --git a/google/resource_cloudbuild_trigger.go b/google/resource_cloudbuild_trigger.go index eb63ad98299..155662de0a1 100644 --- a/google/resource_cloudbuild_trigger.go +++ b/google/resource_cloudbuild_trigger.go @@ -116,6 +116,89 @@ and will need to be explicitly approved to start.`, }, }, }, + "bitbucket_server_trigger_config": { + Type: schema.TypeList, + Optional: true, + Description: `BitbucketServerTriggerConfig describes the configuration of a trigger that creates a build whenever a Bitbucket Server event is received.`, + MaxItems: 1, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "bitbucket_server_config_resource": { + Type: schema.TypeString, + Required: true, + Description: `The Bitbucket server config resource that this trigger config maps to.`, + }, + "project_key": { + Type: schema.TypeString, + Required: true, + Description: `Key of the project that the repo is in. For example: The key for https://mybitbucket.server/projects/TEST/repos/test-repo is "TEST".`, + }, + "repo_slug": { + Type: schema.TypeString, + Required: true, + Description: `Slug of the repository. A repository slug is a URL-friendly version of a repository name, automatically generated by Bitbucket for use in the URL. +For example, if the repository name is 'test repo', in the URL it would become 'test-repo' as in https://mybitbucket.server/projects/TEST/repos/test-repo.`, + }, + "pull_request": { + Type: schema.TypeList, + Optional: true, + Description: `Filter to match changes in pull requests.`, + MaxItems: 1, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "branch": { + Type: schema.TypeString, + Required: true, + Description: `Regex of branches to match. +The syntax of the regular expressions accepted is the syntax accepted by RE2 and described at https://github.com/google/re2/wiki/Syntax`, + }, + "comment_control": { + Type: schema.TypeString, + Optional: true, + ValidateFunc: validateEnum([]string{"COMMENTS_DISABLED", "COMMENTS_ENABLED", "COMMENTS_ENABLED_FOR_EXTERNAL_CONTRIBUTORS_ONLY", ""}), + Description: `Configure builds to run whether a repository owner or collaborator need to comment /gcbrun. Possible values: ["COMMENTS_DISABLED", "COMMENTS_ENABLED", "COMMENTS_ENABLED_FOR_EXTERNAL_CONTRIBUTORS_ONLY"]`, + }, + "invert_regex": { + Type: schema.TypeBool, + Optional: true, + Description: `If true, branches that do NOT match the git_ref will trigger a build.`, + }, + }, + }, + ExactlyOneOf: []string{"bitbucket_server_trigger_config.0.pull_request", "bitbucket_server_trigger_config.0.push"}, + }, + "push": { + Type: schema.TypeList, + Optional: true, + Description: `Filter to match changes in refs like branches, tags.`, + MaxItems: 1, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "branch": { + Type: schema.TypeString, + Optional: true, + Description: `Regex of branches to match. Specify only one of branch or tag.`, + ExactlyOneOf: []string{"bitbucket_server_trigger_config.0.push.0.branch", "bitbucket_server_trigger_config.0.push.0.tag"}, + }, + "invert_regex": { + Type: schema.TypeBool, + Optional: true, + Description: `When true, only trigger a build if the revision regex does NOT match the gitRef regex.`, + }, + "tag": { + Type: schema.TypeString, + Optional: true, + Description: `Regex of tags to match. Specify only one of branch or tag.`, + ExactlyOneOf: []string{"bitbucket_server_trigger_config.0.push.0.branch", "bitbucket_server_trigger_config.0.push.0.tag"}, + }, + }, + }, + ExactlyOneOf: []string{"bitbucket_server_trigger_config.0.pull_request", "bitbucket_server_trigger_config.0.push"}, + }, + }, + }, + AtLeastOneOf: []string{"trigger_template", "github", "bitbucket_server_trigger_config", "pubsub_config", "webhook_config", "source_to_build"}, + }, "build": { Type: schema.TypeList, Optional: true, @@ -842,7 +925,7 @@ https://github.com/googlecloudplatform/cloud-builders is "googlecloudplatform".` }, }, }, - AtLeastOneOf: []string{"trigger_template", "github", "pubsub_config", "webhook_config", "source_to_build"}, + AtLeastOneOf: []string{"trigger_template", "github", "bitbucket_server_trigger_config", "pubsub_config", "webhook_config", "source_to_build"}, }, "ignored_files": { Type: schema.TypeList, @@ -933,7 +1016,7 @@ Only populated on get requests.`, }, }, }, - AtLeastOneOf: []string{"trigger_template", "github", "pubsub_config", "webhook_config", "source_to_build"}, + AtLeastOneOf: []string{"trigger_template", "github", "bitbucket_server_trigger_config", "pubsub_config", "webhook_config", "source_to_build"}, }, "service_account": { Type: schema.TypeString, @@ -983,7 +1066,7 @@ Format: projects/{project}/locations/{location}/githubEnterpriseConfigs/{id}. pr }, }, }, - AtLeastOneOf: []string{"trigger_template", "github", "pubsub_config", "webhook_config", "source_to_build"}, + AtLeastOneOf: []string{"trigger_template", "github", "bitbucket_server_trigger_config", "pubsub_config", "webhook_config", "source_to_build"}, }, "substitutions": { Type: schema.TypeMap, @@ -1061,7 +1144,7 @@ This field is a regular expression.`, }, }, }, - AtLeastOneOf: []string{"trigger_template", "github", "pubsub_config", "webhook_config", "source_to_build"}, + AtLeastOneOf: []string{"trigger_template", "github", "bitbucket_server_trigger_config", "pubsub_config", "webhook_config", "source_to_build"}, }, "webhook_config": { Type: schema.TypeList, @@ -1086,7 +1169,7 @@ Only populated on get requests.`, }, }, }, - AtLeastOneOf: []string{"trigger_template", "github", "pubsub_config", "webhook_config", "source_to_build"}, + AtLeastOneOf: []string{"trigger_template", "github", "bitbucket_server_trigger_config", "pubsub_config", "webhook_config", "source_to_build"}, }, "create_time": { Type: schema.TypeString, @@ -1207,6 +1290,12 @@ func resourceCloudBuildTriggerCreate(d *schema.ResourceData, meta interface{}) e } else if v, ok := d.GetOkExists("github"); !isEmptyValue(reflect.ValueOf(githubProp)) && (ok || !reflect.DeepEqual(v, githubProp)) { obj["github"] = githubProp } + bitbucketServerTriggerConfigProp, err := expandCloudBuildTriggerBitbucketServerTriggerConfig(d.Get("bitbucket_server_trigger_config"), d, config) + if err != nil { + return err + } else if v, ok := d.GetOkExists("bitbucket_server_trigger_config"); !isEmptyValue(reflect.ValueOf(bitbucketServerTriggerConfigProp)) && (ok || !reflect.DeepEqual(v, bitbucketServerTriggerConfigProp)) { + obj["bitbucketServerTriggerConfig"] = bitbucketServerTriggerConfigProp + } pubsubConfigProp, err := expandCloudBuildTriggerPubsubConfig(d.Get("pubsub_config"), d, config) if err != nil { return err @@ -1374,6 +1463,9 @@ func resourceCloudBuildTriggerRead(d *schema.ResourceData, meta interface{}) err if err := d.Set("github", flattenCloudBuildTriggerGithub(res["github"], d, config)); err != nil { return fmt.Errorf("Error reading Trigger: %s", err) } + if err := d.Set("bitbucket_server_trigger_config", flattenCloudBuildTriggerBitbucketServerTriggerConfig(res["bitbucketServerTriggerConfig"], d, config)); err != nil { + return fmt.Errorf("Error reading Trigger: %s", err) + } if err := d.Set("pubsub_config", flattenCloudBuildTriggerPubsubConfig(res["pubsubConfig"], d, config)); err != nil { return fmt.Errorf("Error reading Trigger: %s", err) } @@ -1496,6 +1588,12 @@ func resourceCloudBuildTriggerUpdate(d *schema.ResourceData, meta interface{}) e } else if v, ok := d.GetOkExists("github"); !isEmptyValue(reflect.ValueOf(v)) && (ok || !reflect.DeepEqual(v, githubProp)) { obj["github"] = githubProp } + bitbucketServerTriggerConfigProp, err := expandCloudBuildTriggerBitbucketServerTriggerConfig(d.Get("bitbucket_server_trigger_config"), d, config) + if err != nil { + return err + } else if v, ok := d.GetOkExists("bitbucket_server_trigger_config"); !isEmptyValue(reflect.ValueOf(v)) && (ok || !reflect.DeepEqual(v, bitbucketServerTriggerConfigProp)) { + obj["bitbucketServerTriggerConfig"] = bitbucketServerTriggerConfigProp + } pubsubConfigProp, err := expandCloudBuildTriggerPubsubConfig(d.Get("pubsub_config"), d, config) if err != nil { return err @@ -1878,6 +1976,97 @@ func flattenCloudBuildTriggerGithubPushTag(v interface{}, d *schema.ResourceData return v } +func flattenCloudBuildTriggerBitbucketServerTriggerConfig(v interface{}, d *schema.ResourceData, config *Config) interface{} { + if v == nil { + return nil + } + original := v.(map[string]interface{}) + if len(original) == 0 { + return nil + } + transformed := make(map[string]interface{}) + transformed["repo_slug"] = + flattenCloudBuildTriggerBitbucketServerTriggerConfigRepoSlug(original["repoSlug"], d, config) + transformed["project_key"] = + flattenCloudBuildTriggerBitbucketServerTriggerConfigProjectKey(original["projectKey"], d, config) + transformed["bitbucket_server_config_resource"] = + flattenCloudBuildTriggerBitbucketServerTriggerConfigBitbucketServerConfigResource(original["bitbucketServerConfigResource"], d, config) + transformed["pull_request"] = + flattenCloudBuildTriggerBitbucketServerTriggerConfigPullRequest(original["pullRequest"], d, config) + transformed["push"] = + flattenCloudBuildTriggerBitbucketServerTriggerConfigPush(original["push"], d, config) + return []interface{}{transformed} +} +func flattenCloudBuildTriggerBitbucketServerTriggerConfigRepoSlug(v interface{}, d *schema.ResourceData, config *Config) interface{} { + return v +} + +func flattenCloudBuildTriggerBitbucketServerTriggerConfigProjectKey(v interface{}, d *schema.ResourceData, config *Config) interface{} { + return v +} + +func flattenCloudBuildTriggerBitbucketServerTriggerConfigBitbucketServerConfigResource(v interface{}, d *schema.ResourceData, config *Config) interface{} { + return v +} + +func flattenCloudBuildTriggerBitbucketServerTriggerConfigPullRequest(v interface{}, d *schema.ResourceData, config *Config) interface{} { + if v == nil { + return nil + } + original := v.(map[string]interface{}) + if len(original) == 0 { + return nil + } + transformed := make(map[string]interface{}) + transformed["branch"] = + flattenCloudBuildTriggerBitbucketServerTriggerConfigPullRequestBranch(original["branch"], d, config) + transformed["comment_control"] = + flattenCloudBuildTriggerBitbucketServerTriggerConfigPullRequestCommentControl(original["commentControl"], d, config) + transformed["invert_regex"] = + flattenCloudBuildTriggerBitbucketServerTriggerConfigPullRequestInvertRegex(original["invertRegex"], d, config) + return []interface{}{transformed} +} +func flattenCloudBuildTriggerBitbucketServerTriggerConfigPullRequestBranch(v interface{}, d *schema.ResourceData, config *Config) interface{} { + return v +} + +func flattenCloudBuildTriggerBitbucketServerTriggerConfigPullRequestCommentControl(v interface{}, d *schema.ResourceData, config *Config) interface{} { + return v +} + +func flattenCloudBuildTriggerBitbucketServerTriggerConfigPullRequestInvertRegex(v interface{}, d *schema.ResourceData, config *Config) interface{} { + return v +} + +func flattenCloudBuildTriggerBitbucketServerTriggerConfigPush(v interface{}, d *schema.ResourceData, config *Config) interface{} { + if v == nil { + return nil + } + original := v.(map[string]interface{}) + if len(original) == 0 { + return nil + } + transformed := make(map[string]interface{}) + transformed["invert_regex"] = + flattenCloudBuildTriggerBitbucketServerTriggerConfigPushInvertRegex(original["invertRegex"], d, config) + transformed["branch"] = + flattenCloudBuildTriggerBitbucketServerTriggerConfigPushBranch(original["branch"], d, config) + transformed["tag"] = + flattenCloudBuildTriggerBitbucketServerTriggerConfigPushTag(original["tag"], d, config) + return []interface{}{transformed} +} +func flattenCloudBuildTriggerBitbucketServerTriggerConfigPushInvertRegex(v interface{}, d *schema.ResourceData, config *Config) interface{} { + return v +} + +func flattenCloudBuildTriggerBitbucketServerTriggerConfigPushBranch(v interface{}, d *schema.ResourceData, config *Config) interface{} { + return v +} + +func flattenCloudBuildTriggerBitbucketServerTriggerConfigPushTag(v interface{}, d *schema.ResourceData, config *Config) interface{} { + return v +} + func flattenCloudBuildTriggerPubsubConfig(v interface{}, d *schema.ResourceData, config *Config) interface{} { if v == nil { return nil @@ -2865,6 +3054,155 @@ func expandCloudBuildTriggerGithubPushTag(v interface{}, d TerraformResourceData return v, nil } +func expandCloudBuildTriggerBitbucketServerTriggerConfig(v interface{}, d TerraformResourceData, config *Config) (interface{}, error) { + l := v.([]interface{}) + if len(l) == 0 || l[0] == nil { + return nil, nil + } + raw := l[0] + original := raw.(map[string]interface{}) + transformed := make(map[string]interface{}) + + transformedRepoSlug, err := expandCloudBuildTriggerBitbucketServerTriggerConfigRepoSlug(original["repo_slug"], d, config) + if err != nil { + return nil, err + } else if val := reflect.ValueOf(transformedRepoSlug); val.IsValid() && !isEmptyValue(val) { + transformed["repoSlug"] = transformedRepoSlug + } + + transformedProjectKey, err := expandCloudBuildTriggerBitbucketServerTriggerConfigProjectKey(original["project_key"], d, config) + if err != nil { + return nil, err + } else if val := reflect.ValueOf(transformedProjectKey); val.IsValid() && !isEmptyValue(val) { + transformed["projectKey"] = transformedProjectKey + } + + transformedBitbucketServerConfigResource, err := expandCloudBuildTriggerBitbucketServerTriggerConfigBitbucketServerConfigResource(original["bitbucket_server_config_resource"], d, config) + if err != nil { + return nil, err + } else if val := reflect.ValueOf(transformedBitbucketServerConfigResource); val.IsValid() && !isEmptyValue(val) { + transformed["bitbucketServerConfigResource"] = transformedBitbucketServerConfigResource + } + + transformedPullRequest, err := expandCloudBuildTriggerBitbucketServerTriggerConfigPullRequest(original["pull_request"], d, config) + if err != nil { + return nil, err + } else if val := reflect.ValueOf(transformedPullRequest); val.IsValid() && !isEmptyValue(val) { + transformed["pullRequest"] = transformedPullRequest + } + + transformedPush, err := expandCloudBuildTriggerBitbucketServerTriggerConfigPush(original["push"], d, config) + if err != nil { + return nil, err + } else if val := reflect.ValueOf(transformedPush); val.IsValid() && !isEmptyValue(val) { + transformed["push"] = transformedPush + } + + return transformed, nil +} + +func expandCloudBuildTriggerBitbucketServerTriggerConfigRepoSlug(v interface{}, d TerraformResourceData, config *Config) (interface{}, error) { + return v, nil +} + +func expandCloudBuildTriggerBitbucketServerTriggerConfigProjectKey(v interface{}, d TerraformResourceData, config *Config) (interface{}, error) { + return v, nil +} + +func expandCloudBuildTriggerBitbucketServerTriggerConfigBitbucketServerConfigResource(v interface{}, d TerraformResourceData, config *Config) (interface{}, error) { + return v, nil +} + +func expandCloudBuildTriggerBitbucketServerTriggerConfigPullRequest(v interface{}, d TerraformResourceData, config *Config) (interface{}, error) { + l := v.([]interface{}) + if len(l) == 0 || l[0] == nil { + return nil, nil + } + raw := l[0] + original := raw.(map[string]interface{}) + transformed := make(map[string]interface{}) + + transformedBranch, err := expandCloudBuildTriggerBitbucketServerTriggerConfigPullRequestBranch(original["branch"], d, config) + if err != nil { + return nil, err + } else if val := reflect.ValueOf(transformedBranch); val.IsValid() && !isEmptyValue(val) { + transformed["branch"] = transformedBranch + } + + transformedCommentControl, err := expandCloudBuildTriggerBitbucketServerTriggerConfigPullRequestCommentControl(original["comment_control"], d, config) + if err != nil { + return nil, err + } else if val := reflect.ValueOf(transformedCommentControl); val.IsValid() && !isEmptyValue(val) { + transformed["commentControl"] = transformedCommentControl + } + + transformedInvertRegex, err := expandCloudBuildTriggerBitbucketServerTriggerConfigPullRequestInvertRegex(original["invert_regex"], d, config) + if err != nil { + return nil, err + } else if val := reflect.ValueOf(transformedInvertRegex); val.IsValid() && !isEmptyValue(val) { + transformed["invertRegex"] = transformedInvertRegex + } + + return transformed, nil +} + +func expandCloudBuildTriggerBitbucketServerTriggerConfigPullRequestBranch(v interface{}, d TerraformResourceData, config *Config) (interface{}, error) { + return v, nil +} + +func expandCloudBuildTriggerBitbucketServerTriggerConfigPullRequestCommentControl(v interface{}, d TerraformResourceData, config *Config) (interface{}, error) { + return v, nil +} + +func expandCloudBuildTriggerBitbucketServerTriggerConfigPullRequestInvertRegex(v interface{}, d TerraformResourceData, config *Config) (interface{}, error) { + return v, nil +} + +func expandCloudBuildTriggerBitbucketServerTriggerConfigPush(v interface{}, d TerraformResourceData, config *Config) (interface{}, error) { + l := v.([]interface{}) + if len(l) == 0 || l[0] == nil { + return nil, nil + } + raw := l[0] + original := raw.(map[string]interface{}) + transformed := make(map[string]interface{}) + + transformedInvertRegex, err := expandCloudBuildTriggerBitbucketServerTriggerConfigPushInvertRegex(original["invert_regex"], d, config) + if err != nil { + return nil, err + } else if val := reflect.ValueOf(transformedInvertRegex); val.IsValid() && !isEmptyValue(val) { + transformed["invertRegex"] = transformedInvertRegex + } + + transformedBranch, err := expandCloudBuildTriggerBitbucketServerTriggerConfigPushBranch(original["branch"], d, config) + if err != nil { + return nil, err + } else if val := reflect.ValueOf(transformedBranch); val.IsValid() && !isEmptyValue(val) { + transformed["branch"] = transformedBranch + } + + transformedTag, err := expandCloudBuildTriggerBitbucketServerTriggerConfigPushTag(original["tag"], d, config) + if err != nil { + return nil, err + } else if val := reflect.ValueOf(transformedTag); val.IsValid() && !isEmptyValue(val) { + transformed["tag"] = transformedTag + } + + return transformed, nil +} + +func expandCloudBuildTriggerBitbucketServerTriggerConfigPushInvertRegex(v interface{}, d TerraformResourceData, config *Config) (interface{}, error) { + return v, nil +} + +func expandCloudBuildTriggerBitbucketServerTriggerConfigPushBranch(v interface{}, d TerraformResourceData, config *Config) (interface{}, error) { + return v, nil +} + +func expandCloudBuildTriggerBitbucketServerTriggerConfigPushTag(v interface{}, d TerraformResourceData, config *Config) (interface{}, error) { + return v, nil +} + func expandCloudBuildTriggerPubsubConfig(v interface{}, d TerraformResourceData, config *Config) (interface{}, error) { l := v.([]interface{}) if len(l) == 0 || l[0] == nil { diff --git a/google/resource_cloudbuild_trigger_generated_test.go b/google/resource_cloudbuild_trigger_generated_test.go index 420fe3ca954..024161b22b5 100644 --- a/google/resource_cloudbuild_trigger_generated_test.go +++ b/google/resource_cloudbuild_trigger_generated_test.go @@ -438,6 +438,99 @@ resource "google_cloudbuild_trigger" "manual-trigger" { `, context) } +func TestAccCloudBuildTrigger_cloudbuildTriggerBitbucketServerPushExample(t *testing.T) { + t.Parallel() + + context := map[string]interface{}{ + "random_suffix": randString(t, 10), + } + + vcrTest(t, resource.TestCase{ + PreCheck: func() { testAccPreCheck(t) }, + Providers: testAccProviders, + CheckDestroy: testAccCheckCloudBuildTriggerDestroyProducer(t), + Steps: []resource.TestStep{ + { + Config: testAccCloudBuildTrigger_cloudbuildTriggerBitbucketServerPushExample(context), + }, + { + ResourceName: "google_cloudbuild_trigger.bbs-push-trigger", + ImportState: true, + ImportStateVerify: true, + ImportStateVerifyIgnore: []string{"location"}, + }, + }, + }) +} + +func testAccCloudBuildTrigger_cloudbuildTriggerBitbucketServerPushExample(context map[string]interface{}) string { + return Nprintf(` +resource "google_cloudbuild_trigger" "bbs-push-trigger" { + name = "terraform-bbs-push-trigger" + location = "us-central1" + + bitbucket_server_trigger_config { + repo_slug = "terraform-provider-google" + project_key = "STAG" + bitbucket_server_config_resource = "projects/123456789/locations/us-central1/bitbucketServerConfigs/myBitbucketConfig" + push { + tag = "^0.1.*" + invert_regex = true + } + } + + filename = "cloudbuild.yaml" +} +`, context) +} + +func TestAccCloudBuildTrigger_cloudbuildTriggerBitbucketServerPullRequestExample(t *testing.T) { + t.Parallel() + + context := map[string]interface{}{ + "random_suffix": randString(t, 10), + } + + vcrTest(t, resource.TestCase{ + PreCheck: func() { testAccPreCheck(t) }, + Providers: testAccProviders, + CheckDestroy: testAccCheckCloudBuildTriggerDestroyProducer(t), + Steps: []resource.TestStep{ + { + Config: testAccCloudBuildTrigger_cloudbuildTriggerBitbucketServerPullRequestExample(context), + }, + { + ResourceName: "google_cloudbuild_trigger.bbs-pull-request-trigger", + ImportState: true, + ImportStateVerify: true, + ImportStateVerifyIgnore: []string{"location"}, + }, + }, + }) +} + +func testAccCloudBuildTrigger_cloudbuildTriggerBitbucketServerPullRequestExample(context map[string]interface{}) string { + return Nprintf(` +resource "google_cloudbuild_trigger" "bbs-pull-request-trigger" { + name = "terraform-bbs-pull-request-trigger" + location = "us-central1" + + bitbucket_server_trigger_config { + repo_slug = "terraform-provider-google" + project_key = "STAG" + bitbucket_server_config_resource = "projects/123456789/locations/us-central1/bitbucketServerConfigs/myBitbucketConfig" + pull_request { + branch = "^master$" + invert_regex = false + comment_control = "COMMENTS_ENABLED" + } + } + + filename = "cloudbuild.yaml" +} +`, context) +} + func testAccCheckCloudBuildTriggerDestroyProducer(t *testing.T) func(s *terraform.State) error { return func(s *terraform.State) error { for name, rs := range s.RootModule().Resources { diff --git a/website/docs/r/cloudbuild_trigger.html.markdown b/website/docs/r/cloudbuild_trigger.html.markdown index 5a26284138e..e46d3cd6a08 100644 --- a/website/docs/r/cloudbuild_trigger.html.markdown +++ b/website/docs/r/cloudbuild_trigger.html.markdown @@ -411,6 +411,59 @@ resource "google_cloudbuild_trigger" "repo-trigger" { filename = "cloudbuild.yaml" } ``` +
+ + Open in Cloud Shell + +
+## Example Usage - Cloudbuild Trigger Bitbucket Server Push + + +```hcl +resource "google_cloudbuild_trigger" "bbs-push-trigger" { + name = "terraform-bbs-push-trigger" + location = "us-central1" + + bitbucket_server_trigger_config { + repo_slug = "terraform-provider-google" + project_key = "STAG" + bitbucket_server_config_resource = "projects/123456789/locations/us-central1/bitbucketServerConfigs/myBitbucketConfig" + push { + tag = "^0.1.*" + invert_regex = true + } + } + + filename = "cloudbuild.yaml" +} +``` +
+ + Open in Cloud Shell + +
+## Example Usage - Cloudbuild Trigger Bitbucket Server Pull Request + + +```hcl +resource "google_cloudbuild_trigger" "bbs-pull-request-trigger" { + name = "terraform-bbs-pull-request-trigger" + location = "us-central1" + + bitbucket_server_trigger_config { + repo_slug = "terraform-provider-google" + project_key = "STAG" + bitbucket_server_config_resource = "projects/123456789/locations/us-central1/bitbucketServerConfigs/myBitbucketConfig" + pull_request { + branch = "^master$" + invert_regex = false + comment_control = "COMMENTS_ENABLED" + } + } + + filename = "cloudbuild.yaml" +} +``` ## Argument Reference @@ -522,6 +575,11 @@ The following arguments are supported: One of `trigger_template`, `github`, `pubsub_config` or `webhook_config` must be provided. Structure is [documented below](#nested_github). +* `bitbucket_server_trigger_config` - + (Optional) + BitbucketServerTriggerConfig describes the configuration of a trigger that creates a build whenever a Bitbucket Server event is received. + Structure is [documented below](#nested_bitbucket_server_trigger_config). + * `pubsub_config` - (Optional) PubsubConfig describes the configuration of a trigger that creates @@ -746,6 +804,62 @@ The following arguments are supported: (Optional) Regex of tags to match. Specify only one of branch or tag. +The `bitbucket_server_trigger_config` block supports: + +* `repo_slug` - + (Required) + Slug of the repository. A repository slug is a URL-friendly version of a repository name, automatically generated by Bitbucket for use in the URL. + For example, if the repository name is 'test repo', in the URL it would become 'test-repo' as in https://mybitbucket.server/projects/TEST/repos/test-repo. + +* `project_key` - + (Required) + Key of the project that the repo is in. For example: The key for https://mybitbucket.server/projects/TEST/repos/test-repo is "TEST". + +* `bitbucket_server_config_resource` - + (Required) + The Bitbucket server config resource that this trigger config maps to. + +* `pull_request` - + (Optional) + Filter to match changes in pull requests. + Structure is [documented below](#nested_pull_request). + +* `push` - + (Optional) + Filter to match changes in refs like branches, tags. + Structure is [documented below](#nested_push). + + +The `pull_request` block supports: + +* `branch` - + (Required) + Regex of branches to match. + The syntax of the regular expressions accepted is the syntax accepted by RE2 and described at https://github.com/google/re2/wiki/Syntax + +* `comment_control` - + (Optional) + Configure builds to run whether a repository owner or collaborator need to comment /gcbrun. + Possible values are `COMMENTS_DISABLED`, `COMMENTS_ENABLED`, and `COMMENTS_ENABLED_FOR_EXTERNAL_CONTRIBUTORS_ONLY`. + +* `invert_regex` - + (Optional) + If true, branches that do NOT match the git_ref will trigger a build. + +The `push` block supports: + +* `invert_regex` - + (Optional) + When true, only trigger a build if the revision regex does NOT match the gitRef regex. + +* `branch` - + (Optional) + Regex of branches to match. Specify only one of branch or tag. + +* `tag` - + (Optional) + Regex of tags to match. Specify only one of branch or tag. + The `pubsub_config` block supports: * `subscription` -