@@ -8,79 +8,92 @@ import (
8
8
"fmt"
9
9
10
10
actions_model "code.gitea.io/gitea/models/actions"
11
+ "code.gitea.io/gitea/models/db"
11
12
secret_model "code.gitea.io/gitea/models/secret"
12
- "code.gitea.io/gitea/modules/log"
13
- "code.gitea.io/gitea/services/actions"
13
+ actions_service "code.gitea.io/gitea/services/actions"
14
14
15
15
runnerv1 "code.gitea.io/actions-proto-go/runner/v1"
16
16
"google.golang.org/protobuf/types/known/structpb"
17
17
)
18
18
19
19
func pickTask (ctx context.Context , runner * actions_model.ActionRunner ) (* runnerv1.Task , bool , error ) {
20
- t , ok , err := actions_model .CreateTaskForRunner (ctx , runner )
21
- if err != nil {
22
- return nil , false , fmt .Errorf ("CreateTaskForRunner: %w" , err )
23
- }
24
- if ! ok {
25
- return nil , false , nil
26
- }
20
+ var (
21
+ task * runnerv1.Task
22
+ job * actions_model.ActionRunJob
23
+ )
24
+
25
+ if err := db .WithTx (ctx , func (ctx context.Context ) error {
26
+ t , ok , err := actions_model .CreateTaskForRunner (ctx , runner )
27
+ if err != nil {
28
+ return fmt .Errorf ("CreateTaskForRunner: %w" , err )
29
+ }
30
+ if ! ok {
31
+ return nil
32
+ }
27
33
28
- secrets , err := secret_model . GetSecretsOfTask (ctx , t )
29
- if err != nil {
30
- return nil , false , fmt . Errorf ( "GetSecretsOfTask: %w" , err )
31
- }
34
+ if err := t . LoadAttributes (ctx ); err != nil {
35
+ return fmt . Errorf ( "task LoadAttributes: %w" , err )
36
+ }
37
+ job = t . Job
32
38
33
- vars , err := actions_model .GetVariablesOfRun (ctx , t .Job .Run )
34
- if err != nil {
35
- return nil , false , fmt .Errorf ("GetVariablesOfRun: %w" , err )
36
- }
39
+ secrets , err := secret_model .GetSecretsOfTask (ctx , t )
40
+ if err != nil {
41
+ return fmt .Errorf ("GetSecretsOfTask: %w" , err )
42
+ }
43
+
44
+ vars , err := actions_model .GetVariablesOfRun (ctx , t .Job .Run )
45
+ if err != nil {
46
+ return fmt .Errorf ("GetVariablesOfRun: %w" , err )
47
+ }
48
+
49
+ needs , err := findTaskNeeds (ctx , job )
50
+ if err != nil {
51
+ return fmt .Errorf ("findTaskNeeds: %w" , err )
52
+ }
37
53
38
- actions .CreateCommitStatus (ctx , t .Job )
54
+ taskContext , err := generateTaskContext (t )
55
+ if err != nil {
56
+ return fmt .Errorf ("generateTaskContext: %w" , err )
57
+ }
39
58
40
- task := & runnerv1.Task {
41
- Id : t .ID ,
42
- WorkflowPayload : t .Job .WorkflowPayload ,
43
- Context : generateTaskContext (t ),
44
- Secrets : secrets ,
45
- Vars : vars ,
59
+ task = & runnerv1.Task {
60
+ Id : t .ID ,
61
+ WorkflowPayload : t .Job .WorkflowPayload ,
62
+ Context : taskContext ,
63
+ Secrets : secrets ,
64
+ Vars : vars ,
65
+ Needs : needs ,
66
+ }
67
+
68
+ return nil
69
+ }); err != nil {
70
+ return nil , false , err
46
71
}
47
72
48
- if needs , err := findTaskNeeds (ctx , t ); err != nil {
49
- log .Error ("Cannot find needs for task %v: %v" , t .ID , err )
50
- // Go on with empty needs.
51
- // If return error, the task will be wild, which means the runner will never get it when it has been assigned to the runner.
52
- // In contrast, missing needs is less serious.
53
- // And the task will fail and the runner will report the error in the logs.
54
- } else {
55
- task .Needs = needs
73
+ if task == nil {
74
+ return nil , false , nil
56
75
}
57
76
77
+ actions_service .CreateCommitStatus (ctx , job )
78
+
58
79
return task , true , nil
59
80
}
60
81
61
- func generateTaskContext (t * actions_model.ActionTask ) * structpb.Struct {
62
- giteaRuntimeToken , err := actions .CreateAuthorizationToken (t .ID , t .Job .RunID , t .JobID )
82
+ func generateTaskContext (t * actions_model.ActionTask ) ( * structpb.Struct , error ) {
83
+ giteaRuntimeToken , err := actions_service .CreateAuthorizationToken (t .ID , t .Job .RunID , t .JobID )
63
84
if err != nil {
64
- log . Error ( "actions.CreateAuthorizationToken failed: %v" , err )
85
+ return nil , err
65
86
}
66
87
67
- gitCtx := actions .GenerateGiteaContext (t .Job .Run , t .Job )
88
+ gitCtx := actions_service .GenerateGiteaContext (t .Job .Run , t .Job )
68
89
gitCtx ["token" ] = t .Token
69
90
gitCtx ["gitea_runtime_token" ] = giteaRuntimeToken
70
91
71
- taskContext , err := structpb .NewStruct (gitCtx )
72
- if err != nil {
73
- log .Error ("structpb.NewStruct failed: %v" , err )
74
- }
75
-
76
- return taskContext
92
+ return structpb .NewStruct (gitCtx )
77
93
}
78
94
79
- func findTaskNeeds (ctx context.Context , task * actions_model.ActionTask ) (map [string ]* runnerv1.TaskNeed , error ) {
80
- if err := task .LoadAttributes (ctx ); err != nil {
81
- return nil , fmt .Errorf ("task LoadAttributes: %w" , err )
82
- }
83
- taskNeeds , err := actions .FindTaskNeeds (ctx , task .Job )
95
+ func findTaskNeeds (ctx context.Context , taskJob * actions_model.ActionRunJob ) (map [string ]* runnerv1.TaskNeed , error ) {
96
+ taskNeeds , err := actions_service .FindTaskNeeds (ctx , taskJob )
84
97
if err != nil {
85
98
return nil , err
86
99
}
0 commit comments