Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: use labels to select workflow job notification channels #58

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 10 additions & 2 deletions cd/manager/common/job/job.go
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,7 @@ func CreateWorkflowJob(jobState JobState) (Workflow, error) {
} else if workflow, found := jobState.Params[WorkflowJobParam_Workflow].(string); !found {
return Workflow{}, fmt.Errorf("missing workflow")
} else {
workflowInputs := make(map[string]interface{}, 0)
workflowInputs := make(map[string]interface{})
if inputs, found := jobState.Params[WorkflowJobParam_Inputs].(map[string]interface{}); found {
workflowInputs = inputs
}
Expand All @@ -134,6 +134,14 @@ func CreateWorkflowJob(jobState JobState) (Workflow, error) {
if id, found := jobState.Params[JobParam_Id].(float64); found {
workflowRunId = int64(id)
}
return Workflow{org, repo, workflow, ref, workflowInputs, workflowRunUrl, workflowRunId}, nil
workflowLabels := make([]string, 0)
if labels, found := jobState.Params[WorkflowJobParam_Labels].([]interface{}); found {
for _, label := range labels {
if l, ok := label.(string); ok {
workflowLabels = append(workflowLabels, l)
}
}
}
return Workflow{org, repo, workflow, ref, workflowInputs, workflowRunUrl, workflowRunId, workflowLabels}, nil
}
}
7 changes: 7 additions & 0 deletions cd/manager/common/job/models.go
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,12 @@ const (
WorkflowJobParam_Url string = "url"
WorkflowJobParam_JobId string = "job_id"
WorkflowJobParam_TestSelector string = "test_selector"
WorkflowJobParam_Labels string = "labels"
)

const (
WorkflowJobLabel_Test string = "test"
WorkflowJobLabel_Deploy string = "deploy"
)

// JobState represents the state of a job in the database
Expand All @@ -95,4 +101,5 @@ type Workflow struct {
Inputs map[string]interface{}
Url string
Id int64
Labels []string
}
21 changes: 21 additions & 0 deletions cd/manager/notifs/discord.go
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,27 @@ func parseDiscordWebhookUrl(urlEnv string) (webhook.Client, error) {
return nil, nil
}

func webhooksForLabels(labels []string) ([]webhook.Client, error) {
webhooks := make([]webhook.Client, 0)
for _, label := range labels {
switch label {
case job.WorkflowJobLabel_Test:
if t, err := parseDiscordWebhookUrl("DISCORD_TESTS_WEBHOOK"); err != nil {
return nil, err
} else {
webhooks = append(webhooks, t)
}
case job.WorkflowJobLabel_Deploy:
if t, err := parseDiscordWebhookUrl("DISCORD_DEPLOYMENTS_WEBHOOK"); err != nil {
return nil, err
} else {
webhooks = append(webhooks, t)
}
}
}
return webhooks, nil
}

func (n JobNotifs) NotifyJob(jobs ...job.JobState) {
for _, jobState := range jobs {
if jn, err := n.getJobNotif(jobState); err != nil {
Expand Down
14 changes: 7 additions & 7 deletions cd/manager/notifs/workflow.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,25 +23,25 @@ const (
)

type workflowNotif struct {
state job.JobState
workflow job.Workflow
workflowWebhook webhook.Client
state job.JobState
workflow job.Workflow
workflowWebhooks []webhook.Client
}

func newWorkflowNotif(jobState job.JobState) (jobNotif, error) {
if w, err := parseDiscordWebhookUrl("DISCORD_WORKFLOWS_WEBHOOK"); err != nil {
if workflow, err := job.CreateWorkflowJob(jobState); err != nil {
return nil, err
} else if workflow, err := job.CreateWorkflowJob(jobState); err != nil {
} else if webhooks, err := webhooksForLabels(workflow.Labels); err != nil {
return nil, err
} else {
return &workflowNotif{jobState, workflow, w}, nil
return &workflowNotif{jobState, workflow, webhooks}, nil
}
}

func (w workflowNotif) getChannels() []webhook.Client {
// Skip "started" notifications so that the channel doesn't get too noisy
if w.state.Stage != job.JobStage_Started {
return []webhook.Client{w.workflowWebhook}
return w.workflowWebhooks
}
return nil
}
Expand Down
Loading