fix: use the happy path for workflow_call (#88)

* not really supported mode
This commit is contained in:
ChristopherHX
2025-04-25 19:56:07 +02:00
committed by GitHub
parent b3cd631d23
commit 4be22e9b76
6 changed files with 49 additions and 26 deletions

View File

@@ -663,7 +663,36 @@ func newRunCommand(ctx context.Context, input *Input) func(*cobra.Command, []str
}
}
r, err := runner.New(config)
var r runner.Runner
if eventName == "workflow_call" {
// Do not use the totally broken code and instead craft a fake caller
convertedInputs := make(map[string]interface{})
for k, v := range inputs {
var raw interface{}
if err := yaml.Unmarshal([]byte(v), &raw); err != nil {
return fmt.Errorf("failed to unmarshal input %s: %w", k, err)
}
convertedInputs[k] = raw
}
r, err = runner.NewReusableWorkflowRunner(&runner.RunContext{
Config: config,
Name: "_",
JobName: "_",
Run: &model.Run{
JobID: "_",
Workflow: &model.Workflow{
Jobs: map[string]*model.Job{
"_": {
Name: "_",
With: convertedInputs,
},
},
},
},
})
} else {
r, err = runner.New(config)
}
if err != nil {
return err
}

View File

@@ -82,3 +82,14 @@ func TestFlags(t *testing.T) {
})
}
}
func TestWorkflowCall(t *testing.T) {
rootCmd := createRootCommand(context.Background(), &Input{}, "")
err := newRunCommand(context.Background(), &Input{
platforms: []string{"ubuntu-latest=node:16-buster-slim"},
workdir: "../pkg/runner/testdata/",
workflowsPath: "./workflow_call_inputs/workflow_call_inputs.yml",
inputs: []string{"required=required input", "boolean=true"},
})(rootCmd, []string{"workflow_call"})
assert.NoError(t, err)
}

View File

@@ -514,24 +514,6 @@ func getEvaluatorInputs(ctx context.Context, rc *RunContext, step step, ghc *mod
}
}
if ghc.EventName == "workflow_call" {
config := rc.Run.Workflow.WorkflowCallConfig()
if config != nil && config.Inputs != nil {
for k, v := range config.Inputs {
value := nestedMapLookup(ghc.Event, "inputs", k)
if value == nil {
if err := v.Default.Decode(&value); err != nil {
common.Logger(ctx).Debugf("error decoding default value for %s: %v", k, err)
}
}
if v.Type == "boolean" {
inputs[k] = value == "true"
} else {
inputs[k] = value
}
}
}
}
return inputs
}

View File

@@ -303,7 +303,6 @@ func TestRunEvent(t *testing.T) {
{workdir, "docker-action-custom-path", "push", "", platforms, secrets},
{workdir, "GITHUB_ENV-use-in-env-ctx", "push", "", platforms, secrets},
{workdir, "ensure-post-steps", "push", "Job 'second-post-step-should-fail' failed", platforms, secrets},
{workdir, "workflow_call_inputs", "workflow_call", "", platforms, secrets},
{workdir, "workflow_dispatch", "workflow_dispatch", "", platforms, secrets},
{workdir, "workflow_dispatch_no_inputs_mapping", "workflow_dispatch", "", platforms, secrets},
{workdir, "workflow_dispatch-scalar", "workflow_dispatch", "", platforms, secrets},

View File

@@ -1,6 +0,0 @@
{
"inputs": {
"required": "required input",
"boolean": "true"
}
}

View File

@@ -10,6 +10,10 @@ on:
description: an input with default
required: false
default: default
with_default2:
description: an input with default
required: false
default: ${{ github.event_name }}
boolean:
description: an input of type boolean
required: false
@@ -27,6 +31,10 @@ jobs:
run: |
echo input.with_default=${{ inputs.with_default }}
[[ "${{ inputs.with_default }}" = "default" ]] || exit 1
- name: test input with default2
run: |
echo input.with_default2=${{ inputs.with_default2 }}
[[ "${{ inputs.with_default2 }}" = "workflow_call" ]] || exit 1
- id: boolean-test
name: run on boolean input
if: ${{ inputs.boolean == true }}