diff --git a/pkg/models/devops/project_pipeline.go b/pkg/models/devops/project_pipeline.go index 9cac73b1357e3adc35c7bd0463806bde931c1346..f50f7aa2362e3dae6b78a4e6cb8bd8d98776a7a0 100644 --- a/pkg/models/devops/project_pipeline.go +++ b/pkg/models/devops/project_pipeline.go @@ -83,6 +83,7 @@ type MultiBranchPipeline struct { SingleSvnSource *SingleSvnSource `json:"single_svn_source,omitempty" description:"single branch svn scm define"` BitbucketServerSource *BitbucketServerSource `json:"bitbucket_server_source,omitempty" description:"bitbucket server scm defile"` ScriptPath string `json:"script_path" mapstructure:"script_path" description:"script path in scm"` + MultiBranchJobTrigger *MultiBranchJobTrigger `json:"multibranch_job_triggeromitempty" mapstructure:"multibranch_job_trigger" description:"Pipeline tasks that need to be triggered when branch creation/deletion"` } type GitSource struct { @@ -107,6 +108,11 @@ type GithubSource struct { RegexFilter string `json:"regex_filter,omitempty" mapstructure:"regex_filter" description:"Regex used to match the name of the branch that needs to be run"` } +type MultiBranchJobTrigger struct { + CreateActionJobsToTrigger string `json:"create_action_job_to_trigger,omitempty" description:"pipeline name to trigger"` + DeleteActionJobsToTrigger string `json:"delete_action_job_to_trigger,omitempty" description:"pipeline name to trigger"` +} + type BitbucketServerSource struct { ScmId string `json:"scm_id,omitempty" description:"uid of scm"` Owner string `json:"owner,omitempty" mapstructure:"owner" description:"owner of github repo"` @@ -837,6 +843,22 @@ func (s *SingleSvnSource) appendToEtree(source *etree.Element) *SingleSvnSource return s } +func (s *MultiBranchJobTrigger) appendToEtree(properties *etree.Element) *MultiBranchJobTrigger { + triggerProperty := properties.CreateElement("org.jenkinsci.plugins.workflow.multibranch.PipelineTriggerProperty") + triggerProperty.CreateAttr("plugin", "multibranch-action-triggers") + triggerProperty.CreateElement("createActionJobsToTrigger").SetText(s.CreateActionJobsToTrigger) + triggerProperty.CreateElement("deleteActionJobsToTrigger").SetText(s.DeleteActionJobsToTrigger) + return s +} + +func (s *MultiBranchJobTrigger) fromEtree(properties *etree.Element) *MultiBranchJobTrigger { + triggerProperty := properties.SelectElement("org.jenkinsci.plugins.workflow.multibranch.PipelineTriggerProperty") + if triggerProperty != nil { + s.CreateActionJobsToTrigger = triggerProperty.SelectElement("createActionJobsToTrigger").Text() + s.DeleteActionJobsToTrigger = triggerProperty.SelectElement("deleteActionJobsToTrigger").Text() + } + return s +} func createMultiBranchPipelineConfigXml(projectName string, pipeline *MultiBranchPipeline) (string, error) { doc := etree.NewDocument() xmlString := ` @@ -869,6 +891,11 @@ func createMultiBranchPipelineConfigXml(projectName string, pipeline *MultiBranc project := doc.SelectElement("org.jenkinsci.plugins.workflow.multibranch.WorkflowMultiBranchProject") project.CreateElement("description").SetText(pipeline.Description) + if pipeline.MultiBranchJobTrigger != nil { + properties := project.SelectElement("properties") + pipeline.MultiBranchJobTrigger.appendToEtree(properties) + } + if pipeline.Discarder != nil { discarder := project.CreateElement("orphanedItemStrategy") discarder.CreateAttr("class", "com.cloudbees.hudson.plugins.folder.computed.DefaultOrphanedItemStrategy") @@ -959,6 +986,14 @@ func parseMultiBranchPipelineConfigXml(config string) (*MultiBranchPipeline, err if project == nil { return nil, fmt.Errorf("can not parse mutibranch pipeline config") } + if properties := project.SelectElement("properties"); properties != nil { + if multibranchTrigger := properties.SelectElement( + "org.jenkinsci.plugins.workflow.multibranch.PipelineTriggerProperty"); multibranchTrigger != nil { + trigger := &MultiBranchJobTrigger{} + trigger.fromEtree(properties) + pipeline.MultiBranchJobTrigger = trigger + } + } pipeline.Description = project.SelectElement("description").Text() if discarder := project.SelectElement("orphanedItemStrategy"); discarder != nil { diff --git a/pkg/models/devops/project_pipeline_test.go b/pkg/models/devops/project_pipeline_test.go index 38646881cc2efde9e56403328095b556a1211c63..99514758ae4ca4c47e42e8c4b127200db99500fb 100644 --- a/pkg/models/devops/project_pipeline_test.go +++ b/pkg/models/devops/project_pipeline_test.go @@ -542,3 +542,92 @@ func Test_MultiBranchPipelineRegexFilter(t *testing.T) { } } + +func Test_MultiBranchPipelineMultibranchTrigger(t *testing.T) { + + inputs := []*MultiBranchPipeline{ + &MultiBranchPipeline{ + Name: "", + Description: "for test", + ScriptPath: "Jenkinsfile", + SourceType: "github", + GitHubSource: &GithubSource{ + Owner: "kubesphere", + Repo: "devops", + CredentialId: "github", + ApiUri: "https://api.github.com", + DiscoverBranches: 1, + DiscoverPRFromOrigin: 2, + DiscoverPRFromForks: &DiscoverPRFromForks{ + Strategy: 1, + Trust: 1, + }, + RegexFilter: ".*", + }, + MultiBranchJobTrigger: &MultiBranchJobTrigger{ + CreateActionJobsToTrigger: "abc", + DeleteActionJobsToTrigger: "ddd", + }, + }, + &MultiBranchPipeline{ + Name: "", + Description: "for test", + ScriptPath: "Jenkinsfile", + SourceType: "github", + GitHubSource: &GithubSource{ + Owner: "kubesphere", + Repo: "devops", + CredentialId: "github", + ApiUri: "https://api.github.com", + DiscoverBranches: 1, + DiscoverPRFromOrigin: 2, + DiscoverPRFromForks: &DiscoverPRFromForks{ + Strategy: 1, + Trust: 1, + }, + RegexFilter: ".*", + }, + MultiBranchJobTrigger: &MultiBranchJobTrigger{ + CreateActionJobsToTrigger: "abc", + }, + }, + &MultiBranchPipeline{ + Name: "", + Description: "for test", + ScriptPath: "Jenkinsfile", + SourceType: "github", + GitHubSource: &GithubSource{ + Owner: "kubesphere", + Repo: "devops", + CredentialId: "github", + ApiUri: "https://api.github.com", + DiscoverBranches: 1, + DiscoverPRFromOrigin: 2, + DiscoverPRFromForks: &DiscoverPRFromForks{ + Strategy: 1, + Trust: 1, + }, + RegexFilter: ".*", + }, + MultiBranchJobTrigger: &MultiBranchJobTrigger{ + DeleteActionJobsToTrigger: "ddd", + }, + }, + } + + for _, input := range inputs { + outputString, err := createMultiBranchPipelineConfigXml("", input) + if err != nil { + t.Fatalf("should not get error %+v", err) + } + output, err := parseMultiBranchPipelineConfigXml(outputString) + + if err != nil { + t.Fatalf("should not get error %+v", err) + } + if !reflect.DeepEqual(input, output) { + t.Fatalf("input [%+v] output [%+v] should equal ", input, output) + } + } + +}