forgejo-runner

git clone git://git.lin.moe/forgejo-runner.git

 1// Copyright 2023 The Gitea Authors. All rights reserved.
 2// SPDX-License-Identifier: MIT
 3
 4package run
 5
 6import (
 7	"bytes"
 8	"fmt"
 9	"sort"
10	"strings"
11
12	runnerv1 "code.gitea.io/actions-proto-go/runner/v1"
13	"github.com/nektos/act/pkg/model"
14	"gopkg.in/yaml.v3"
15)
16
17func generateWorkflow(task *runnerv1.Task) (*model.Workflow, string, error) {
18	workflow, err := model.ReadWorkflow(bytes.NewReader(task.WorkflowPayload))
19	if err != nil {
20		return nil, "", err
21	}
22
23	jobIDs := workflow.GetJobIDs()
24	if len(jobIDs) != 1 {
25		return nil, "", fmt.Errorf("multiple jobs found: %v", jobIDs)
26	}
27	jobID := jobIDs[0]
28
29	needJobIDs := make([]string, 0, len(task.Needs))
30	for id, need := range task.Needs {
31		needJobIDs = append(needJobIDs, id)
32		needJob := &model.Job{
33			Outputs: need.Outputs,
34			Result:  strings.ToLower(strings.TrimPrefix(need.Result.String(), "RESULT_")),
35		}
36		workflow.Jobs[id] = needJob
37	}
38	sort.Strings(needJobIDs)
39
40	rawNeeds := yaml.Node{
41		Kind:    yaml.SequenceNode,
42		Content: make([]*yaml.Node, 0, len(needJobIDs)),
43	}
44	for _, id := range needJobIDs {
45		rawNeeds.Content = append(rawNeeds.Content, &yaml.Node{
46			Kind:  yaml.ScalarNode,
47			Value: id,
48		})
49	}
50
51	workflow.Jobs[jobID].RawNeeds = rawNeeds
52
53	return workflow, jobID, nil
54}