Skip to content

Commit 75f3975

Browse files
authored
Log first trigger reason for agentics-maintenance generation (#38616)
1 parent 288fd9f commit 75f3975

2 files changed

Lines changed: 58 additions & 4 deletions

File tree

pkg/workflow/maintenance_workflow.go

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,7 @@ func GenerateMaintenanceWorkflow(ctx context.Context, opts GenerateMaintenanceWo
167167
runsOnValue := FormatRunsOn(configuredRunsOn, defaultRunsOn)
168168

169169
// Scan workflows for expires fields and track the minimum expires value
170-
hasExpires, minExpires := scanWorkflowsForExpires(workflowDataList)
170+
hasExpires, minExpires, triggerReason := scanWorkflowsForExpires(workflowDataList)
171171

172172
// Get the setup action reference (local or remote based on mode).
173173
// Use the first available WorkflowData's ActionResolver to enable SHA pinning.
@@ -210,6 +210,7 @@ func GenerateMaintenanceWorkflow(ctx context.Context, opts GenerateMaintenanceWo
210210
})
211211
}
212212

213+
maintenanceLog.Printf("Maintenance workflow generation triggered: %s", triggerReason)
213214
maintenanceLog.Printf("Generating maintenance workflow for expired discussions, issues, and pull requests (minimum expires: %d hours)", minExpires)
214215

215216
// Convert hours to days for cron schedule generation
@@ -338,10 +339,19 @@ func allCopilotWorkflowsUseOrgBilling(workflowDataList []*WorkflowData) bool {
338339
}
339340

340341
// scanWorkflowsForExpires checks all workflow data for expires fields and returns
341-
// whether any expires fields are set and the minimum expires value in hours.
342-
func scanWorkflowsForExpires(workflowDataList []*WorkflowData) (bool, int) {
342+
// whether any expires fields are set, the minimum expires value in hours, and the
343+
// first reason that triggered maintenance workflow generation.
344+
func scanWorkflowsForExpires(workflowDataList []*WorkflowData) (bool, int, string) {
343345
hasExpires := false
344346
minExpires := 0 // Track minimum expires value in hours
347+
triggerReason := ""
348+
349+
setTriggerReason := func(reason string) {
350+
if triggerReason == "" {
351+
triggerReason = reason
352+
maintenanceLog.Printf("Maintenance workflow became required: %s", reason)
353+
}
354+
}
345355

346356
for _, workflowData := range workflowDataList {
347357
if workflowData == nil || workflowData.SafeOutputs == nil {
@@ -352,6 +362,7 @@ func scanWorkflowsForExpires(workflowDataList []*WorkflowData) (bool, int) {
352362
if workflowData.SafeOutputs.CreateDiscussions.Expires > 0 {
353363
hasExpires = true
354364
expires := workflowData.SafeOutputs.CreateDiscussions.Expires
365+
setTriggerReason(fmt.Sprintf("workflow %q sets safe_outputs.create_discussions.expires=%dh", workflowData.Name, expires))
355366
maintenanceLog.Printf("Workflow %s has expires field set to %d hours for discussions", workflowData.Name, expires)
356367
if minExpires == 0 || expires < minExpires {
357368
minExpires = expires
@@ -363,6 +374,7 @@ func scanWorkflowsForExpires(workflowDataList []*WorkflowData) (bool, int) {
363374
if workflowData.SafeOutputs.CreateIssues.Expires > 0 {
364375
hasExpires = true
365376
expires := workflowData.SafeOutputs.CreateIssues.Expires
377+
setTriggerReason(fmt.Sprintf("workflow %q sets safe_outputs.create_issues.expires=%dh", workflowData.Name, expires))
366378
maintenanceLog.Printf("Workflow %s has expires field set to %d hours for issues", workflowData.Name, expires)
367379
if minExpires == 0 || expires < minExpires {
368380
minExpires = expires
@@ -374,6 +386,7 @@ func scanWorkflowsForExpires(workflowDataList []*WorkflowData) (bool, int) {
374386
if workflowData.SafeOutputs.CreatePullRequests.Expires > 0 {
375387
hasExpires = true
376388
expires := workflowData.SafeOutputs.CreatePullRequests.Expires
389+
setTriggerReason(fmt.Sprintf("workflow %q sets safe_outputs.create_pull_requests.expires=%dh", workflowData.Name, expires))
377390
maintenanceLog.Printf("Workflow %s has expires field set to %d hours for pull requests", workflowData.Name, expires)
378391
if minExpires == 0 || expires < minExpires {
379392
minExpires = expires
@@ -385,6 +398,7 @@ func scanWorkflowsForExpires(workflowDataList []*WorkflowData) (bool, int) {
385398
if isNoOpReportAsIssueEnabled(workflowData.SafeOutputs.NoOp.ReportAsIssue) {
386399
hasExpires = true
387400
expires := defaultNoOpIssueExpirationHours
401+
setTriggerReason(fmt.Sprintf("workflow %q enables no-op issue reporting (default expiration %dh)", workflowData.Name, expires))
388402
maintenanceLog.Printf("Workflow %s has no-op report-as-issue enabled, using %d-hour no-op issue expiration", workflowData.Name, expires)
389403
if minExpires == 0 || expires < minExpires {
390404
minExpires = expires
@@ -393,5 +407,5 @@ func scanWorkflowsForExpires(workflowDataList []*WorkflowData) (bool, int) {
393407
}
394408
}
395409

396-
return hasExpires, minExpires
410+
return hasExpires, minExpires, triggerReason
397411
}

pkg/workflow/maintenance_workflow_test.go

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -230,6 +230,46 @@ func TestGenerateMaintenanceWorkflow_WithExpires(t *testing.T) {
230230
}
231231
}
232232

233+
func TestScanWorkflowsForExpires_TriggerReason(t *testing.T) {
234+
t.Run("no triggers", func(t *testing.T) {
235+
hasExpires, minExpires, triggerReason := scanWorkflowsForExpires([]*WorkflowData{
236+
{
237+
Name: "no-safe-outputs",
238+
SafeOutputs: nil,
239+
},
240+
})
241+
require.False(t, hasExpires)
242+
require.Equal(t, 0, minExpires)
243+
require.Empty(t, triggerReason)
244+
})
245+
246+
t.Run("captures first trigger reason", func(t *testing.T) {
247+
hasExpires, minExpires, triggerReason := scanWorkflowsForExpires([]*WorkflowData{
248+
{
249+
Name: "first-trigger",
250+
SafeOutputs: &SafeOutputsConfig{
251+
CreateIssues: &CreateIssuesConfig{
252+
Expires: 72,
253+
},
254+
},
255+
},
256+
{
257+
Name: "second-trigger",
258+
SafeOutputs: &SafeOutputsConfig{
259+
CreateDiscussions: &CreateDiscussionsConfig{
260+
Expires: 24,
261+
},
262+
},
263+
},
264+
})
265+
require.True(t, hasExpires)
266+
require.Equal(t, 24, minExpires)
267+
require.Contains(t, triggerReason, "first-trigger")
268+
require.Contains(t, triggerReason, "safe_outputs.create_issues.expires=72h")
269+
require.NotContains(t, triggerReason, "second-trigger")
270+
})
271+
}
272+
233273
func TestGenerateMaintenanceWorkflow_CreatesWorkflowDirRecursively(t *testing.T) {
234274
tmpDir := t.TempDir()
235275
workflowDir := filepath.Join(tmpDir, "nested", "workflows")

0 commit comments

Comments
 (0)