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 <wolfogre@noreply.gitea.com>
Reviewed-by: Lunny Xiao <xiaolunwen@gmail.com>
Co-authored-by: Zettat123 <zettat123@gmail.com>
Co-committed-by: Zettat123 <zettat123@gmail.com>
This commit is contained in:
Zettat123
2024-09-24 06:52:45 +00:00
committed by Jason Song
parent 6a090f67e5
commit 2ab806053c
3 changed files with 39 additions and 1 deletions

View File

@@ -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"

View File

@@ -185,6 +185,8 @@ func NewReusableWorkflowRunner(rc *RunContext) (Runner, error) {
eventJSON: rc.EventJSON,
caller: &caller{
runContext: rc,
reusedWorkflowJobResults: map[string]string{}, // For Gitea
},
}

View File

@@ -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 {