Merge pull request #34 from bahdotsh/fix/runs-on-array-support

fix: Support array format for runs-on field in GitHub Actions workflows
This commit is contained in:
Gokul
2025-08-13 13:24:35 +05:30
committed by GitHub
4 changed files with 47 additions and 5 deletions

View File

@@ -1762,9 +1762,13 @@ fn get_runner_image(runs_on: &str) -> String {
.to_string() .to_string()
} }
fn get_runner_image_from_opt(runs_on: &Option<String>) -> String { fn get_runner_image_from_opt(runs_on: &Option<Vec<String>>) -> String {
let default = "ubuntu-latest"; let default = "ubuntu-latest";
let ro = runs_on.as_deref().unwrap_or(default); let ro = runs_on
.as_ref()
.and_then(|vec| vec.first())
.map(|s| s.as_str())
.unwrap_or(default);
get_runner_image(ro) get_runner_image(ro)
} }

View File

@@ -130,7 +130,7 @@ pub fn convert_to_workflow_format(pipeline: &Pipeline) -> workflow::WorkflowDefi
// Create a new job // Create a new job
let mut job = workflow::Job { let mut job = workflow::Job {
runs_on: Some("ubuntu-latest".to_string()), // Default runner runs_on: Some(vec!["ubuntu-latest".to_string()]), // Default runner
needs: None, needs: None,
steps: Vec::new(), steps: Vec::new(),
env: HashMap::new(), env: HashMap::new(),

View File

@@ -26,6 +26,26 @@ where
} }
} }
// Custom deserializer for runs-on field that handles both string and array formats
fn deserialize_runs_on<'de, D>(deserializer: D) -> Result<Option<Vec<String>>, D::Error>
where
D: Deserializer<'de>,
{
#[derive(Deserialize)]
#[serde(untagged)]
enum StringOrVec {
String(String),
Vec(Vec<String>),
}
let value = Option::<StringOrVec>::deserialize(deserializer)?;
match value {
Some(StringOrVec::String(s)) => Ok(Some(vec![s])),
Some(StringOrVec::Vec(v)) => Ok(Some(v)),
None => Ok(None),
}
}
#[derive(Debug, Deserialize, Serialize)] #[derive(Debug, Deserialize, Serialize)]
pub struct WorkflowDefinition { pub struct WorkflowDefinition {
pub name: String, pub name: String,
@@ -38,8 +58,8 @@ pub struct WorkflowDefinition {
#[derive(Debug, Deserialize, Serialize)] #[derive(Debug, Deserialize, Serialize)]
pub struct Job { pub struct Job {
#[serde(rename = "runs-on")] #[serde(rename = "runs-on", default, deserialize_with = "deserialize_runs_on")]
pub runs_on: Option<String>, pub runs_on: Option<Vec<String>>,
#[serde(default, deserialize_with = "deserialize_needs")] #[serde(default, deserialize_with = "deserialize_needs")]
pub needs: Option<Vec<String>>, pub needs: Option<Vec<String>>,
#[serde(default)] #[serde(default)]

View File

@@ -0,0 +1,18 @@
name: Test Runs-On Array Format
on: [push]
jobs:
test-array-runs-on:
timeout-minutes: 15
runs-on: [self-hosted, ubuntu, small]
steps:
- name: Test step
run: echo "Testing array format for runs-on"
test-string-runs-on:
timeout-minutes: 15
runs-on: ubuntu-latest
steps:
- name: Test step
run: echo "Testing string format for runs-on"