44package actions
55
66import (
7+ "bytes"
78 "net/http"
89
910 actions_model "code.gitea.io/gitea/models/actions"
1011 "code.gitea.io/gitea/models/db"
1112 "code.gitea.io/gitea/models/unit"
1213 "code.gitea.io/gitea/modules/actions"
1314 "code.gitea.io/gitea/modules/base"
15+ "code.gitea.io/gitea/modules/container"
1416 "code.gitea.io/gitea/modules/context"
1517 "code.gitea.io/gitea/modules/git"
1618 "code.gitea.io/gitea/modules/setting"
1719 "code.gitea.io/gitea/modules/util"
1820 "code.gitea.io/gitea/services/convert"
21+
22+ "github.com/nektos/act/pkg/model"
1923)
2024
2125const (
@@ -24,9 +28,8 @@ const (
2428)
2529
2630type Workflow struct {
27- Entry git.TreeEntry
28- IsInvalid bool
29- ErrMsg string
31+ Entry git.TreeEntry
32+ ErrMsg string
3033}
3134
3235// MustEnableActions check if actions are enabled in settings
@@ -73,6 +76,23 @@ func List(ctx *context.Context) {
7376 ctx .Error (http .StatusInternalServerError , err .Error ())
7477 return
7578 }
79+
80+ // Get all runner labels
81+ opts := actions_model.FindRunnerOptions {
82+ RepoID : ctx .Repo .Repository .ID ,
83+ WithAvailable : true ,
84+ }
85+ runners , err := actions_model .FindRunners (ctx , opts )
86+ if err != nil {
87+ ctx .ServerError ("FindRunners" , err )
88+ return
89+ }
90+ allRunnerLabels := make (container.Set [string ])
91+ for _ , r := range runners {
92+ allRunnerLabels .AddMultiple (r .AgentLabels ... )
93+ allRunnerLabels .AddMultiple (r .CustomLabels ... )
94+ }
95+
7696 workflows = make ([]Workflow , 0 , len (entries ))
7797 for _ , entry := range entries {
7898 workflow := Workflow {Entry : * entry }
@@ -81,10 +101,24 @@ func List(ctx *context.Context) {
81101 ctx .Error (http .StatusInternalServerError , err .Error ())
82102 return
83103 }
84- _ , err = actions . GetEventsFromContent ( content )
104+ wf , err := model . ReadWorkflow ( bytes . NewReader ( content ) )
85105 if err != nil {
86- workflow .IsInvalid = true
87- workflow .ErrMsg = err .Error ()
106+ workflow .ErrMsg = ctx .Locale .Tr ("actions.runs.invalid_workflow_helper" , err .Error ())
107+ workflows = append (workflows , workflow )
108+ continue
109+ }
110+ // Check whether have matching runner
111+ for _ , j := range wf .Jobs {
112+ runsOnList := j .RunsOn ()
113+ for _ , ro := range runsOnList {
114+ if ! allRunnerLabels .Contains (ro ) {
115+ workflow .ErrMsg = ctx .Locale .Tr ("actions.runs.no_matching_runner_helper" , ro )
116+ break
117+ }
118+ }
119+ if workflow .ErrMsg != "" {
120+ break
121+ }
88122 }
89123 workflows = append (workflows , workflow )
90124 }
0 commit comments