in controllers/codebase/service/chain/put_webhook.go [38:123]
func (s *PutWebHook) ServeRequest(ctx context.Context, codebase *codebaseApi.Codebase) error {
log := ctrl.LoggerFrom(ctx)
if codebase.Spec.CiTool != util.CITekton {
log.Info("Skip putting webhook for non-Tekton CI tool")
return nil
}
log.Info("Start putting webhook")
gitServer := &codebaseApi.GitServer{}
if err := s.client.Get(ctx, client.ObjectKey{Name: codebase.Spec.GitServer, Namespace: codebase.Namespace}, gitServer); err != nil {
return s.processCodebaseError(
codebase,
fmt.Errorf("failed to get git server %s: %w", codebase.Spec.GitServer, err),
)
}
if gitServer.Spec.GitProvider != codebaseApi.GitProviderGitlab &&
gitServer.Spec.GitProvider != codebaseApi.GitProviderGithub &&
gitServer.Spec.GitProvider != codebaseApi.GitProviderBitbucket {
log.Info(fmt.Sprintf("Unsupported Git provider %s. Skip putting webhook", gitServer.Spec.GitProvider))
return nil
}
secret, err := s.getGitServerSecret(ctx, gitServer.Spec.NameSshKeySecret, gitServer.Namespace)
if err != nil {
return s.processCodebaseError(codebase, err)
}
gitProvider, err := gitprovider.NewProvider(gitServer, s.restyClient, string(secret.Data[util.GitServerSecretTokenField]))
if err != nil {
return s.processCodebaseError(codebase, fmt.Errorf("failed to create git provider: %w", err))
}
projectID := codebase.Spec.GetProjectID()
gitHost := gitprovider.GetGitProviderAPIURL(gitServer)
if codebase.Status.GetWebHookRef() != "" {
_, err = gitProvider.GetWebHook(
ctx,
gitHost,
string(secret.Data[util.GitServerSecretTokenField]),
projectID,
codebase.Status.GetWebHookRef(),
)
if err == nil {
log.Info("Webhook already exists. Skip putting webhook")
return nil
}
if !errors.Is(err, gitprovider.ErrWebHookNotFound) {
return s.processCodebaseError(codebase, fmt.Errorf("failed to get webhook: %w", err))
}
}
webHookURL, err := s.getWebHookUrl(ctx, gitServer)
if err != nil {
return s.processCodebaseError(codebase, err)
}
webHook, err := gitProvider.CreateWebHookIfNotExists(
ctx,
gitHost,
string(secret.Data[util.GitServerSecretTokenField]),
projectID,
string(secret.Data[util.GitServerSecretWebhookSecretField]),
webHookURL,
gitServer.Spec.SkipWebhookSSLVerification,
)
if err != nil {
return s.processCodebaseError(codebase, fmt.Errorf("failed to create web hook: %w", err))
}
codebase.Status.WebHookRef = webHook.ID
if err = setIntermediateSuccessFields(ctx, s.client, codebase, codebaseApi.PutWebHook); err != nil {
return fmt.Errorf("failed to update codebase %s status: %w", codebase.Name, err)
}
log.Info("Webhook has been created successfully")
return nil
}