From 2ab806053cb1e38fa7a5e662d8e702ceba6ca851 Mon Sep 17 00:00:00 2001 From: Zettat123 Date: Tue, 24 Sep 2024 06:52:45 +0000 Subject: [PATCH] Check all job results when calling reusable workflows (#116) Fix [#31900](https://github.com/go-gitea/gitea/issues/31900) Reviewed-on: https://gitea.com/gitea/act/pulls/116 Reviewed-by: Jason Song Reviewed-by: Lunny Xiao Co-authored-by: Zettat123 Co-committed-by: Zettat123 --- pkg/runner/job_executor.go | 34 ++++++++++++++++++++++++++++++++- pkg/runner/reusable_workflow.go | 2 ++ pkg/runner/runner.go | 4 ++++ 3 files changed, 39 insertions(+), 1 deletion(-) diff --git a/pkg/runner/job_executor.go b/pkg/runner/job_executor.go index 6b4ae7f..c00e4b9 100644 --- a/pkg/runner/job_executor.go +++ b/pkg/runner/job_executor.go @@ -73,6 +73,10 @@ func newJobExecutor(info jobInfo, sf stepFactory, rc *RunContext) common.Executo preExec := step.pre() preSteps = append(preSteps, useStepLogger(rc, stepModel, stepStagePre, func(ctx context.Context) error { + if rc.caller != nil { // For Gitea + rc.caller.reusedWorkflowJobResults[rc.JobName] = "pending" + } + logger := common.Logger(ctx) preErr := preExec(ctx) if preErr != nil { @@ -185,7 +189,35 @@ func setJobResult(ctx context.Context, info jobInfo, rc *RunContext, success boo info.result(jobResult) if rc.caller != nil { // set reusable workflow job result - rc.caller.runContext.result(jobResult) + + rc.caller.updateResultLock.Lock() + rc.caller.reusedWorkflowJobResults[rc.JobName] = jobResult + + allJobDone := true + hasFailure := false + for _, result := range rc.caller.reusedWorkflowJobResults { + if result == "pending" { + allJobDone = false + break + } + if result == "failure" { + hasFailure = true + } + } + + if allJobDone { + reusedWorkflowJobResult := "success" + reusedWorkflowJobResultMessage := "succeeded" + if hasFailure { + reusedWorkflowJobResult = "failure" + reusedWorkflowJobResultMessage = "failed" + } + rc.caller.runContext.result(reusedWorkflowJobResult) + logger.WithField("jobResult", reusedWorkflowJobResult).Infof("\U0001F3C1 Job %s", reusedWorkflowJobResultMessage) + } + + rc.caller.updateResultLock.Unlock() + return } jobResultMessage := "succeeded" diff --git a/pkg/runner/reusable_workflow.go b/pkg/runner/reusable_workflow.go index a40979b..28a45b2 100644 --- a/pkg/runner/reusable_workflow.go +++ b/pkg/runner/reusable_workflow.go @@ -185,6 +185,8 @@ func NewReusableWorkflowRunner(rc *RunContext) (Runner, error) { eventJSON: rc.EventJSON, caller: &caller{ runContext: rc, + + reusedWorkflowJobResults: map[string]string{}, // For Gitea }, } diff --git a/pkg/runner/runner.go b/pkg/runner/runner.go index b08e715..01cb5e6 100644 --- a/pkg/runner/runner.go +++ b/pkg/runner/runner.go @@ -6,6 +6,7 @@ import ( "fmt" "os" "runtime" + "sync" "time" docker_container "github.com/docker/docker/api/types/container" @@ -86,6 +87,9 @@ func (c Config) GetToken() string { type caller struct { runContext *RunContext + + updateResultLock sync.Mutex // For Gitea + reusedWorkflowJobResults map[string]string // For Gitea } type runnerImpl struct {