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
97 changes: 97 additions & 0 deletions pkg/workflow/compiler_custom_job_memory_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,103 @@ Reads cache memory and dispatches tasks.
assert.NotContains(t, yamlStr, "update_cache_memory:", "update_cache_memory job should not be created without threat detection")
}

// TestCustomJobRestoreMemoryUsesDefaultRunsOn verifies that custom restore-memory
// jobs inherit the workflow runner when runs-on is omitted.
func TestCustomJobRestoreMemoryUsesDefaultRunsOn(t *testing.T) {
tmpDir := testutil.TempDir(t, "custom-job-restore-default-runs-on")

frontmatter := `---
name: Orchestrator
on: workflow_dispatch
permissions:
contents: read
engine: copilot
strict: false
tools:
cache-memory: true
jobs:
setup:
restore-memory: true
steps:
- name: Verify setup
run: echo "ok"
---

# Orchestrator Workflow
`

testFile := filepath.Join(tmpDir, "test.md")
require.NoError(t, os.WriteFile(testFile, []byte(frontmatter), 0644))

compiler := NewCompiler()
require.NoError(t, compiler.CompileWorkflow(testFile))

lockFile := filepath.Join(tmpDir, "test.lock.yml")
content, err := os.ReadFile(lockFile)
require.NoError(t, err)

section := extractJobSection(string(content), "setup")
require.NotEmpty(t, section, "Expected setup job section in lock file")
assert.Contains(t, section, "runs-on: ubuntu-latest", "custom job should inherit default workflow runner when runs-on is omitted")
assert.Contains(t, section, "Restore cache-memory", "restore-memory steps should still be present")
}

// TestCustomJobRestoreMemoryInheritsArrayRunsOn verifies that a custom job with
// restore-memory: true and no explicit runs-on properly inherits a workflow-level
// array/object runs-on, with continuation lines correctly indented.
func TestCustomJobRestoreMemoryInheritsArrayRunsOn(t *testing.T) {
tmpDir := testutil.TempDir(t, "custom-job-restore-array-runs-on")

frontmatter := `---
name: Orchestrator
on: workflow_dispatch
permissions:
contents: read
engine: copilot
strict: false
runs-on:
group: ubuntu-runners
labels: [self-hosted]
tools:
cache-memory: true
jobs:
setup:
restore-memory: true
steps:
- name: Verify setup
run: echo "ok"
---

# Orchestrator Workflow
`

testFile := filepath.Join(tmpDir, "test.md")
require.NoError(t, os.WriteFile(testFile, []byte(frontmatter), 0644))

compiler := NewCompiler()
require.NoError(t, compiler.CompileWorkflow(testFile))

lockFile := filepath.Join(tmpDir, "test.lock.yml")
content, err := os.ReadFile(lockFile)
require.NoError(t, err)

section := extractJobSection(string(content), "setup")
require.NotEmpty(t, section, "Expected setup job section in lock file")
assert.Contains(t, section, "runs-on:", "custom job should inherit workflow-level runs-on")
assert.Contains(t, section, "group: ubuntu-runners", "custom job should include group from inherited runs-on")
// Verify continuation lines are properly indented (4 spaces) inside the job section.
for line := range strings.SplitSeq(section, "\n") {
if strings.TrimSpace(line) == "" || strings.HasPrefix(strings.TrimSpace(line), "setup:") {
continue
}
if strings.TrimSpace(line) != "" {
assert.True(t, strings.HasPrefix(line, " "),
"all non-empty lines inside job section should be indented with at least 4 spaces, got: %q", line)
}
}
assert.Contains(t, section, "Restore cache-memory", "restore-memory steps should still be present")
}

// TestCustomJobRestoreMemoryRepoMemory verifies that a custom job with
// restore-memory: true gets repo-memory clone steps injected when repo-memory is configured.
func TestCustomJobRestoreMemoryRepoMemory(t *testing.T) {
Expand Down
7 changes: 7 additions & 0 deletions pkg/workflow/compiler_custom_jobs.go
Original file line number Diff line number Diff line change
Expand Up @@ -477,6 +477,13 @@ func configureCustomReusableWorkflow(job *Job, jobName string, usesStr string, c
}

func (c *Compiler) configureCustomJobSteps(job *Job, jobName string, configMap map[string]any, data *WorkflowData) error {
if job.RunsOn == "" {
job.RunsOn = c.indentYAMLLines(data.RunsOn, " ")
if job.RunsOn == "" {
job.RunsOn = "runs-on: ubuntu-latest"
}
}

// Add basic steps if specified (only for non-reusable workflow jobs).
// `setup-steps` and `pre-steps` stay distinct so setup-steps can remain the
// first injected steps in the job, followed by compiler scaffolding,
Expand Down
Loading