mirror of
https://github.com/bahdotsh/wrkflw.git
synced 2025-12-16 11:47:45 +01:00
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:
@@ -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)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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(),
|
||||||
|
|||||||
@@ -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)]
|
||||||
|
|||||||
18
tests/workflows/runs-on-array-test.yml
Normal file
18
tests/workflows/runs-on-array-test.yml
Normal 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"
|
||||||
Reference in New Issue
Block a user