mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-10-31 10:56:10 +01:00 
			
		
		
		
	Refactor ActionRunJob parsing into a reusable function (#35623)
Use a helper method around the jobparser for parsing a single job structure from an ActionRunJob --------- Co-authored-by: wxiaoguang <wxiaoguang@gmail.com>
This commit is contained in:
		| @@ -14,6 +14,7 @@ import ( | |||||||
| 	"code.gitea.io/gitea/modules/timeutil" | 	"code.gitea.io/gitea/modules/timeutil" | ||||||
| 	"code.gitea.io/gitea/modules/util" | 	"code.gitea.io/gitea/modules/util" | ||||||
|  |  | ||||||
|  | 	"github.com/nektos/act/pkg/jobparser" | ||||||
| 	"xorm.io/builder" | 	"xorm.io/builder" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| @@ -99,6 +100,24 @@ func (job *ActionRunJob) LoadAttributes(ctx context.Context) error { | |||||||
| 	return job.Run.LoadAttributes(ctx) | 	return job.Run.LoadAttributes(ctx) | ||||||
| } | } | ||||||
|  |  | ||||||
|  | // ParseJob parses the job structure from the ActionRunJob.WorkflowPayload | ||||||
|  | func (job *ActionRunJob) ParseJob() (*jobparser.Job, error) { | ||||||
|  | 	// job.WorkflowPayload is a SingleWorkflow created from an ActionRun's workflow, which exactly contains this job's YAML definition. | ||||||
|  | 	// Ideally it shouldn't be called "Workflow", it is just a job with global workflow fields + trigger | ||||||
|  | 	parsedWorkflows, err := jobparser.Parse(job.WorkflowPayload) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, fmt.Errorf("job %d single workflow: unable to parse: %w", job.ID, err) | ||||||
|  | 	} else if len(parsedWorkflows) != 1 { | ||||||
|  | 		return nil, fmt.Errorf("job %d single workflow: not single workflow", job.ID) | ||||||
|  | 	} | ||||||
|  | 	_, workflowJob := parsedWorkflows[0].Job() | ||||||
|  | 	if workflowJob == nil { | ||||||
|  | 		// it shouldn't happen, and since the callers don't check nil, so return an error instead of nil | ||||||
|  | 		return nil, util.ErrorWrap(util.ErrNotExist, "job %d single workflow: payload doesn't contain a job", job.ID) | ||||||
|  | 	} | ||||||
|  | 	return workflowJob, nil | ||||||
|  | } | ||||||
|  |  | ||||||
| func GetRunJobByID(ctx context.Context, id int64) (*ActionRunJob, error) { | func GetRunJobByID(ctx context.Context, id int64) (*ActionRunJob, error) { | ||||||
| 	var job ActionRunJob | 	var job ActionRunJob | ||||||
| 	has, err := db.GetEngine(ctx).Where("id=?", id).Get(&job) | 	has, err := db.GetEngine(ctx).Where("id=?", id).Get(&job) | ||||||
|   | |||||||
| @@ -21,7 +21,6 @@ import ( | |||||||
|  |  | ||||||
| 	runnerv1 "code.gitea.io/actions-proto-go/runner/v1" | 	runnerv1 "code.gitea.io/actions-proto-go/runner/v1" | ||||||
| 	lru "github.com/hashicorp/golang-lru/v2" | 	lru "github.com/hashicorp/golang-lru/v2" | ||||||
| 	"github.com/nektos/act/pkg/jobparser" |  | ||||||
| 	"google.golang.org/protobuf/types/known/timestamppb" | 	"google.golang.org/protobuf/types/known/timestamppb" | ||||||
| 	"xorm.io/builder" | 	"xorm.io/builder" | ||||||
| ) | ) | ||||||
| @@ -278,13 +277,10 @@ func CreateTaskForRunner(ctx context.Context, runner *ActionRunner) (*ActionTask | |||||||
| 		return nil, false, err | 		return nil, false, err | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	parsedWorkflows, err := jobparser.Parse(job.WorkflowPayload) | 	workflowJob, err := job.ParseJob() | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, false, fmt.Errorf("parse workflow of job %d: %w", job.ID, err) | 		return nil, false, fmt.Errorf("load job %d: %w", job.ID, err) | ||||||
| 	} else if len(parsedWorkflows) != 1 { |  | ||||||
| 		return nil, false, fmt.Errorf("workflow of job %d: not single workflow", job.ID) |  | ||||||
| 	} | 	} | ||||||
| 	_, workflowJob := parsedWorkflows[0].Job() |  | ||||||
|  |  | ||||||
| 	if _, err := e.Insert(task); err != nil { | 	if _, err := e.Insert(task); err != nil { | ||||||
| 		return nil, false, err | 		return nil, false, err | ||||||
|   | |||||||
| @@ -5,7 +5,6 @@ package actions | |||||||
|  |  | ||||||
| import ( | import ( | ||||||
| 	"context" | 	"context" | ||||||
| 	"errors" |  | ||||||
| 	"fmt" | 	"fmt" | ||||||
|  |  | ||||||
| 	actions_model "code.gitea.io/gitea/models/actions" | 	actions_model "code.gitea.io/gitea/models/actions" | ||||||
| @@ -91,17 +90,12 @@ func EvaluateJobConcurrencyFillModel(ctx context.Context, run *actions_model.Act | |||||||
| 		return fmt.Errorf("get inputs: %w", err) | 		return fmt.Errorf("get inputs: %w", err) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	// singleWorkflows is created from an ActionJob, which always contains exactly a single job's YAML definition. | 	workflowJob, err := actionRunJob.ParseJob() | ||||||
| 	// Ideally it shouldn't be called "Workflow", it is just a job with global workflow fields + trigger |  | ||||||
| 	singleWorkflows, err := jobparser.Parse(actionRunJob.WorkflowPayload) |  | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return fmt.Errorf("parse single workflow: %w", err) | 		return fmt.Errorf("load job %d: %w", actionRunJob.ID, err) | ||||||
| 	} else if len(singleWorkflows) != 1 { |  | ||||||
| 		return errors.New("not single workflow") |  | ||||||
| 	} | 	} | ||||||
| 	_, singleWorkflowJob := singleWorkflows[0].Job() |  | ||||||
|  |  | ||||||
| 	actionRunJob.ConcurrencyGroup, actionRunJob.ConcurrencyCancel, err = jobparser.EvaluateConcurrency(&rawConcurrency, actionRunJob.JobID, singleWorkflowJob, actionsJobCtx, jobResults, vars, inputs) | 	actionRunJob.ConcurrencyGroup, actionRunJob.ConcurrencyCancel, err = jobparser.EvaluateConcurrency(&rawConcurrency, actionRunJob.JobID, workflowJob, actionsJobCtx, jobResults, vars, inputs) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return fmt.Errorf("evaluate concurrency: %w", err) | 		return fmt.Errorf("evaluate concurrency: %w", err) | ||||||
| 	} | 	} | ||||||
|   | |||||||
| @@ -18,7 +18,6 @@ import ( | |||||||
| 	"code.gitea.io/gitea/modules/util" | 	"code.gitea.io/gitea/modules/util" | ||||||
| 	notify_service "code.gitea.io/gitea/services/notify" | 	notify_service "code.gitea.io/gitea/services/notify" | ||||||
|  |  | ||||||
| 	"github.com/nektos/act/pkg/jobparser" |  | ||||||
| 	"xorm.io/builder" | 	"xorm.io/builder" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| @@ -305,9 +304,9 @@ func (r *jobStatusResolver) resolveCheckNeeds(id int64) (allDone, allSucceed boo | |||||||
| } | } | ||||||
|  |  | ||||||
| func (r *jobStatusResolver) resolveJobHasIfCondition(actionRunJob *actions_model.ActionRunJob) (hasIf bool) { | func (r *jobStatusResolver) resolveJobHasIfCondition(actionRunJob *actions_model.ActionRunJob) (hasIf bool) { | ||||||
| 	if wfJobs, _ := jobparser.Parse(actionRunJob.WorkflowPayload); len(wfJobs) == 1 { | 	// FIXME evaluate this on the server side | ||||||
| 		_, wfJob := wfJobs[0].Job() | 	if job, err := actionRunJob.ParseJob(); err == nil { | ||||||
| 		hasIf = len(wfJob.If.Value) > 0 | 		return len(job.If.Value) > 0 | ||||||
| 	} | 	} | ||||||
| 	return hasIf | 	return hasIf | ||||||
| } | } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user