Skip to content
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
2 changes: 1 addition & 1 deletion pkg/cli/compile_post_processing.go
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ func generateMaintenanceWorkflowWrapper(
) error {
compilePostProcessingLog.Print("Generating maintenance workflow")

if err := workflow.GenerateMaintenanceWorkflow(workflowDataList, workflowsDir, compiler.GetVersion(), compiler.GetActionMode(), verbose); err != nil {
if err := workflow.GenerateMaintenanceWorkflow(workflowDataList, workflowsDir, compiler.GetVersion(), compiler.GetActionMode(), compiler.GetActionTag(), verbose); err != nil {
if strict {
return fmt.Errorf("failed to generate maintenance workflow: %w", err)
}
Expand Down
2 changes: 1 addition & 1 deletion pkg/cli/init.go
Original file line number Diff line number Diff line change
Expand Up @@ -325,7 +325,7 @@ func ensureMaintenanceWorkflow(verbose bool) error {
// Always call GenerateMaintenanceWorkflow even with empty list
// This allows it to delete existing maintenance workflow if no workflows have expires
initLog.Printf("Generating maintenance workflow for %d workflows", len(workflowDataList))
if err := workflow.GenerateMaintenanceWorkflow(workflowDataList, workflowsDir, GetVersion(), compiler.GetActionMode(), verbose); err != nil {
if err := workflow.GenerateMaintenanceWorkflow(workflowDataList, workflowsDir, GetVersion(), compiler.GetActionMode(), compiler.GetActionTag(), verbose); err != nil {
return fmt.Errorf("failed to generate maintenance workflow: %w", err)
}

Expand Down
4 changes: 2 additions & 2 deletions pkg/workflow/maintenance_workflow.go
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ func generateMaintenanceCron(minExpiresDays int) (string, string) {

// GenerateMaintenanceWorkflow generates the agentics-maintenance.yml workflow
// if any workflows use the expires field for discussions or issues
func GenerateMaintenanceWorkflow(workflowDataList []*WorkflowData, workflowDir string, version string, actionMode ActionMode, verbose bool) error {
func GenerateMaintenanceWorkflow(workflowDataList []*WorkflowData, workflowDir string, version string, actionMode ActionMode, actionTag string, verbose bool) error {
maintenanceLog.Print("Checking if maintenance workflow is needed")

// Check if any workflow uses expires field for discussions, issues, or pull requests
Expand Down Expand Up @@ -150,7 +150,7 @@ jobs:
// Get the setup action reference (local or remote based on mode)
// Pass nil for data since maintenance workflow doesn't have WorkflowData
// In release mode without data, it will return tag-based reference
setupActionRef := ResolveSetupActionReference(actionMode, version, "", nil)
setupActionRef := ResolveSetupActionReference(actionMode, version, actionTag, nil)

// Add checkout step only in dev mode (for local action paths)
if actionMode == ActionModeDev {
Expand Down
51 changes: 49 additions & 2 deletions pkg/workflow/maintenance_workflow_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ package workflow
import (
"os"
"path/filepath"
"strings"
"testing"
)

Expand Down Expand Up @@ -148,7 +149,7 @@ func TestGenerateMaintenanceWorkflow_WithExpires(t *testing.T) {
tmpDir := t.TempDir()

// Call GenerateMaintenanceWorkflow
err := GenerateMaintenanceWorkflow(tt.workflowDataList, tmpDir, "v1.0.0", ActionModeDev, false)
err := GenerateMaintenanceWorkflow(tt.workflowDataList, tmpDir, "v1.0.0", ActionModeDev, "", false)

// Check error expectation
if tt.expectError && err == nil {
Expand Down Expand Up @@ -237,7 +238,7 @@ func TestGenerateMaintenanceWorkflow_DeletesExistingFile(t *testing.T) {
}

// Call GenerateMaintenanceWorkflow
err := GenerateMaintenanceWorkflow(tt.workflowDataList, tmpDir, "v1.0.0", ActionModeDev, false)
err := GenerateMaintenanceWorkflow(tt.workflowDataList, tmpDir, "v1.0.0", ActionModeDev, "", false)
if err != nil {
t.Errorf("Unexpected error: %v", err)
}
Expand All @@ -255,3 +256,49 @@ func TestGenerateMaintenanceWorkflow_DeletesExistingFile(t *testing.T) {
})
}
}

func TestGenerateMaintenanceWorkflow_ActionTag(t *testing.T) {
workflowDataList := []*WorkflowData{
{
Name: "test-workflow",
SafeOutputs: &SafeOutputsConfig{
CreateIssues: &CreateIssuesConfig{
Expires: 48,
},
},
},
}

t.Run("release mode with action-tag uses remote ref", func(t *testing.T) {
tmpDir := t.TempDir()
err := GenerateMaintenanceWorkflow(workflowDataList, tmpDir, "v1.0.0", ActionModeRelease, "v0.47.4", false)
if err != nil {
t.Fatalf("Unexpected error: %v", err)
}
content, err := os.ReadFile(filepath.Join(tmpDir, "agentics-maintenance.yml"))
if err != nil {
t.Fatalf("Expected maintenance workflow to be generated: %v", err)
}
if !strings.Contains(string(content), "github/gh-aw/actions/setup@v0.47.4") {
t.Errorf("Expected remote ref with action-tag v0.47.4, got:\n%s", string(content))
}
if strings.Contains(string(content), "uses: ./actions/setup") {
t.Errorf("Expected no local path in release mode with action-tag, got:\n%s", string(content))
}
})

t.Run("dev mode ignores action-tag and uses local path", func(t *testing.T) {
tmpDir := t.TempDir()
err := GenerateMaintenanceWorkflow(workflowDataList, tmpDir, "v1.0.0", ActionModeDev, "v0.47.4", false)
if err != nil {
t.Fatalf("Unexpected error: %v", err)
}
content, err := os.ReadFile(filepath.Join(tmpDir, "agentics-maintenance.yml"))
if err != nil {
t.Fatalf("Expected maintenance workflow to be generated: %v", err)
}
if !strings.Contains(string(content), "uses: ./actions/setup") {
t.Errorf("Expected local path in dev mode, got:\n%s", string(content))
}
})
}
Loading