Skip to content

Commit 1656206

Browse files
Zettat123Jason Song
authored andcommitted
Improve the support for reusable workflows (#122)
Fix [#32439](go-gitea/gitea#32439) - Support reusable workflows with conditional jobs - Support nesting reusable workflows Reviewed-on: https://gitea.com/gitea/act/pulls/122 Reviewed-by: Lunny Xiao <[email protected]> Reviewed-by: Jason Song <[email protected]> Co-authored-by: Zettat123 <[email protected]> Co-committed-by: Zettat123 <[email protected]>
1 parent 6cdf1e5 commit 1656206

File tree

4 files changed

+71
-34
lines changed

4 files changed

+71
-34
lines changed

pkg/runner/job_executor.go

Lines changed: 1 addition & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -73,10 +73,6 @@ func newJobExecutor(info jobInfo, sf stepFactory, rc *RunContext) common.Executo
7373

7474
preExec := step.pre()
7575
preSteps = append(preSteps, useStepLogger(rc, stepModel, stepStagePre, func(ctx context.Context) error {
76-
if rc.caller != nil { // For Gitea
77-
rc.caller.reusedWorkflowJobResults[rc.JobName] = "pending"
78-
}
79-
8076
logger := common.Logger(ctx)
8177
preErr := preExec(ctx)
8278
if preErr != nil {
@@ -189,34 +185,7 @@ func setJobResult(ctx context.Context, info jobInfo, rc *RunContext, success boo
189185
info.result(jobResult)
190186
if rc.caller != nil {
191187
// set reusable workflow job result
192-
193-
rc.caller.updateResultLock.Lock()
194-
rc.caller.reusedWorkflowJobResults[rc.JobName] = jobResult
195-
196-
allJobDone := true
197-
hasFailure := false
198-
for _, result := range rc.caller.reusedWorkflowJobResults {
199-
if result == "pending" {
200-
allJobDone = false
201-
break
202-
}
203-
if result == "failure" {
204-
hasFailure = true
205-
}
206-
}
207-
208-
if allJobDone {
209-
reusedWorkflowJobResult := "success"
210-
reusedWorkflowJobResultMessage := "succeeded"
211-
if hasFailure {
212-
reusedWorkflowJobResult = "failure"
213-
reusedWorkflowJobResultMessage = "failed"
214-
}
215-
rc.caller.runContext.result(reusedWorkflowJobResult)
216-
logger.WithField("jobResult", reusedWorkflowJobResult).Infof("\U0001F3C1 Job %s", reusedWorkflowJobResultMessage)
217-
}
218-
219-
rc.caller.updateResultLock.Unlock()
188+
rc.caller.setReusedWorkflowJobResult(rc.JobName, jobResult) // For Gitea
220189
return
221190
}
222191

pkg/runner/reusable_workflow.go

Lines changed: 49 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,11 @@ func newReusableWorkflowExecutor(rc *RunContext, directory string, workflow stri
175175
return err
176176
}
177177

178-
return runner.NewPlanExecutor(plan)(ctx)
178+
// return runner.NewPlanExecutor(plan)(ctx)
179+
return common.NewPipelineExecutor( // For Gitea
180+
runner.NewPlanExecutor(plan),
181+
setReusedWorkflowCallerResult(rc, runner),
182+
)(ctx)
179183
}
180184
}
181185

@@ -271,3 +275,47 @@ func newRemoteReusableWorkflow(uses string) *remoteReusableWorkflow {
271275
URL: "https://github.com",
272276
}
273277
}
278+
279+
// For Gitea
280+
func setReusedWorkflowCallerResult(rc *RunContext, runner Runner) common.Executor {
281+
return func(ctx context.Context) error {
282+
logger := common.Logger(ctx)
283+
284+
runnerImpl, ok := runner.(*runnerImpl)
285+
if !ok {
286+
logger.Warn("Failed to get caller from runner")
287+
return nil
288+
}
289+
caller := runnerImpl.caller
290+
291+
allJobDone := true
292+
hasFailure := false
293+
for _, result := range caller.reusedWorkflowJobResults {
294+
if result == "pending" {
295+
allJobDone = false
296+
break
297+
}
298+
if result == "failure" {
299+
hasFailure = true
300+
}
301+
}
302+
303+
if allJobDone {
304+
reusedWorkflowJobResult := "success"
305+
reusedWorkflowJobResultMessage := "succeeded"
306+
if hasFailure {
307+
reusedWorkflowJobResult = "failure"
308+
reusedWorkflowJobResultMessage = "failed"
309+
}
310+
311+
if rc.caller != nil {
312+
rc.caller.setReusedWorkflowJobResult(rc.JobName, reusedWorkflowJobResult)
313+
} else {
314+
rc.result(reusedWorkflowJobResult)
315+
logger.WithField("jobResult", reusedWorkflowJobResult).Infof("\U0001F3C1 Job %s", reusedWorkflowJobResultMessage)
316+
}
317+
}
318+
319+
return nil
320+
}
321+
}

pkg/runner/run_context.go

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,12 @@ func (rc *RunContext) GetEnv() map[string]string {
9292
}
9393

9494
func (rc *RunContext) jobContainerName() string {
95-
return createSimpleContainerName(rc.Config.ContainerNamePrefix, "WORKFLOW-"+rc.Run.Workflow.Name, "JOB-"+rc.Name)
95+
nameParts := []string{rc.Config.ContainerNamePrefix, "WORKFLOW-" + rc.Run.Workflow.Name, "JOB-" + rc.Name}
96+
if rc.caller != nil {
97+
nameParts = append(nameParts, "CALLED-BY-"+rc.caller.runContext.JobName)
98+
}
99+
// return createSimpleContainerName(rc.Config.ContainerNamePrefix, "WORKFLOW-"+rc.Run.Workflow.Name, "JOB-"+rc.Name)
100+
return createSimpleContainerName(nameParts...) // For Gitea
96101
}
97102

98103
// Deprecated: use `networkNameForGitea`
@@ -653,6 +658,7 @@ func (rc *RunContext) Executor() (common.Executor, error) {
653658
return func(ctx context.Context) error {
654659
res, err := rc.isEnabled(ctx)
655660
if err != nil {
661+
rc.caller.setReusedWorkflowJobResult(rc.JobName, "failure") // For Gitea
656662
return err
657663
}
658664
if res {
@@ -748,6 +754,10 @@ func (rc *RunContext) isEnabled(ctx context.Context) (bool, error) {
748754
}
749755

750756
if !runJob {
757+
if rc.caller != nil { // For Gitea
758+
rc.caller.setReusedWorkflowJobResult(rc.JobName, "skipped")
759+
return false, nil
760+
}
751761
l.WithField("jobResult", "skipped").Debugf("Skipping job '%s' due to '%s'", job.Name, job.If.Value)
752762
return false, nil
753763
}

pkg/runner/runner.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,9 @@ func (runner *runnerImpl) NewPlanExecutor(plan *model.Plan) common.Executor {
210210
if len(rc.String()) > maxJobNameLen {
211211
maxJobNameLen = len(rc.String())
212212
}
213+
if rc.caller != nil { // For Gitea
214+
rc.caller.setReusedWorkflowJobResult(rc.JobName, "pending")
215+
}
213216
stageExecutor = append(stageExecutor, func(ctx context.Context) error {
214217
jobName := fmt.Sprintf("%-*s", maxJobNameLen, rc.String())
215218
executor, err := rc.Executor()
@@ -281,3 +284,10 @@ func (runner *runnerImpl) newRunContext(ctx context.Context, run *model.Run, mat
281284

282285
return rc
283286
}
287+
288+
// For Gitea
289+
func (c *caller) setReusedWorkflowJobResult(jobName string, result string) {
290+
c.updateResultLock.Lock()
291+
defer c.updateResultLock.Unlock()
292+
c.reusedWorkflowJobResults[jobName] = result
293+
}

0 commit comments

Comments
 (0)