diff --git a/jenkins/webhook-proxy/main.go b/jenkins/webhook-proxy/main.go index c0dbcad09..fe8a5ca44 100644 --- a/jenkins/webhook-proxy/main.go +++ b/jenkins/webhook-proxy/main.go @@ -47,6 +47,8 @@ const ( allowedChangeRefTypesDefault = "BRANCH" namespaceSuffix = "-cd" letterBytes = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" + refspecEnvVar = "REFSPEC" + refspecDefault = "+refs/pull-requests/*/from:refs/remotes/origin/pr/*" ) // EnvPair represents an environment variable @@ -66,6 +68,7 @@ type Event struct { Pipeline string RequestID string Env []EnvPair + Ref string } // BuildConfigData represents the data to be rendered into the BuildConfig template. @@ -74,6 +77,8 @@ type BuildConfigData struct { TriggerSecret string GitURI string Branch string + Ref string + RefSpec string JenkinsfilePath string Env string ResourceVersion string @@ -83,6 +88,7 @@ type BuildConfigData struct { // https://docs.openshift.com/container-platform/3.11/rest_api/apis-build.openshift.io/v1.BuildConfig.html#object-schema. type buildConfig struct { Metadata struct { + RefSpec string `json:"jenkins.openshift.io/refspec"` ResourceVersion string `json:"resourceVersion"` } `json:"metadata"` Spec struct { @@ -117,7 +123,7 @@ type ocClient struct { HTTPClient *http.Client OpenShiftAPIBaseURL string Token string - OpenShiftAppDomain string + OpenShiftAppDomain string } // Server represents this service, and is a global. @@ -132,6 +138,7 @@ type Server struct { AllowedChangeRefTypes []string RepoBase string MaxDeletionChecks int + Refspec string } func init() { @@ -240,6 +247,11 @@ func main() { allowedChangeRefTypes[i] = strings.TrimSpace(allowedChangeRefTypes[i]) } } + refspec := refspecDefault + envRefspec := os.Getenv(refspecEnvVar) + if len(envRefspec) != 0 { + refspec = envRefspec + } maxDeletionChecks := maxDeletionChecksDefault envMaxDeletionChecks := os.Getenv(maxDeletionChecksEnvVar) @@ -275,6 +287,7 @@ func main() { AllowedChangeRefTypes: allowedChangeRefTypes, RepoBase: repoBase, MaxDeletionChecks: maxDeletionChecksInt, + Refspec: refspec, } log.Println("Ready to accept requests") @@ -291,6 +304,7 @@ func (s *Server) HandleRoot() http.HandlerFunc { Key string `json:"key"` } `json:"project"` Slug string `json:"slug"` + Id int `json:"id"` } type requestBitbucket struct { EventKey string `json:"eventKey"` @@ -306,7 +320,13 @@ func (s *Server) HandleRoot() http.HandlerFunc { FromRef struct { Repository repository `json:"repository"` DisplayID string `json:"displayId"` + LatestCommit string `json:"latestCommit"` } `json:"fromRef"` + ToRef struct { + Repository repository `json:"repository"` + DisplayID string `json:"displayId"` + } `json:"toRef"` + Id int `json:"id"` } `json:"pullRequest"` } @@ -370,24 +390,25 @@ func (s *Server) HandleRoot() http.HandlerFunc { return } - component := componentParam - if component == "" { - component = extractComponent(req.Repository, project) - } - pipeline := makePipelineName(project, component, req.Branch) - - event = &Event{ - Kind: "forward", - Namespace: s.Namespace, - Repo: req.Repository, - Component: component, - Branch: req.Branch, - Pipeline: pipeline, - RequestID: requestID, - Env: req.Env, - } - - } else if r.URL.Path == "/" { + component := componentParam + if component == "" { + component = extractComponent(req.Repository, project) + } + pipeline := makePipelineName(project, component, req.Branch) + + event = &Event{ + Kind: "forward", + Namespace: s.Namespace, + Repo: req.Repository, + Component: component, + Branch: req.Branch, + Ref: req.Branch, + Pipeline: pipeline, + RequestID: requestID, + Env: req.Env, + } + + } else if r.URL.Path == "/" { req := &requestBitbucket{} err := json.NewDecoder(r.Body).Decode(req) @@ -401,6 +422,7 @@ func (s *Server) HandleRoot() http.HandlerFunc { var repo string var kind string var branch string + var ref string component := componentParam project, err = s.readProjectParam(req.Repository.Project.Key, requestID) @@ -441,6 +463,7 @@ func (s *Server) HandleRoot() http.HandlerFunc { component = extractComponent(repo, project) } branch = req.Changes[0].Ref.DisplayID + ref = branch if req.Changes[0].Type == "DELETE" { kind = "delete" } else { @@ -454,16 +477,35 @@ func (s *Server) HandleRoot() http.HandlerFunc { )) return } - } else if req.EventKey == "pr:opened" || req.EventKey == "pr:merged" || req.EventKey == "pr:declined" || req.EventKey == "pr:deleted" { - repo = req.PullRequest.FromRef.Repository.Slug - if component == "" { - component = extractComponent(repo, project) - } - branch = req.PullRequest.FromRef.DisplayID - if req.EventKey == "pr:opened" { - kind = "forward" + } else if req.EventKey == "pr:opened" || req.EventKey == "pr:from_ref_updated" || req.EventKey == "pr:merged" || req.EventKey == "pr:declined" || req.EventKey == "pr:deleted" { + // Check if PR is from other repo. + if req.PullRequest.ToRef.Repository.Id != req.PullRequest.FromRef.Repository.Id { + log.Println("External forking flow - Build PR from toRef repository") + repo = req.PullRequest.ToRef.Repository.Slug + ref = req.PullRequest.FromRef.LatestCommit + branch = req.PullRequest.FromRef.DisplayID + if component == "" { + component = extractComponent(repo, project) + } + + if req.EventKey == "pr:opened" || req.EventKey == "pr:from_ref_updated" { + kind = "forward" + } else { + kind = "delete" + } } else { - kind = "delete" + repo = req.PullRequest.FromRef.Repository.Slug + if component == "" { + component = extractComponent(repo, project) + } + ref = req.PullRequest.FromRef.DisplayID + branch = ref + + if req.EventKey == "pr:opened" { + kind = "forward" + } else { + kind = "delete" + } } } @@ -477,12 +519,14 @@ func (s *Server) HandleRoot() http.HandlerFunc { Branch: branch, Pipeline: pipeline, RequestID: requestID, + Ref: ref, } } else { http.NotFound(w, r) return } + log.Println(requestID, event) if !event.IsValid() { @@ -526,9 +570,9 @@ func (s *Server) HandleRoot() http.HandlerFunc { http.Error(w, msg, http.StatusInternalServerError) return } - if bc.Spec.Source.Git.Ref != event.Branch { + if bc.Spec.Source.Git.Ref != event.Ref { log.Println(requestID, fmt.Sprintf( - "Current branch %s differs from requested branch %s", bc.Spec.Source.Git.Ref, event.Branch, + "Current ref %s differs from requested ref %s", bc.Spec.Source.Git.Ref, event.Ref, )) updatePipeline = true resourceVersion = bc.Metadata.ResourceVersion @@ -561,6 +605,8 @@ func (s *Server) HandleRoot() http.HandlerFunc { TriggerSecret: s.TriggerSecret, GitURI: gitURI, Branch: event.Branch, + Ref: event.Ref, + RefSpec: s.Refspec, JenkinsfilePath: jenkinsfilePath, Env: string(env), ResourceVersion: resourceVersion, @@ -622,7 +668,7 @@ func (s *Server) HandleRoot() http.HandlerFunc { log.Println(requestID, "No remaining instances found") return } - if i == s.MaxDeletionChecks - 1 { + if i == s.MaxDeletionChecks-1 { log.Println(requestID, "Reached maximum iterations, stopping checks") } } @@ -890,12 +936,13 @@ func (e *Event) IsValid() bool { func (e *Event) String() string { return fmt.Sprintf( - "kind=%s, namespace=%s, repo=%s, component=%s, branch=%s, pipeline=%s", + "kind=%s, namespace=%s, repo=%s, component=%s, branch=%s, ref=%s, pipeline=%s", e.Kind, e.Namespace, e.Repo, e.Component, e.Branch, + e.Ref, e.Pipeline, ) } @@ -921,7 +968,7 @@ func newClient(openShiftAPIHost string, triggerSecret string, openShiftAppDomain HTTPClient: secureClient, OpenShiftAPIBaseURL: baseURL, Token: token, - OpenShiftAppDomain: openShiftAppDomain, + OpenShiftAppDomain: openShiftAppDomain, }, nil } diff --git a/jenkins/webhook-proxy/main_test.go b/jenkins/webhook-proxy/main_test.go index abb099163..d7ad677a7 100644 --- a/jenkins/webhook-proxy/main_test.go +++ b/jenkins/webhook-proxy/main_test.go @@ -213,11 +213,12 @@ func testServer() (*httptest.Server, *mockClient) { Project: "bar", TriggerSecret: "s3cr3t", ProtectedBranches: []string{"baz"}, - AcceptedEvents: []string{"repo:refs_changed", "pr:opened", "pr:declined", "pr:merged", "pr:deleted"}, + AcceptedEvents: []string{"repo:refs_changed", "pr:opened", "pr:from_ref_updated", "pr:declined", "pr:merged", "pr:deleted"}, AllowedExternalProjects: []string{"opendevstack"}, AllowedChangeRefTypes: []string{"BRANCH"}, RepoBase: "https://domain.com", MaxDeletionChecks: 10, + Refspec: "+refs/pull-requests/*/from:refs/remotes/origin/pr/*", } return httptest.NewServer(server.HandleRoot()), mc } @@ -276,6 +277,7 @@ func TestHandleRootReadsRequests(t *testing.T) { Repo: "repository", Component: "repository", Branch: "master", + Ref: "master", Pipeline: "repository-master", }, }, @@ -287,6 +289,7 @@ func TestHandleRootReadsRequests(t *testing.T) { Repo: "repository", Component: "repository", Branch: "admin/file-1505781548644", + Ref: "admin/file-1505781548644", Pipeline: "repository-admin-file-1505781548644", }, }, @@ -298,9 +301,34 @@ func TestHandleRootReadsRequests(t *testing.T) { Repo: "repository", Component: "repository", Branch: "decline-me", + Ref: "decline-me", Pipeline: "repository-decline-me", }, }, + "PR opened from external fork": { + payloadFile: "pr-opened-external-payload.json", + expectedEvent: &Event{ + Kind: "forward", + Namespace: "bar-cd", + Repo: "repository", + Component: "repository", + Branch: "feature/external-contribution", + Ref: "39e982425ec8d92a6448ffc0ea60d7ec7f8b741d", + Pipeline: "repository-feature-external-contribution", + }, + }, + "PR from_ref_updated from external fork": { + payloadFile: "pr-from-ref-updated-external-payload.json", + expectedEvent: &Event{ + Kind: "forward", + Namespace: "bar-cd", + Repo: "repository", + Component: "repository", + Branch: "feature/external-update", + Ref: "abc123425ec8d92a6448ffc0ea60d7ec7f8b741d", + Pipeline: "repository-feature-external-update", + }, + }, } for name, tc := range tests { @@ -346,17 +374,17 @@ func TestSkipsPayloads(t *testing.T) { expectedLog string }{ "Tag pushed": { - acceptedEvents: []string{"repo:refs_changed", "pr:opened", "pr:declined", "pr:merged", "pr:deleted"}, + acceptedEvents: []string{"repo:refs_changed", "pr:opened", "pr:from_ref_updated", "pr:declined", "pr:merged", "pr:deleted"}, payloadFile: "repo-refs-changed-tag-payload.json", expectedLog: "Skipping change ref type TAG as ALLOWED_CHANGE_REF_TYPES does not include it", }, "Unknown event": { - acceptedEvents: []string{"repo:refs_changed", "pr:opened", "pr:declined", "pr:merged", "pr:deleted"}, + acceptedEvents: []string{"repo:refs_changed", "pr:opened", "pr:from_ref_updated", "pr:declined", "pr:merged", "pr:deleted"}, payloadFile: "unknown-event-payload.json", expectedLog: "Skipping event foo:bar as ACCEPTED_EVENTS does not include it", }, "Unaccepted event": { - acceptedEvents: []string{"repo:refs_changed", "pr:declined", "pr:merged", "pr:deleted"}, + acceptedEvents: []string{"repo:refs_changed", "pr:from_ref_updated", "pr:declined", "pr:merged", "pr:deleted"}, payloadFile: "unaccepted-event-payload.json", expectedLog: "Skipping event pr:opened as ACCEPTED_EVENTS does not include it", }, @@ -376,6 +404,7 @@ func TestSkipsPayloads(t *testing.T) { AllowedChangeRefTypes: []string{"BRANCH"}, RepoBase: "https://domain.com", MaxDeletionChecks: 10, + Refspec: "+refs/pull-requests/*/from:refs/remotes/origin/pr/*", } ts := httptest.NewServer(server.HandleRoot()) defer ts.Close() @@ -481,12 +510,13 @@ func TestNamespaceRestriction(t *testing.T) { Namespace: tc.project + "-cd", Project: tc.project, TriggerSecret: fakeSecret, - ProtectedBranches: []string{"baz"}, - AcceptedEvents: []string{"repo:refs_changed", "pr:opened", "pr:declined", "pr:merged", "pr:deleted"}, - AllowedExternalProjects: tc.allowedExternalProjects, + ProtectedBranches: []string{"baz"}, + AcceptedEvents: []string{"repo:refs_changed", "pr:opened", "pr:from_ref_updated", "pr:declined", "pr:merged", "pr:deleted"}, + AllowedExternalProjects: tc.allowedExternalProjects, AllowedChangeRefTypes: []string{"BRANCH"}, RepoBase: "https://domain.com", MaxDeletionChecks: 10, + Refspec: "+refs/pull-requests/*/from:refs/remotes/origin/pr/*", } ts := httptest.NewServer(s.HandleRoot()) defer ts.Close() @@ -534,6 +564,7 @@ func TestForward(t *testing.T) { Repo: "repository", Component: "repository", Branch: "master", + Ref: "master", Pipeline: "repository-master", Env: []EnvPair{}, }, @@ -549,6 +580,7 @@ func TestForward(t *testing.T) { Repo: "repository", Component: "repository", Branch: "master", + Ref: "master", Pipeline: "repository-master", Env: []EnvPair{ EnvPair{ @@ -573,6 +605,7 @@ func TestForward(t *testing.T) { Repo: "repository", Component: "repository", Branch: "master", + Ref: "master", Pipeline: "repository-master", Env: []EnvPair{}, }, @@ -793,12 +826,13 @@ func TestBuildEndpoint(t *testing.T) { Namespace: "bar-cd", Project: "bar", TriggerSecret: "s3cr3t", - ProtectedBranches: []string{"baz"}, - AcceptedEvents: []string{"repo:refs_changed", "pr:opened", "pr:declined", "pr:merged", "pr:deleted"}, - AllowedExternalProjects: []string{"opendevstack"}, - AllowedChangeRefTypes: []string{"BRANCH"}, - RepoBase: "https://domain.com", - MaxDeletionChecks: 10, + ProtectedBranches: []string{"baz"}, + AcceptedEvents: []string{"repo:refs_changed", "pr:opened", "pr:from_ref_updated", "pr:declined", "pr:merged", "pr:deleted"}, + AllowedExternalProjects: []string{"opendevstack"}, + AllowedChangeRefTypes: []string{"BRANCH"}, + RepoBase: "https://domain.com", + MaxDeletionChecks: 10, + Refspec: "+refs/pull-requests/*/from:refs/remotes/origin/pr/*", } server := httptest.NewServer(s.HandleRoot()) @@ -838,12 +872,13 @@ func TestNotFound(t *testing.T) { Namespace: "bar-cd", Project: "bar", TriggerSecret: "s3cr3t", - ProtectedBranches: []string{"baz"}, - AcceptedEvents: []string{"repo:refs_changed", "pr:opened", "pr:declined", "pr:merged", "pr:deleted"}, - AllowedExternalProjects: []string{"opendevstack"}, + ProtectedBranches: []string{"baz"}, + AcceptedEvents: []string{"repo:refs_changed", "pr:opened", "pr:from_ref_updated", "pr:declined", "pr:merged", "pr:deleted"}, + AllowedExternalProjects: []string{"opendevstack"}, AllowedChangeRefTypes: []string{"BRANCH"}, RepoBase: "https://domain.com", MaxDeletionChecks: 10, + Refspec: "+refs/pull-requests/*/from:refs/remotes/origin/pr/*", } server := httptest.NewServer(s.HandleRoot()) @@ -869,6 +904,8 @@ func TestGetBuildConfig(t *testing.T) { TriggerSecret: "s3cr3t", GitURI: "https://domain.com/proj/repository.git", Branch: "master", + Ref: "master", + RefSpec: "+refs/pull-requests/*/from:refs/remotes/origin/pr/*", JenkinsfilePath: "foo/Jenkinsfile", Env: string(env), ResourceVersion: "0", diff --git a/jenkins/webhook-proxy/pipeline.json.tmpl b/jenkins/webhook-proxy/pipeline.json.tmpl index e1097b581..e013e0e7b 100644 --- a/jenkins/webhook-proxy/pipeline.json.tmpl +++ b/jenkins/webhook-proxy/pipeline.json.tmpl @@ -4,7 +4,10 @@ "metadata": { "name": "{{.Name}}", "creationTimestamp": null, - "resourceVersion": "{{.ResourceVersion}}" + "resourceVersion": "{{.ResourceVersion}}", + "annotations": { + "jenkins.openshift.io/refspec": "{{.RefSpec}}" + } }, "spec": { "triggers": [ @@ -21,7 +24,7 @@ "type": "Git", "git": { "uri": "{{.GitURI}}", - "ref": "{{.Branch}}" + "ref": "{{.Ref}}" }, "sourceSecret": { "name": "cd-user-with-password" diff --git a/jenkins/webhook-proxy/testdata/fixtures/pr-from-ref-updated-external-payload.json b/jenkins/webhook-proxy/testdata/fixtures/pr-from-ref-updated-external-payload.json new file mode 100644 index 000000000..1e83bbecd --- /dev/null +++ b/jenkins/webhook-proxy/testdata/fixtures/pr-from-ref-updated-external-payload.json @@ -0,0 +1,67 @@ +{ + "eventKey": "pr:from_ref_updated", + "date": "2025-11-27T14:27:48+0100", + "actor": { + "name": "external.user", + "emailAddress": "external.user@example.com", + "id": 621, + "displayName": "External User", + "active": true, + "slug": "external.user", + "type": "NORMAL" + }, + "previousFromHash": "16ada7ff7f3762ecb1734fa1c98ab03af1cf4948", + "pullRequest": { + "id": 163, + "version": 5, + "title": "Updated external PR", + "state": "OPEN", + "open": true, + "closed": false, + "createdDate": 1764197981955, + "updatedDate": 1764250068785, + "fromRef": { + "id": "refs/heads/feature/external-update", + "displayId": "feature/external-update", + "latestCommit": "abc123425ec8d92a6448ffc0ea60d7ec7f8b741d", + "repository": { + "slug": "repository", + "id": 41421, + "name": "repository", + "scmId": "git", + "state": "AVAILABLE", + "statusMessage": "Available", + "forkable": true, + "project": { + "key": "~EXTERNAL.USER", + "id": 149, + "name": "External User", + "type": "PERSONAL" + }, + "public": false + } + }, + "toRef": { + "id": "refs/heads/master", + "displayId": "master", + "latestCommit": "c34f84131e091d1c4691e3cf3fbecdfddf6f26f3", + "repository": { + "slug": "repository", + "id": 32191, + "name": "repository", + "scmId": "git", + "state": "AVAILABLE", + "statusMessage": "Available", + "forkable": true, + "project": { + "key": "PROJ", + "id": 7300, + "name": "project", + "public": false, + "type": "NORMAL" + }, + "public": false + } + } + } +} diff --git a/jenkins/webhook-proxy/testdata/fixtures/pr-opened-external-payload.json b/jenkins/webhook-proxy/testdata/fixtures/pr-opened-external-payload.json new file mode 100644 index 000000000..fc90200e8 --- /dev/null +++ b/jenkins/webhook-proxy/testdata/fixtures/pr-opened-external-payload.json @@ -0,0 +1,66 @@ +{ + "eventKey": "pr:opened", + "date": "2025-11-27T15:32:10+0100", + "actor": { + "name": "external.user", + "emailAddress": "external.user@example.com", + "id": 621, + "displayName": "External User", + "active": true, + "slug": "external.user", + "type": "NORMAL" + }, + "pullRequest": { + "id": 165, + "version": 0, + "title": "External PR from forked repository", + "state": "OPEN", + "open": true, + "closed": false, + "createdDate": 1764253930635, + "updatedDate": 1764253930635, + "fromRef": { + "id": "refs/heads/feature/external-contribution", + "displayId": "feature/external-contribution", + "latestCommit": "39e982425ec8d92a6448ffc0ea60d7ec7f8b741d", + "repository": { + "slug": "repository", + "id": 41421, + "name": "repository", + "scmId": "git", + "state": "AVAILABLE", + "statusMessage": "Available", + "forkable": true, + "project": { + "key": "~EXTERNAL.USER", + "id": 149, + "name": "External User", + "type": "PERSONAL" + }, + "public": false + } + }, + "toRef": { + "id": "refs/heads/master", + "displayId": "master", + "latestCommit": "c34f84131e091d1c4691e3cf3fbecdfddf6f26f3", + "repository": { + "slug": "repository", + "id": 32191, + "name": "repository", + "scmId": "git", + "state": "AVAILABLE", + "statusMessage": "Available", + "forkable": true, + "project": { + "key": "PROJ", + "id": 7300, + "name": "project", + "public": false, + "type": "NORMAL" + }, + "public": false + } + } + } +} diff --git a/jenkins/webhook-proxy/testdata/golden/build-component-pipeline.json b/jenkins/webhook-proxy/testdata/golden/build-component-pipeline.json index e762edb3b..975a38fa7 100644 --- a/jenkins/webhook-proxy/testdata/golden/build-component-pipeline.json +++ b/jenkins/webhook-proxy/testdata/golden/build-component-pipeline.json @@ -4,7 +4,10 @@ "metadata": { "name": "baz-foo", "creationTimestamp": null, - "resourceVersion": "0" + "resourceVersion": "0", + "annotations": { + "jenkins.openshift.io/refspec": "+refs/pull-requests/*/from:refs/remotes/origin/pr/*" + } }, "spec": { "triggers": [ diff --git a/jenkins/webhook-proxy/testdata/golden/build-pipeline-branch.json b/jenkins/webhook-proxy/testdata/golden/build-pipeline-branch.json index 9795b5c0f..85fba1fba 100644 --- a/jenkins/webhook-proxy/testdata/golden/build-pipeline-branch.json +++ b/jenkins/webhook-proxy/testdata/golden/build-pipeline-branch.json @@ -4,7 +4,10 @@ "metadata": { "name": "repository-foo", "creationTimestamp": null, - "resourceVersion": "42" + "resourceVersion": "42", + "annotations": { + "jenkins.openshift.io/refspec": "+refs/pull-requests/*/from:refs/remotes/origin/pr/*" + } }, "spec": { "triggers": [ diff --git a/jenkins/webhook-proxy/testdata/golden/build-pipeline-jenkinsfilepath.json b/jenkins/webhook-proxy/testdata/golden/build-pipeline-jenkinsfilepath.json index 1a6ca3805..f135fc6f7 100644 --- a/jenkins/webhook-proxy/testdata/golden/build-pipeline-jenkinsfilepath.json +++ b/jenkins/webhook-proxy/testdata/golden/build-pipeline-jenkinsfilepath.json @@ -4,7 +4,10 @@ "metadata": { "name": "repository-foo", "creationTimestamp": null, - "resourceVersion": "42" + "resourceVersion": "42", + "annotations": { + "jenkins.openshift.io/refspec": "+refs/pull-requests/*/from:refs/remotes/origin/pr/*" + } }, "spec": { "triggers": [ diff --git a/jenkins/webhook-proxy/testdata/golden/build-pipeline.json b/jenkins/webhook-proxy/testdata/golden/build-pipeline.json index e7b5c78de..0eb56b54b 100644 --- a/jenkins/webhook-proxy/testdata/golden/build-pipeline.json +++ b/jenkins/webhook-proxy/testdata/golden/build-pipeline.json @@ -4,7 +4,10 @@ "metadata": { "name": "repository-foo", "creationTimestamp": null, - "resourceVersion": "0" + "resourceVersion": "0", + "annotations": { + "jenkins.openshift.io/refspec": "+refs/pull-requests/*/from:refs/remotes/origin/pr/*" + } }, "spec": { "triggers": [ diff --git a/jenkins/webhook-proxy/testdata/golden/foo-cd-pipeline.json b/jenkins/webhook-proxy/testdata/golden/foo-cd-pipeline.json index 6cdeb48be..b938c9e90 100644 --- a/jenkins/webhook-proxy/testdata/golden/foo-cd-pipeline.json +++ b/jenkins/webhook-proxy/testdata/golden/foo-cd-pipeline.json @@ -4,7 +4,10 @@ "metadata": { "name": "ods-provisioning-app-production", "creationTimestamp": null, - "resourceVersion": "0" + "resourceVersion": "0", + "annotations": { + "jenkins.openshift.io/refspec": "+refs/pull-requests/*/from:refs/remotes/origin/pr/*" + } }, "spec": { "triggers": [ diff --git a/jenkins/webhook-proxy/testdata/golden/pipeline.json b/jenkins/webhook-proxy/testdata/golden/pipeline.json index 4ecbbde14..0f126ed88 100644 --- a/jenkins/webhook-proxy/testdata/golden/pipeline.json +++ b/jenkins/webhook-proxy/testdata/golden/pipeline.json @@ -4,7 +4,10 @@ "metadata": { "name": "repository-master", "creationTimestamp": null, - "resourceVersion": "0" + "resourceVersion": "0", + "annotations": { + "jenkins.openshift.io/refspec": "+refs/pull-requests/*/from:refs/remotes/origin/pr/*" + } }, "spec": { "triggers": [ diff --git a/jenkins/webhook-proxy/testdata/golden/prov-app-pipeline.json b/jenkins/webhook-proxy/testdata/golden/prov-app-pipeline.json index a665be275..932b691d0 100644 --- a/jenkins/webhook-proxy/testdata/golden/prov-app-pipeline.json +++ b/jenkins/webhook-proxy/testdata/golden/prov-app-pipeline.json @@ -4,7 +4,10 @@ "metadata": { "name": "ods-provisioning-app-production", "creationTimestamp": null, - "resourceVersion": "0" + "resourceVersion": "0", + "annotations": { + "jenkins.openshift.io/refspec": "+refs/pull-requests/*/from:refs/remotes/origin/pr/*" + } }, "spec": { "triggers": [