// Extract services webhooks from github.com func (p *WebHook) Extract(buildCfg *api.BuildConfig, secret, path string, req *http.Request) (revision *api.SourceRevision, proceed bool, err error) { trigger, ok := webhook.FindTriggerPolicy(api.GitHubWebHookBuildTriggerType, buildCfg) if !ok { err = webhook.ErrHookNotEnabled return } glog.V(4).Infof("Checking if the provided secret for BuildConfig %s/%s matches", buildCfg.Namespace, buildCfg.Name) if trigger.GitHubWebHook.Secret != secret { err = webhook.ErrSecretMismatch return } glog.V(4).Infof("Verifying build request for BuildConfig %s/%s", buildCfg.Namespace, buildCfg.Name) if err = verifyRequest(req); err != nil { return } method := getEvent(req.Header) if method != "ping" && method != "push" { err = fmt.Errorf("Unknown X-GitHub-Event or X-Gogs-Event %s", method) return } if method == "ping" { proceed = false return } body, err := ioutil.ReadAll(req.Body) if err != nil { return } var event pushEvent if err = json.Unmarshal(body, &event); err != nil { return } proceed = webhook.GitRefMatches(event.Ref, buildCfg.Spec.Source.Git.Ref) if !proceed { glog.V(2).Infof("Skipping build for BuildConfig %s/%s. Branch reference from '%s' does not match configuration", buildCfg.Namespace, buildCfg, event) } revision = &api.SourceRevision{ Type: api.BuildSourceGit, Git: &api.GitSourceRevision{ Commit: event.HeadCommit.ID, Author: event.HeadCommit.Author, Committer: event.HeadCommit.Committer, Message: event.HeadCommit.Message, }, } return }
// Extract services webhooks from github.com func (p *WebHook) Extract(buildCfg *api.BuildConfig, secret, path string, req *http.Request) (revision *api.SourceRevision, envvars []kapi.EnvVar, proceed bool, err error) { triggers, err := webhook.FindTriggerPolicy(api.GitHubWebHookBuildTriggerType, buildCfg) if err != nil { return revision, envvars, proceed, err } glog.V(4).Infof("Checking if the provided secret for BuildConfig %s/%s matches", buildCfg.Namespace, buildCfg.Name) if _, err = webhook.ValidateWebHookSecret(triggers, secret); err != nil { return revision, envvars, proceed, err } glog.V(4).Infof("Verifying build request for BuildConfig %s/%s", buildCfg.Namespace, buildCfg.Name) if err = verifyRequest(req); err != nil { return revision, envvars, proceed, err } method := getEvent(req.Header) if method != "ping" && method != "push" && method != "Push Hook" { return revision, envvars, proceed, errors.NewBadRequest(fmt.Sprintf("Unknown X-GitHub-Event, X-Gogs-Event or X-Gitlab-Event %s", method)) } if method == "ping" { return revision, envvars, proceed, err } body, err := ioutil.ReadAll(req.Body) if err != nil { return revision, envvars, proceed, errors.NewBadRequest(err.Error()) } var event pushEvent if err = json.Unmarshal(body, &event); err != nil { return revision, envvars, proceed, errors.NewBadRequest(err.Error()) } if !webhook.GitRefMatches(event.Ref, webhook.DefaultConfigRef, &buildCfg.Spec.Source) { glog.V(2).Infof("Skipping build for BuildConfig %s/%s. Branch reference from '%s' does not match configuration", buildCfg.Namespace, buildCfg, event) return revision, envvars, proceed, err } revision = &api.SourceRevision{ Git: &api.GitSourceRevision{ Commit: event.HeadCommit.ID, Author: event.HeadCommit.Author, Committer: event.HeadCommit.Committer, Message: event.HeadCommit.Message, }, } return revision, envvars, true, err }
// Extract services generic webhooks. func (p *WebHookPlugin) Extract(buildCfg *api.BuildConfig, secret, path string, req *http.Request) (revision *api.SourceRevision, envvars []kapi.EnvVar, proceed bool, err error) { triggers, err := webhook.FindTriggerPolicy(api.GenericWebHookBuildTriggerType, buildCfg) if err != nil { return revision, envvars, false, err } glog.V(4).Infof("Checking if the provided secret for BuildConfig %s/%s matches", buildCfg.Namespace, buildCfg.Name) trigger, err := webhook.ValidateWebHookSecret(triggers, secret) if err != nil { return revision, envvars, false, err } glog.V(4).Infof("Verifying build request for BuildConfig %s/%s", buildCfg.Namespace, buildCfg.Name) if err = verifyRequest(req); err != nil { return revision, envvars, false, err } contentType := req.Header.Get("Content-Type") if len(contentType) != 0 { contentType, _, err = mime.ParseMediaType(contentType) if err != nil { return revision, envvars, false, fmt.Errorf("error parsing Content-Type: %s", err) } } if req.Body == nil { return revision, envvars, true, nil } if contentType != "application/json" && contentType != "application/yaml" { warning := webhook.NewWarning("invalid Content-Type on payload, ignoring payload and continuing with build") return revision, envvars, true, warning } body, err := ioutil.ReadAll(req.Body) if err != nil { return revision, envvars, false, err } if len(body) == 0 { return revision, envvars, true, nil } var data api.GenericWebHookEvent if contentType == "application/yaml" { body, err = yaml.ToJSON(body) if err != nil { warning := webhook.NewWarning(fmt.Sprintf("error converting payload to json: %v, ignoring payload and continuing with build", err)) return revision, envvars, true, warning } } if err = json.Unmarshal(body, &data); err != nil { warning := webhook.NewWarning(fmt.Sprintf("error unmarshalling payload: %v, ignoring payload and continuing with build", err)) return revision, envvars, true, warning } if len(data.Env) > 0 && trigger.AllowEnv { envvars = data.Env } if buildCfg.Spec.Source.Git == nil { // everything below here is specific to git-based builds return revision, envvars, true, nil } if data.Git == nil { warning := webhook.NewWarning("no git information found in payload, ignoring and continuing with build") return revision, envvars, true, warning } if data.Git.Refs != nil { for _, ref := range data.Git.Refs { if webhook.GitRefMatches(ref.Ref, webhook.DefaultConfigRef, &buildCfg.Spec.Source) { revision = &api.SourceRevision{ Git: &ref.GitSourceRevision, } return revision, envvars, true, nil } } warning := webhook.NewWarning(fmt.Sprintf("skipping build. None of the supplied refs matched %q", buildCfg.Spec.Source.Git.Ref)) return revision, envvars, false, warning } if !webhook.GitRefMatches(data.Git.Ref, webhook.DefaultConfigRef, &buildCfg.Spec.Source) { warning := webhook.NewWarning(fmt.Sprintf("skipping build. Branch reference from %q does not match configuration", data.Git.Ref)) return revision, envvars, false, warning } revision = &api.SourceRevision{ Git: &data.Git.GitSourceRevision, } return revision, envvars, true, nil }
// Extract services generic webhooks. func (p *WebHookPlugin) Extract(buildCfg *api.BuildConfig, secret, path string, req *http.Request) (revision *api.SourceRevision, proceed bool, err error) { trigger, ok := webhook.FindTriggerPolicy(api.GenericWebHookBuildTriggerType, buildCfg) if !ok { err = webhook.ErrHookNotEnabled return } glog.V(4).Infof("Checking if the provided secret for BuildConfig %s/%s matches", buildCfg.Namespace, buildCfg.Name) if trigger.GenericWebHook.Secret != secret { err = webhook.ErrSecretMismatch return } glog.V(4).Infof("Verifying build request for BuildConfig %s/%s", buildCfg.Namespace, buildCfg.Name) if err = verifyRequest(req); err != nil { return } git := buildCfg.Parameters.Source.Git if git == nil { glog.V(4).Infof("No source defined for BuildConfig %s/%s, but triggering anyway", buildCfg.Namespace, buildCfg.Name) return nil, true, nil } if req.Body != nil && req.Header.Get("Content-Type") == "application/json" { body, err := ioutil.ReadAll(req.Body) if err != nil { return nil, false, err } if len(body) == 0 { return nil, true, nil } var data api.GenericWebHookEvent if err = json.Unmarshal(body, &data); err != nil { glog.V(4).Infof("Error unmarshaling json %v, but continuing", err) return nil, true, nil } if data.Git == nil { glog.V(4).Infof("No git information for the generic webhook found in %s/%s", buildCfg.Namespace, buildCfg.Name) return nil, true, nil } if data.Git.Refs != nil { for _, ref := range data.Git.Refs { if webhook.GitRefMatches(ref.Ref, git.Ref) { revision = &api.SourceRevision{ Type: api.BuildSourceGit, Git: &ref.GitSourceRevision, } return revision, true, nil } } glog.V(2).Infof("Skipping build for BuildConfig %s/%s. None of the supplied refs matched %q", buildCfg.Namespace, buildCfg, git.Ref) return nil, false, nil } if !webhook.GitRefMatches(data.Git.Ref, git.Ref) { glog.V(2).Infof("Skipping build for BuildConfig %s/%s. Branch reference from %q does not match configuration", buildCfg.Namespace, buildCfg.Name, data.Git.Ref) return nil, false, nil } revision = &api.SourceRevision{ Type: api.BuildSourceGit, Git: &data.Git.GitSourceRevision, } } return revision, true, nil }
// Extract services generic webhooks. func (p *WebHookPlugin) Extract(buildCfg *api.BuildConfig, secret, path string, req *http.Request) (revision *api.SourceRevision, envvars []kapi.EnvVar, proceed bool, err error) { triggers, err := webhook.FindTriggerPolicy(api.GenericWebHookBuildTriggerType, buildCfg) if err != nil { return revision, envvars, false, err } glog.V(4).Infof("Checking if the provided secret for BuildConfig %s/%s matches", buildCfg.Namespace, buildCfg.Name) trigger, err := webhook.ValidateWebHookSecret(triggers, secret) if err != nil { return revision, envvars, false, err } glog.V(4).Infof("Verifying build request for BuildConfig %s/%s", buildCfg.Namespace, buildCfg.Name) if err = verifyRequest(req); err != nil { return revision, envvars, false, err } if buildCfg.Spec.Source.Git == nil { glog.V(4).Infof("No git source defined for BuildConfig %s/%s, but triggering anyway", buildCfg.Namespace, buildCfg.Name) return revision, envvars, true, err } contentType := req.Header.Get("Content-Type") if len(contentType) != 0 { contentType, _, err = mime.ParseMediaType(contentType) if err != nil { return nil, envvars, false, fmt.Errorf("non-parseable Content-Type %s (%s)", contentType, err) } } if req.Body != nil && contentType == "application/json" { body, err := ioutil.ReadAll(req.Body) if err != nil { return nil, envvars, false, err } if len(body) == 0 { return nil, envvars, true, nil } var data api.GenericWebHookEvent if err = json.Unmarshal(body, &data); err != nil { glog.V(4).Infof("Error unmarshaling json %v, but continuing", err) return nil, envvars, true, nil } if len(data.Env) > 0 && trigger.AllowEnv { envvars = data.Env } if data.Git == nil { glog.V(4).Infof("No git information for the generic webhook found in %s/%s", buildCfg.Namespace, buildCfg.Name) return nil, envvars, true, nil } if data.Git.Refs != nil { for _, ref := range data.Git.Refs { if webhook.GitRefMatches(ref.Ref, webhook.DefaultConfigRef, &buildCfg.Spec.Source) { revision = &api.SourceRevision{ Git: &ref.GitSourceRevision, } return revision, envvars, true, nil } } glog.V(2).Infof("Skipping build for BuildConfig %s/%s. None of the supplied refs matched %q", buildCfg.Namespace, buildCfg, buildCfg.Spec.Source.Git.Ref) return nil, envvars, false, nil } if !webhook.GitRefMatches(data.Git.Ref, webhook.DefaultConfigRef, &buildCfg.Spec.Source) { glog.V(2).Infof("Skipping build for BuildConfig %s/%s. Branch reference from %q does not match configuration", buildCfg.Namespace, buildCfg.Name, data.Git.Ref) return nil, envvars, false, nil } revision = &api.SourceRevision{ Git: &data.Git.GitSourceRevision, } } return revision, envvars, true, nil }