Skip to content

Commit d1f1298

Browse files
Copilotpelikhan
andauthored
Add support for runs-on field under safe-outputs that allow to configure a custom runner for the jobs support the safe-outputs feature (all jobs that are non-agentic like activation, create_issue, ....) (#1096)
* Initial plan * Implement runs-on support for safe-outputs jobs Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com> * Remove array format support for runs-on, only support single string values Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com> * lint --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: Peli de Halleux <pelikhan@users.noreply.github.com> Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com>
1 parent a66026d commit d1f1298

15 files changed

Lines changed: 221 additions & 14 deletions

pkg/parser/schemas/main_workflow_schema.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1863,6 +1863,10 @@
18631863
}
18641864
},
18651865
"additionalProperties": false
1866+
},
1867+
"runs-on": {
1868+
"type": "string",
1869+
"description": "Runner specification for all safe-outputs jobs (activation, create-issue, add-comment, etc.). Single runner label (e.g., 'ubuntu-latest', 'windows-latest', 'self-hosted')"
18661870
}
18671871
},
18681872
"additionalProperties": false

pkg/workflow/add_comment.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ func (c *Compiler) buildCreateOutputAddCommentJob(data *WorkflowData, mainJobNam
9090
job := &Job{
9191
Name: "create_issue_comment",
9292
If: jobCondition,
93-
RunsOn: "runs-on: ubuntu-latest",
93+
RunsOn: c.formatSafeOutputsRunsOn(data.SafeOutputs),
9494
Permissions: "permissions:\n contents: read\n issues: write\n pull-requests: write",
9595
TimeoutMinutes: 10, // 10-minute timeout as required
9696
Steps: steps,

pkg/workflow/add_labels.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ func (c *Compiler) buildCreateOutputLabelJob(data *WorkflowData, mainJobName str
8888
job := &Job{
8989
Name: "add_labels",
9090
If: jobCondition,
91-
RunsOn: "runs-on: ubuntu-latest",
91+
RunsOn: c.formatSafeOutputsRunsOn(data.SafeOutputs),
9292
Permissions: "permissions:\n contents: read\n issues: write\n pull-requests: write",
9393
TimeoutMinutes: 10, // 10-minute timeout as required
9494
Steps: steps,

pkg/workflow/compiler.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,7 @@ type SafeOutputsConfig struct {
146146
Env map[string]string `yaml:"env,omitempty"` // Environment variables to pass to safe output jobs
147147
GitHubToken string `yaml:"github-token,omitempty"` // GitHub token for safe output jobs
148148
MaximumPatchSize int `yaml:"max-patch-size,omitempty"` // Maximum allowed patch size in KB (defaults to 1024)
149+
RunsOn string `yaml:"runs-on,omitempty"` // Runner configuration for safe-outputs jobs
149150
}
150151

151152
// CompileWorkflow converts a markdown workflow to GitHub Actions YAML
@@ -1445,7 +1446,7 @@ func (c *Compiler) buildCheckMembershipJob(data *WorkflowData, frontmatter map[s
14451446
job := &Job{
14461447
Name: "check-membership",
14471448
If: data.If, // Use the existing condition (which may include alias checks)
1448-
RunsOn: "runs-on: ubuntu-latest",
1449+
RunsOn: c.formatSafeOutputsRunsOn(data.SafeOutputs),
14491450
Permissions: "", // No special permissions needed - just reading repo permissions
14501451
Steps: steps,
14511452
Outputs: outputs,
@@ -1512,7 +1513,7 @@ func (c *Compiler) buildActivationJob(data *WorkflowData, checkMembershipJobCrea
15121513
job := &Job{
15131514
Name: "activation",
15141515
If: activationCondition,
1515-
RunsOn: "runs-on: ubuntu-latest",
1516+
RunsOn: c.formatSafeOutputsRunsOn(data.SafeOutputs),
15161517
Permissions: permissions,
15171518
Steps: steps,
15181519
Outputs: outputs,

pkg/workflow/create_code_scanning_alert.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ func (c *Compiler) buildCreateOutputCodeScanningAlertJob(data *WorkflowData, mai
9696
job := &Job{
9797
Name: "create_code_scanning_alert",
9898
If: jobCondition,
99-
RunsOn: "runs-on: ubuntu-latest",
99+
RunsOn: c.formatSafeOutputsRunsOn(data.SafeOutputs),
100100
Permissions: "permissions:\n contents: read\n security-events: write\n actions: read", // Need security-events:write for SARIF upload
101101
TimeoutMinutes: 10, // 10-minute timeout
102102
Steps: steps,

pkg/workflow/create_discussion.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ func (c *Compiler) buildCreateOutputDiscussionJob(data *WorkflowData, mainJobNam
104104
job := &Job{
105105
Name: "create_discussion",
106106
If: jobCondition,
107-
RunsOn: "runs-on: ubuntu-latest",
107+
RunsOn: c.formatSafeOutputsRunsOn(data.SafeOutputs),
108108
Permissions: "permissions:\n contents: read\n discussions: write",
109109
TimeoutMinutes: 10, // 10-minute timeout as required
110110
Steps: steps,

pkg/workflow/create_issue.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ func (c *Compiler) buildCreateOutputIssueJob(data *WorkflowData, mainJobName str
133133
job := &Job{
134134
Name: "create_issue",
135135
If: jobCondition,
136-
RunsOn: "runs-on: ubuntu-latest",
136+
RunsOn: c.formatSafeOutputsRunsOn(data.SafeOutputs),
137137
Permissions: permissions,
138138
TimeoutMinutes: 10, // 10-minute timeout as required
139139
Steps: steps,

pkg/workflow/create_pr_review_comment.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ func (c *Compiler) buildCreateOutputPullRequestReviewCommentJob(data *WorkflowDa
7272
job := &Job{
7373
Name: "create_pr_review_comment",
7474
If: jobCondition,
75-
RunsOn: "runs-on: ubuntu-latest",
75+
RunsOn: c.formatSafeOutputsRunsOn(data.SafeOutputs),
7676
Permissions: "permissions:\n contents: read\n pull-requests: write",
7777
TimeoutMinutes: 10, // 10-minute timeout as required
7878
Steps: steps,

pkg/workflow/create_pull_request.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ func (c *Compiler) buildCreateOutputPullRequestJob(data *WorkflowData, mainJobNa
113113
job := &Job{
114114
Name: "create_pull_request",
115115
If: jobCondition,
116-
RunsOn: "runs-on: ubuntu-latest",
116+
RunsOn: c.formatSafeOutputsRunsOn(data.SafeOutputs),
117117
Permissions: "permissions:\n contents: write\n issues: write\n pull-requests: write",
118118
TimeoutMinutes: 10, // 10-minute timeout as required
119119
Steps: steps,

pkg/workflow/missing_tool.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ func (c *Compiler) buildCreateOutputMissingToolJob(data *WorkflowData, mainJobNa
5555
// Create the job
5656
job := &Job{
5757
Name: "missing_tool",
58-
RunsOn: "runs-on: ubuntu-latest",
58+
RunsOn: c.formatSafeOutputsRunsOn(data.SafeOutputs),
5959
If: "${{ always() }}", // Always run to capture missing tools
6060
Permissions: "permissions:\n contents: read", // Only needs read access for logging
6161
TimeoutMinutes: 5, // Short timeout since it's just processing output

0 commit comments

Comments
 (0)