Skip to content

Commit

Permalink
Enable cloudbuild to receive Github events.
Browse files Browse the repository at this point in the history
Signed-off-by: Modular Magician <[email protected]>
  • Loading branch information
nat-henderson authored and modular-magician committed Oct 2, 2019
1 parent dc9c513 commit e083af5
Show file tree
Hide file tree
Showing 2 changed files with 304 additions and 0 deletions.
257 changes: 257 additions & 0 deletions google-beta/resource_cloud_build_trigger.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import (
"time"

"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
"github.com/hashicorp/terraform-plugin-sdk/helper/validation"
)

func resourceCloudBuildTrigger() *schema.Resource {
Expand Down Expand Up @@ -156,6 +157,58 @@ func resourceCloudBuildTrigger() *schema.Resource {
Optional: true,
ConflictsWith: []string{"build"},
},
"github": {
Type: schema.TypeList,
Optional: true,
MaxItems: 1,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"name": {
Type: schema.TypeString,
Optional: true,
},
"owner": {
Type: schema.TypeString,
Optional: true,
},
"pull_request": {
Type: schema.TypeList,
Optional: true,
MaxItems: 1,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"branch": {
Type: schema.TypeString,
Optional: true,
},
"comment_control": {
Type: schema.TypeString,
Optional: true,
ValidateFunc: validation.StringInSlice([]string{"COMMENTS_DISABLED", "COMMENTS_ENABLED", ""}, false),
},
},
},
},
"push": {
Type: schema.TypeList,
Optional: true,
MaxItems: 1,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"branch": {
Type: schema.TypeString,
Optional: true,
},
"tag": {
Type: schema.TypeString,
Optional: true,
},
},
},
},
},
},
},
"ignored_files": {
Type: schema.TypeList,
Optional: true,
Expand Down Expand Up @@ -274,6 +327,12 @@ func resourceCloudBuildTriggerCreate(d *schema.ResourceData, meta interface{}) e
} else if v, ok := d.GetOkExists("trigger_template"); !isEmptyValue(reflect.ValueOf(triggerTemplateProp)) && (ok || !reflect.DeepEqual(v, triggerTemplateProp)) {
obj["triggerTemplate"] = triggerTemplateProp
}
githubProp, err := expandCloudBuildTriggerGithub(d.Get("github"), d, config)
if err != nil {
return err
} else if v, ok := d.GetOkExists("github"); !isEmptyValue(reflect.ValueOf(githubProp)) && (ok || !reflect.DeepEqual(v, githubProp)) {
obj["github"] = githubProp
}
buildProp, err := expandCloudBuildTriggerBuild(d.Get("build"), d, config)
if err != nil {
return err
Expand Down Expand Up @@ -371,6 +430,9 @@ func resourceCloudBuildTriggerRead(d *schema.ResourceData, meta interface{}) err
if err := d.Set("trigger_template", flattenCloudBuildTriggerTriggerTemplate(res["triggerTemplate"], d)); err != nil {
return fmt.Errorf("Error reading Trigger: %s", err)
}
if err := d.Set("github", flattenCloudBuildTriggerGithub(res["github"], d)); err != nil {
return fmt.Errorf("Error reading Trigger: %s", err)
}
if err := d.Set("build", flattenCloudBuildTriggerBuild(res["build"], d)); err != nil {
return fmt.Errorf("Error reading Trigger: %s", err)
}
Expand Down Expand Up @@ -429,6 +491,12 @@ func resourceCloudBuildTriggerUpdate(d *schema.ResourceData, meta interface{}) e
} else if v, ok := d.GetOkExists("trigger_template"); !isEmptyValue(reflect.ValueOf(v)) && (ok || !reflect.DeepEqual(v, triggerTemplateProp)) {
obj["triggerTemplate"] = triggerTemplateProp
}
githubProp, err := expandCloudBuildTriggerGithub(d.Get("github"), d, config)
if err != nil {
return err
} else if v, ok := d.GetOkExists("github"); !isEmptyValue(reflect.ValueOf(v)) && (ok || !reflect.DeepEqual(v, githubProp)) {
obj["github"] = githubProp
}
buildProp, err := expandCloudBuildTriggerBuild(d.Get("build"), d, config)
if err != nil {
return err
Expand Down Expand Up @@ -576,6 +644,79 @@ func flattenCloudBuildTriggerTriggerTemplateCommitSha(v interface{}, d *schema.R
return v
}

func flattenCloudBuildTriggerGithub(v interface{}, d *schema.ResourceData) interface{} {
if v == nil {
return nil
}
original := v.(map[string]interface{})
if len(original) == 0 {
return nil
}
transformed := make(map[string]interface{})
transformed["owner"] =
flattenCloudBuildTriggerGithubOwner(original["owner"], d)
transformed["name"] =
flattenCloudBuildTriggerGithubName(original["name"], d)
transformed["pull_request"] =
flattenCloudBuildTriggerGithubPullRequest(original["pullRequest"], d)
transformed["push"] =
flattenCloudBuildTriggerGithubPush(original["push"], d)
return []interface{}{transformed}
}
func flattenCloudBuildTriggerGithubOwner(v interface{}, d *schema.ResourceData) interface{} {
return v
}

func flattenCloudBuildTriggerGithubName(v interface{}, d *schema.ResourceData) interface{} {
return v
}

func flattenCloudBuildTriggerGithubPullRequest(v interface{}, d *schema.ResourceData) interface{} {
if v == nil {
return nil
}
original := v.(map[string]interface{})
if len(original) == 0 {
return nil
}
transformed := make(map[string]interface{})
transformed["branch"] =
flattenCloudBuildTriggerGithubPullRequestBranch(original["branch"], d)
transformed["comment_control"] =
flattenCloudBuildTriggerGithubPullRequestCommentControl(original["commentControl"], d)
return []interface{}{transformed}
}
func flattenCloudBuildTriggerGithubPullRequestBranch(v interface{}, d *schema.ResourceData) interface{} {
return v
}

func flattenCloudBuildTriggerGithubPullRequestCommentControl(v interface{}, d *schema.ResourceData) interface{} {
return v
}

func flattenCloudBuildTriggerGithubPush(v interface{}, d *schema.ResourceData) interface{} {
if v == nil {
return nil
}
original := v.(map[string]interface{})
if len(original) == 0 {
return nil
}
transformed := make(map[string]interface{})
transformed["branch"] =
flattenCloudBuildTriggerGithubPushBranch(original["branch"], d)
transformed["tag"] =
flattenCloudBuildTriggerGithubPushTag(original["tag"], d)
return []interface{}{transformed}
}
func flattenCloudBuildTriggerGithubPushBranch(v interface{}, d *schema.ResourceData) interface{} {
return v
}

func flattenCloudBuildTriggerGithubPushTag(v interface{}, d *schema.ResourceData) interface{} {
return v
}

func flattenCloudBuildTriggerBuild(v interface{}, d *schema.ResourceData) interface{} {
if v == nil {
return nil
Expand Down Expand Up @@ -805,6 +946,122 @@ func expandCloudBuildTriggerTriggerTemplateCommitSha(v interface{}, d TerraformR
return v, nil
}

func expandCloudBuildTriggerGithub(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{})

transformedOwner, err := expandCloudBuildTriggerGithubOwner(original["owner"], d, config)
if err != nil {
return nil, err
} else if val := reflect.ValueOf(transformedOwner); val.IsValid() && !isEmptyValue(val) {
transformed["owner"] = transformedOwner
}

transformedName, err := expandCloudBuildTriggerGithubName(original["name"], d, config)
if err != nil {
return nil, err
} else if val := reflect.ValueOf(transformedName); val.IsValid() && !isEmptyValue(val) {
transformed["name"] = transformedName
}

transformedPullRequest, err := expandCloudBuildTriggerGithubPullRequest(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 := expandCloudBuildTriggerGithubPush(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 expandCloudBuildTriggerGithubOwner(v interface{}, d TerraformResourceData, config *Config) (interface{}, error) {
return v, nil
}

func expandCloudBuildTriggerGithubName(v interface{}, d TerraformResourceData, config *Config) (interface{}, error) {
return v, nil
}

func expandCloudBuildTriggerGithubPullRequest(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 := expandCloudBuildTriggerGithubPullRequestBranch(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 := expandCloudBuildTriggerGithubPullRequestCommentControl(original["comment_control"], d, config)
if err != nil {
return nil, err
} else if val := reflect.ValueOf(transformedCommentControl); val.IsValid() && !isEmptyValue(val) {
transformed["commentControl"] = transformedCommentControl
}

return transformed, nil
}

func expandCloudBuildTriggerGithubPullRequestBranch(v interface{}, d TerraformResourceData, config *Config) (interface{}, error) {
return v, nil
}

func expandCloudBuildTriggerGithubPullRequestCommentControl(v interface{}, d TerraformResourceData, config *Config) (interface{}, error) {
return v, nil
}

func expandCloudBuildTriggerGithubPush(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 := expandCloudBuildTriggerGithubPushBranch(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 := expandCloudBuildTriggerGithubPushTag(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 expandCloudBuildTriggerGithubPushBranch(v interface{}, d TerraformResourceData, config *Config) (interface{}, error) {
return v, nil
}

func expandCloudBuildTriggerGithubPushTag(v interface{}, d TerraformResourceData, config *Config) (interface{}, error) {
return v, nil
}

func expandCloudBuildTriggerBuild(v interface{}, d TerraformResourceData, config *Config) (interface{}, error) {
l := v.([]interface{})
if len(l) == 0 || l[0] == nil {
Expand Down
47 changes: 47 additions & 0 deletions website/docs/r/cloudbuild_trigger.html.markdown
Original file line number Diff line number Diff line change
Expand Up @@ -107,8 +107,14 @@ The following arguments are supported:
Branch and tag names in trigger templates are interpreted as regular
expressions. Any branch or tag change that matches that regular
expression will trigger a build.
Mutually exclusive with `github`.
This field is required, and will be validated as such in 3.0.0. Structure is documented below.

* `github` -
(Optional, [Beta](https://terraform.io/docs/providers/google/provider_versions.html))
Describes the configuration of a trigger that creates a build whenever a GitHub event is received.
Mutually exclusive with `triggerTemplate`. Structure is documented below.

* `build` -
(Optional)
Contents of the build template. Either a filename or build template must be provided. Structure is documented below.
Expand Down Expand Up @@ -147,6 +153,47 @@ The `trigger_template` block supports:
(Optional)
Explicit commit SHA to build. Exactly one of a branch name, tag, or commit SHA must be provided.

The `github` block supports:

* `owner` -
(Optional)
Owner of the repository. For example: The owner for
https://github.com/googlecloudplatform/cloud-builders is "googlecloudplatform".

* `name` -
(Optional)
Name of the repository. For example: The name for
https://github.com/googlecloudplatform/cloud-builders is "cloud-builders".

* `pull_request` -
(Optional)
filter to match changes in pull requests. Specify only one of pullRequest or push. Structure is documented below.

* `push` -
(Optional)
filter to match changes in refs, like branches or tags. Specify only one of pullRequest or push. Structure is documented below.


The `pull_request` block supports:

* `branch` -
(Optional)
Regex of branches to match.

* `comment_control` -
(Optional)
Whether to block builds on a "/gcbrun" comment from a repository owner or collaborator.

The `push` block supports:

* `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 `build` block supports:

* `tags` -
Expand Down

0 comments on commit e083af5

Please sign in to comment.