|
| 1 | +// Copyright 2022 The Gitea Authors. All rights reserved. |
| 2 | +// SPDX-License-Identifier: MIT |
| 3 | + |
| 4 | +package actions |
| 5 | + |
| 6 | +import ( |
| 7 | + "context" |
| 8 | + "fmt" |
| 9 | + |
| 10 | + actions_model "code.gitea.io/gitea/models/actions" |
| 11 | + "code.gitea.io/gitea/models/db" |
| 12 | + secret_model "code.gitea.io/gitea/models/secret" |
| 13 | + |
| 14 | + runnerv1 "code.gitea.io/actions-proto-go/runner/v1" |
| 15 | + "google.golang.org/protobuf/types/known/structpb" |
| 16 | +) |
| 17 | + |
| 18 | +func PickTask(ctx context.Context, runner *actions_model.ActionRunner) (*runnerv1.Task, bool, error) { |
| 19 | + var ( |
| 20 | + task *runnerv1.Task |
| 21 | + job *actions_model.ActionRunJob |
| 22 | + ) |
| 23 | + |
| 24 | + if err := db.WithTx(ctx, func(ctx context.Context) error { |
| 25 | + t, ok, err := actions_model.CreateTaskForRunner(ctx, runner) |
| 26 | + if err != nil { |
| 27 | + return fmt.Errorf("CreateTaskForRunner: %w", err) |
| 28 | + } |
| 29 | + if !ok { |
| 30 | + return nil |
| 31 | + } |
| 32 | + |
| 33 | + if err := t.LoadAttributes(ctx); err != nil { |
| 34 | + return fmt.Errorf("task LoadAttributes: %w", err) |
| 35 | + } |
| 36 | + job = t.Job |
| 37 | + |
| 38 | + secrets, err := secret_model.GetSecretsOfTask(ctx, t) |
| 39 | + if err != nil { |
| 40 | + return fmt.Errorf("GetSecretsOfTask: %w", err) |
| 41 | + } |
| 42 | + |
| 43 | + vars, err := actions_model.GetVariablesOfRun(ctx, t.Job.Run) |
| 44 | + if err != nil { |
| 45 | + return fmt.Errorf("GetVariablesOfRun: %w", err) |
| 46 | + } |
| 47 | + |
| 48 | + needs, err := findTaskNeeds(ctx, job) |
| 49 | + if err != nil { |
| 50 | + return fmt.Errorf("findTaskNeeds: %w", err) |
| 51 | + } |
| 52 | + |
| 53 | + taskContext, err := generateTaskContext(t) |
| 54 | + if err != nil { |
| 55 | + return fmt.Errorf("generateTaskContext: %w", err) |
| 56 | + } |
| 57 | + |
| 58 | + task = &runnerv1.Task{ |
| 59 | + Id: t.ID, |
| 60 | + WorkflowPayload: t.Job.WorkflowPayload, |
| 61 | + Context: taskContext, |
| 62 | + Secrets: secrets, |
| 63 | + Vars: vars, |
| 64 | + Needs: needs, |
| 65 | + } |
| 66 | + |
| 67 | + return nil |
| 68 | + }); err != nil { |
| 69 | + return nil, false, err |
| 70 | + } |
| 71 | + |
| 72 | + if task == nil { |
| 73 | + return nil, false, nil |
| 74 | + } |
| 75 | + |
| 76 | + CreateCommitStatus(ctx, job) |
| 77 | + |
| 78 | + return task, true, nil |
| 79 | +} |
| 80 | + |
| 81 | +func generateTaskContext(t *actions_model.ActionTask) (*structpb.Struct, error) { |
| 82 | + giteaRuntimeToken, err := CreateAuthorizationToken(t.ID, t.Job.RunID, t.JobID) |
| 83 | + if err != nil { |
| 84 | + return nil, err |
| 85 | + } |
| 86 | + |
| 87 | + gitCtx := GenerateGiteaContext(t.Job.Run, t.Job) |
| 88 | + gitCtx["token"] = t.Token |
| 89 | + gitCtx["gitea_runtime_token"] = giteaRuntimeToken |
| 90 | + |
| 91 | + return structpb.NewStruct(gitCtx) |
| 92 | +} |
| 93 | + |
| 94 | +func findTaskNeeds(ctx context.Context, taskJob *actions_model.ActionRunJob) (map[string]*runnerv1.TaskNeed, error) { |
| 95 | + taskNeeds, err := FindTaskNeeds(ctx, taskJob) |
| 96 | + if err != nil { |
| 97 | + return nil, err |
| 98 | + } |
| 99 | + ret := make(map[string]*runnerv1.TaskNeed, len(taskNeeds)) |
| 100 | + for jobID, taskNeed := range taskNeeds { |
| 101 | + ret[jobID] = &runnerv1.TaskNeed{ |
| 102 | + Outputs: taskNeed.Outputs, |
| 103 | + Result: runnerv1.Result(taskNeed.Result), |
| 104 | + } |
| 105 | + } |
| 106 | + return ret, nil |
| 107 | +} |
0 commit comments