webhook: add runRefType and convert webhook event
Introduce a runRefType that represent the ref type of the Run (branch/tag/PR) Convert the webhook event type to the runRefType and use it to generate the run group.
This commit is contained in:
parent
38b54b092c
commit
28ddfb1781
|
@ -39,19 +39,23 @@ const (
|
|||
ApproversAnnotation = "approvers"
|
||||
)
|
||||
|
||||
func GenRunGroup(baseGroupType GroupType, baseGroupID string, webhookData *types.WebhookData) string {
|
||||
// we pathescape the branch name to handle branches with slashes and make the
|
||||
// branch a single path entry
|
||||
switch webhookData.Event {
|
||||
func WebHookEventToRunRefType(we types.WebhookEvent) types.RunRefType {
|
||||
switch we {
|
||||
case types.WebhookEventPush:
|
||||
return path.Join("/", string(baseGroupType), baseGroupID, string(GroupTypeBranch), url.PathEscape(webhookData.Branch))
|
||||
return types.RunRefTypeBranch
|
||||
case types.WebhookEventTag:
|
||||
return path.Join("/", string(baseGroupType), baseGroupID, string(GroupTypeTag), url.PathEscape(webhookData.Tag))
|
||||
return types.RunRefTypeTag
|
||||
case types.WebhookEventPullRequest:
|
||||
return path.Join("/", string(baseGroupType), baseGroupID, string(GroupTypePullRequest), url.PathEscape(webhookData.PullRequestID))
|
||||
return types.RunRefTypePullRequest
|
||||
}
|
||||
|
||||
panic(fmt.Errorf("invalid webhook event type: %q", webhookData.Event))
|
||||
panic(fmt.Errorf("invalid webhook event type: %q", we))
|
||||
}
|
||||
|
||||
func GenRunGroup(baseGroupType GroupType, baseGroupID string, groupType GroupType, group string) string {
|
||||
// we pathescape the branch name to handle branches with slashes and make the
|
||||
// branch a single path entry
|
||||
return path.Join("/", string(baseGroupType), baseGroupID, string(groupType), url.PathEscape(group))
|
||||
}
|
||||
|
||||
func GroupTypeIDFromRunGroup(group string) (GroupType, string, error) {
|
||||
|
|
|
@ -90,28 +90,30 @@ func (h *webhooksHandler) handleWebhook(r *http.Request) (int, string, error) {
|
|||
return http.StatusBadRequest, "", errors.Errorf("bad webhook url %q. Missing projectid or userid", r.URL)
|
||||
}
|
||||
|
||||
isUserBuild := false
|
||||
runType := types.RunTypeProject
|
||||
if projectID == "" {
|
||||
isUserBuild = true
|
||||
runType = types.RunTypeUser
|
||||
}
|
||||
|
||||
defer r.Body.Close()
|
||||
|
||||
var project *types.Project
|
||||
var user *types.User
|
||||
var webhookData *types.WebhookData
|
||||
var sshPrivKey string
|
||||
var cloneURL string
|
||||
var sshHostKey string
|
||||
var skipSSHHostKeyCheck bool
|
||||
var runType types.RunType
|
||||
variables := map[string]string{}
|
||||
|
||||
var gitSource gitsource.GitSource
|
||||
if !isUserBuild {
|
||||
project, _, err := h.configstoreClient.GetProject(ctx, projectID)
|
||||
if runType == types.RunTypeProject {
|
||||
csProject, _, err := h.configstoreClient.GetProject(ctx, projectID)
|
||||
if err != nil {
|
||||
return http.StatusBadRequest, "", errors.Errorf("failed to get project %s: %w", projectID, err)
|
||||
}
|
||||
h.log.Infof("project: %s", util.Dump(project))
|
||||
project = csProject.Project
|
||||
|
||||
user, _, err := h.configstoreClient.GetUserByLinkedAccount(ctx, project.LinkedAccountID)
|
||||
if err != nil {
|
||||
|
@ -209,12 +211,11 @@ func (h *webhooksHandler) handleWebhook(r *http.Request) (int, string, error) {
|
|||
return 0, "", nil
|
||||
}
|
||||
|
||||
user, _, err := h.configstoreClient.GetUser(ctx, userID)
|
||||
user, _, err = h.configstoreClient.GetUser(ctx, userID)
|
||||
if err != nil {
|
||||
return http.StatusBadRequest, "", errors.Errorf("failed to get user with id %q: %w", userID, err)
|
||||
}
|
||||
h.log.Debugf("user: %s", util.Dump(user))
|
||||
userID = user.ID
|
||||
|
||||
cloneURL = fmt.Sprintf("%s/%s", h.apiExposedURL+"/repos", webhookData.Repo.Path)
|
||||
runType = types.RunTypeUser
|
||||
|
@ -269,7 +270,7 @@ func (h *webhooksHandler) handleWebhook(r *http.Request) (int, string, error) {
|
|||
AnnotationCompareLink: webhookData.CompareLink,
|
||||
}
|
||||
|
||||
if !isUserBuild {
|
||||
if runType == types.RunTypeProject {
|
||||
annotations[AnnotationProjectID] = webhookData.ProjectID
|
||||
} else {
|
||||
annotations[AnnotationUserID] = userID
|
||||
|
@ -288,14 +289,36 @@ func (h *webhooksHandler) handleWebhook(r *http.Request) (int, string, error) {
|
|||
annotations[AnnotationPullRequestLink] = webhookData.PullRequestLink
|
||||
}
|
||||
|
||||
var baseGroupType common.GroupType
|
||||
var baseGroupID string
|
||||
var groupType common.GroupType
|
||||
var group string
|
||||
if !isUserBuild {
|
||||
group = common.GenRunGroup(common.GroupTypeProject, webhookData.ProjectID, webhookData)
|
||||
|
||||
refType := common.WebHookEventToRunRefType(webhookData.Event)
|
||||
|
||||
if runType == types.RunTypeProject {
|
||||
baseGroupType = common.GroupTypeProject
|
||||
baseGroupID = project.ID
|
||||
} else {
|
||||
group = common.GenRunGroup(common.GroupTypeUser, userID, webhookData)
|
||||
baseGroupType = common.GroupTypeUser
|
||||
baseGroupID = user.ID
|
||||
}
|
||||
|
||||
if err := h.createRuns(ctx, filename, data, group, annotations, env, variables, webhookData); err != nil {
|
||||
switch refType {
|
||||
case types.RunRefTypeBranch:
|
||||
groupType = common.GroupTypeBranch
|
||||
group = webhookData.Branch
|
||||
case types.RunRefTypeTag:
|
||||
groupType = common.GroupTypeTag
|
||||
group = webhookData.Tag
|
||||
case types.RunRefTypePullRequest:
|
||||
groupType = common.GroupTypePullRequest
|
||||
group = webhookData.PullRequestID
|
||||
}
|
||||
|
||||
runGroup := common.GenRunGroup(baseGroupType, baseGroupID, groupType, group)
|
||||
|
||||
if err := h.createRuns(ctx, filename, data, runGroup, annotations, env, variables, webhookData); err != nil {
|
||||
return http.StatusInternalServerError, "", errors.Errorf("failed to create run: %w", err)
|
||||
}
|
||||
//if err := gitSource.CreateStatus(webhookData.Repo.Owner, webhookData.Repo.Name, webhookData.CommitSHA, gitsource.CommitStatusPending, "localhost:8080", "build %s", "agola"); err != nil {
|
||||
|
@ -327,7 +350,7 @@ func (h *webhooksHandler) fetchConfigFiles(gitSource gitsource.GitSource, webhoo
|
|||
return data, filename, nil
|
||||
}
|
||||
|
||||
func (h *webhooksHandler) createRuns(ctx context.Context, filename string, configData []byte, group string, annotations, staticEnv, variables map[string]string, webhookData *types.WebhookData) error {
|
||||
func (h *webhooksHandler) createRuns(ctx context.Context, filename string, configData []byte, runGroup string, annotations, staticEnv, variables map[string]string, webhookData *types.WebhookData) error {
|
||||
setupErrors := []string{}
|
||||
|
||||
var configFormat config.ConfigFormat
|
||||
|
@ -349,7 +372,7 @@ func (h *webhooksHandler) createRuns(ctx context.Context, filename string, confi
|
|||
setupErrors = append(setupErrors, err.Error())
|
||||
createRunReq := &rsapi.RunCreateRequest{
|
||||
RunConfigTasks: nil,
|
||||
Group: group,
|
||||
Group: runGroup,
|
||||
SetupErrors: setupErrors,
|
||||
Name: rstypes.RunGenericSetupErrorName,
|
||||
StaticEnvironment: staticEnv,
|
||||
|
@ -367,10 +390,10 @@ func (h *webhooksHandler) createRuns(ctx context.Context, filename string, confi
|
|||
rcts := runconfig.GenRunConfigTasks(util.DefaultUUIDGenerator{}, config, run.Name, variables, webhookData.Branch, webhookData.Tag, webhookData.Ref)
|
||||
|
||||
h.log.Debugf("rcts: %s", util.Dump(rcts))
|
||||
h.log.Infof("group: %s", group)
|
||||
h.log.Infof("group: %s", runGroup)
|
||||
createRunReq := &rsapi.RunCreateRequest{
|
||||
RunConfigTasks: rcts,
|
||||
Group: group,
|
||||
Group: runGroup,
|
||||
SetupErrors: setupErrors,
|
||||
Name: run.Name,
|
||||
StaticEnvironment: staticEnv,
|
||||
|
|
|
@ -0,0 +1,30 @@
|
|||
// Copyright 2019 Sorint.lab
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
package types
|
||||
|
||||
type RunType string
|
||||
|
||||
const (
|
||||
RunTypeProject RunType = "project"
|
||||
RunTypeUser RunType = "user"
|
||||
)
|
||||
|
||||
type RunRefType string
|
||||
|
||||
const (
|
||||
RunRefTypeBranch RunRefType = "branch"
|
||||
RunRefTypeTag RunRefType = "tag"
|
||||
RunRefTypePullRequest RunRefType = "pull_request"
|
||||
)
|
|
@ -22,13 +22,6 @@ const (
|
|||
WebhookEventPullRequest WebhookEvent = "pull_request"
|
||||
)
|
||||
|
||||
type RunType string
|
||||
|
||||
const (
|
||||
RunTypeProject RunType = "project"
|
||||
RunTypeUser RunType = "user"
|
||||
)
|
||||
|
||||
type WebhookData struct {
|
||||
Event WebhookEvent `json:"event,omitempty"`
|
||||
ProjectID string `json:"project_id,omitempty"`
|
||||
|
|
Loading…
Reference in New Issue