@ -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 )