{"record":{"id":"5d21a497127a6246","repo":"nektos/act","slug":"job-s-failed","errorCode":null,"errorMessage":"Job '%s' failed","messagePattern":"Job '(.+?)' failed","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"pkg/runner/runner.go","lineNumber":226,"sourceCode":"\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t\tpipeline = append(pipeline, common.NewParallelExecutor(maxParallel, stageExecutor...))\n\t\t\t}\n\n\t\t\tlog.Debugf(\"PlanExecutor concurrency: %d\", runner.config.GetConcurrentJobs())\n\t\t\treturn common.NewParallelExecutor(runner.config.GetConcurrentJobs(), pipeline...)(ctx)\n\t\t})\n\t}\n\n\treturn common.NewPipelineExecutor(stagePipeline...).Then(handleFailure(plan))\n}\n\nfunc handleFailure(plan *model.Plan) common.Executor {\n\treturn func(_ context.Context) error {\n\t\tfor _, stage := range plan.Stages {\n\t\t\tfor _, run := range stage.Runs {\n\t\t\t\tif run.Job().Result == \"failure\" {\n\t\t\t\t\treturn fmt.Errorf(\"Job '%s' failed\", run.String())\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn nil\n\t}\n}\n\nfunc selectMatrixes(originalMatrixes []map[string]interface{}, targetMatrixValues map[string]map[string]bool) []map[string]interface{} {\n\tmatrixes := make([]map[string]interface{}, 0)\n\tfor _, original := range originalMatrixes {\n\t\tflag := true\n\t\tfor key, val := range original {\n\t\t\tif allowedVals, ok := targetMatrixValues[key]; ok {\n\t\t\t\tvalToString := fmt.Sprintf(\"%v\", val)\n\t\t\t\tif _, ok := allowedVals[valToString]; !ok {\n\t\t\t\t\tflag = false\n\t\t\t\t}\n\t\t\t}","sourceCodeStart":208,"sourceCodeEnd":244,"githubUrl":"https://github.com/nektos/act/blob/4f411281417e88660bea1c1a1749aa71ae0bd60f/pkg/runner/runner.go#L208-L244","documentation":"Aggregate failure signal: after all stages of the plan ran, handleFailure walks every run and, if any job's Result is 'failure', returns this error naming the first failing job. It is how act converts an in-job failure into a top-level non-zero exit for the whole invocation.","triggerScenarios":"Any job step exited non-zero (with continue-on-error not set), a service container or job container failed to start, or any runner-level error marked the job result as 'failure' during execution of the plan.","commonSituations":"Expected outcome of a failing test/build inside a run step; a script step exiting with the code of the last failed command; upstream errors [160]-[169] marking the job failed; using act to reproduce a red CI job locally.","solutions":["Scroll up in act's output to the actual failing step — this error only names the job, the root cause is logged above it.","Re-run with `act -j <job>` to isolate the failing job, and `--verbose` for full logs.","Fix the underlying step (test failure, missing tool, bad script) — this wrapper error itself needs no fix.","For jobs that are allowed to fail, set `continue-on-error: true` or scope it with an `if:` condition."],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"err := runner.New(runner.NewConfig(...)).NewPlanExecutor(plan)(ctx)\nif err != nil {\n  if strings.Contains(err.Error(), \"failed\") {\n    // inspect plan.Stages[*].Runs[*].Job().Result to find which job and why\n  }\n}","preventionTips":["Treat this as a signal, not the cause: root cause is logged above.","Run act -j <jobname> to reproduce single failing jobs.","Use continue-on-error for jobs allowed to fail."],"tags":["job-failure","aggregate","exit-status","runner"],"backgroundTag":null,"analyzedSha":"4f411281417e88660bea1c1a1749aa71ae0bd60f","analyzedAt":"2026-08-15T09:19:46.307Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}