jobparser

package
v12.2.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Dec 15, 2025 License: GPL-3.0 Imports: 10 Imported by: 0

Documentation

Index

Constants

This section is empty.

Variables

View Source
var ErrUnsupportedReusableWorkflowFetch = errors.New("unable to support reusable workflow fetch")

Functions

func EvaluateWorkflowCallOutputs added in v12.2.0

func EvaluateWorkflowCallOutputs(callerWorkflow *SingleWorkflow, gitCtx *model.GithubContext, vars map[string]string, needs []string, jobResults map[string]string, jobOutputs map[string]map[string]string) map[string]string

Outputs from a reusable workflow are translated into outputs on the caller job, which is transformed into a placeholder job that is never really executed. Because it isn't executed, special handling for evaluating its outputs is required, which `EvaluateWorkflowCallOutputs` provides.

func EvaluateWorkflowConcurrency

func EvaluateWorkflowConcurrency(rc *model.RawConcurrency, gitCtx *model.GithubContext, vars map[string]string, inputs map[string]any) (string, *bool, error)

Convert the raw YAML from the `concurrency` block on a workflow into the evaluated concurrency group and cancel-in-progress value. This implementation only supports workflow-level concurrency definition, where we expect expressions to be able to access only the github, inputs and vars contexts. If RawConcurrency is empty, then the returned concurrency group will be "" and cancel-in-progress will be nil -- this can be used to distinguish from an explicit cancel-in-progress choice even if a group isn't specified.

func NewInterpreter

func NewInterpreter(
	jobID string,
	job *model.Job,
	matrix map[string]any,
	gitCtx *model.GithubContext,
	results map[string]*JobResult,
	vars map[string]string,
	inputs map[string]any,
	errorMode exprparser.ErrorMode,
	needs []string,
) exprparser.Interpreter

func NewWorkflowInterpreter

func NewWorkflowInterpreter(
	gitCtx *model.GithubContext,
	vars map[string]string,
	inputs map[string]any,
) exprparser.Interpreter

Returns an interpreter used in the server in the context of workflow-level templates. Needs github, inputs, and vars context only.

Types

type ContainerSpec

type ContainerSpec struct {
	Image       string            `yaml:"image,omitempty"`
	Env         map[string]string `yaml:"env,omitempty"`
	Ports       []string          `yaml:"ports,omitempty"`
	Volumes     []string          `yaml:"volumes,omitempty"`
	Options     string            `yaml:"options,omitempty"`
	Credentials map[string]string `yaml:"credentials,omitempty"`
	Cmd         []string          `yaml:"cmd,omitempty"`
}

type Defaults

type Defaults struct {
	Run RunDefaults `yaml:"run,omitempty"`
}

type Event

type Event struct {
	Name string
	// contains filtered or unexported fields
}

func ParseRawOn

func ParseRawOn(rawOn *yaml.Node) ([]*Event, error)

func (*Event) Acts

func (evt *Event) Acts() map[string][]string

func (*Event) IsSchedule

func (evt *Event) IsSchedule() bool

func (*Event) Schedules

func (evt *Event) Schedules() []map[string]string

type ExpressionEvaluator

type ExpressionEvaluator struct {
	// contains filtered or unexported fields
}

ExpressionEvaluator is copied from runner.expressionEvaluator, to avoid unnecessary dependencies

func NewExpressionEvaluator

func NewExpressionEvaluator(interpreter exprparser.Interpreter) *ExpressionEvaluator

func (ExpressionEvaluator) EvaluateYamlNode

func (ee ExpressionEvaluator) EvaluateYamlNode(node *yaml.Node) error

func (ExpressionEvaluator) Interpolate

func (ee ExpressionEvaluator) Interpolate(in string) string

type IncompleteMatrix added in v12.1.1

type IncompleteMatrix struct {
	Dimension string `yaml:"dimension,omitempty"` // if ${{ matrix.some-dimension }} was incomplete, this will contain "some-dimension"
}

type IncompleteNeeds added in v12.1.1

type IncompleteNeeds struct {
	Job    string `yaml:"job,omitempty"`    // if ${{ needs.some-job.outputs.some-output }} was incomplete, this will contain "some-job"
	Output string `yaml:"output,omitempty"` // if ${{ needs.some-job.outputs.some-output }} was incomplete, this will contain "some-output"
}

type Job

type Job struct {
	Name           string                    `yaml:"name,omitempty"`
	RawNeeds       yaml.Node                 `yaml:"needs,omitempty"`
	RawRunsOn      yaml.Node                 `yaml:"runs-on,omitempty"`
	Env            yaml.Node                 `yaml:"env,omitempty"`
	If             yaml.Node                 `yaml:"if,omitempty"`
	Steps          []*Step                   `yaml:"steps,omitempty"`
	TimeoutMinutes string                    `yaml:"timeout-minutes,omitempty"`
	Services       map[string]*ContainerSpec `yaml:"services,omitempty"`
	Strategy       Strategy                  `yaml:"strategy,omitempty"`
	RawContainer   yaml.Node                 `yaml:"container,omitempty"`
	Defaults       Defaults                  `yaml:"defaults,omitempty"`
	Outputs        map[string]string         `yaml:"outputs,omitempty"`
	Uses           string                    `yaml:"uses,omitempty"`
	With           map[string]any            `yaml:"with,omitempty"`
	RawSecrets     yaml.Node                 `yaml:"secrets,omitempty"`
	RawConcurrency *model.RawConcurrency     `yaml:"concurrency,omitempty"`
}

func (*Job) Clone

func (j *Job) Clone() *Job

func (*Job) EraseNeeds

func (j *Job) EraseNeeds() *Job

func (*Job) Needs

func (j *Job) Needs() []string

func (*Job) RunsOn

func (j *Job) RunsOn() []string

type JobResult

type JobResult struct {
	Needs   []string
	Result  string
	Outputs map[string]string
}

JobResult is the minimum requirement of job results for Interpreter

type ParseOption

type ParseOption func(c *parseContext)

func ExpandLocalReusableWorkflows added in v12.2.0

func ExpandLocalReusableWorkflows(localWorkflowFetcher func(path string) ([]byte, error)) ParseOption

Allows the job parser to convert a workflow job that references a local reusable workflow (eg. `uses: ./.forgejo/workflows/reusable.yml`) into one-or-more jobs contained within the local workflow. The `localWorkflowFetcher` function allows jobparser to read the target workflow file.

The `localWorkflowFetcher` can return the error ErrUnsupportedReusableWorkflowFetch if the fetcher doesn't support the target workflow for job parsing. The job will go to the "fallback" mode of operation where its internal jobs are not expanded into the parsed workflow, and it can still be executed as a single monolithic job. All other errors are considered fatal for job parsing.

func ExpandRemoteReusableWorkflows added in v12.2.0

func ExpandRemoteReusableWorkflows(remoteWorkflowFetcher func(ref *model.RemoteReusableWorkflowWithBaseURL) ([]byte, error)) ParseOption

Allows the job parser to convert a workflow job that references a remote (eg. not part of the current workflow's repository) reusable workflow (eg. `uses: some-org/some-repo/.forgejo/workflows/reusable.yml`) into one-or-more jobs contained within the remote workflow. The `remoteWorkflowFetcher` function allows jobparser to read the target workflow file.

`ref.Host` will be `nil` if the remote reference was not a fully-qualified URL. No default value is provided.

The `remoteWorkflowFetcher` can return the error ErrUnsupportedReusableWorkflowFetch if the fetcher doesn't support the target workflow for job parsing. The job will go to the "fallback" mode of operation where its internal jobs are not expanded into the parsed workflow, and it can still be executed as a single monolithic job. All other errors are considered fatal for job parsing.

func SupportIncompleteRunsOn added in v12.1.1

func SupportIncompleteRunsOn() ParseOption

func WithGitContext

func WithGitContext(context *model.GithubContext) ParseOption

func WithInputs

func WithInputs(inputs map[string]any) ParseOption

func WithJobOutputs added in v12.1.0

func WithJobOutputs(outputs map[string]map[string]string) ParseOption

func WithJobResults

func WithJobResults(results map[string]string) ParseOption

func WithVars

func WithVars(vars map[string]string) ParseOption

func WithWorkflowNeeds added in v12.1.0

func WithWorkflowNeeds(needs []string) ParseOption

`WithWorkflowNeeds` allows overridding the `needs` field for a job being parsed.

In the case that a `SingleWorkflow`, returned from `Parse`, is passed back into `Parse` later in order to expand its IncompleteMatrix, then the jobs that it needs will not be present in the workflow (because `SingleWorkflow` only has one job in it). The `needs` field on the job itself may also be absent (Forgejo truncates the `needs` so that it can coordinate dispatching the jobs one-by-one without the runner panicing over missing jobs). However, the `needs` field is needed in order to populate the `needs` variable context. `WithWorkflowNeeds` can be used to indicate the needs exist and are fulfilled.

type RunDefaults

type RunDefaults struct {
	Shell            string `yaml:"shell,omitempty"`
	WorkingDirectory string `yaml:"working-directory,omitempty"`
}

type SingleWorkflow

type SingleWorkflow struct {
	Name     string            `yaml:"name,omitempty"`
	RawOn    yaml.Node         `yaml:"on,omitempty"`
	Env      map[string]string `yaml:"env,omitempty"`
	RawJobs  yaml.Node         `yaml:"jobs,omitempty"`
	Defaults Defaults          `yaml:"defaults,omitempty"`

	IncompleteRecursionDepth int `yaml:"incomplete_recursion_depth,omitempty"`

	// IncompleteMatrix flag indicates that it wasn't possible to evaluate the `strategy.matrix` section of the job
	// because it references a job output that is currently undefined.  The workflow that this job came from will need
	// to be reparsed using the `WithJobOutputs()` option, and it may result in this job being expanded into multiple
	// jobs.
	IncompleteMatrix      bool             `yaml:"incomplete_matrix,omitempty"`
	IncompleteMatrixNeeds *IncompleteNeeds `yaml:"incomplete_matrix_needs,omitempty"`

	// IncompleteRunsOn indicates that it wasn't possible to evaluate the `runs_on` section of the job
	// because it references a job output that is currently undefined.
	IncompleteRunsOn       bool              `yaml:"incomplete_runs_on,omitempty"`
	IncompleteRunsOnNeeds  *IncompleteNeeds  `yaml:"incomplete_runs_on_needs,omitempty"`
	IncompleteRunsOnMatrix *IncompleteMatrix `yaml:"incomplete_runs_on_matrix,omitempty"`

	// IncompleteWith indicates that it wasn't possible to evaluate the `with` section of a job that is calling a
	// reusable workflow because it references a job output that is currently undefined.
	IncompleteWith       bool              `yaml:"incomplete_with,omitempty"`
	IncompleteWithNeeds  *IncompleteNeeds  `yaml:"incomplete_with_needs,omitempty"`
	IncompleteWithMatrix *IncompleteMatrix `yaml:"incomplete_with_matrix,omitempty"`

	// When this workflow is a placeholder job that has been expanded into a reusable workflow, the inputs to the
	// reusable workflow are stored here so that they can be used as a valid evaluation context in the reusable
	// workflow's outputs later.
	WorkflowCallInputs map[string]any `yaml:"workflow_call_inputs,omitempty"`
}

SingleWorkflow is a workflow with single job and single matrix

func Parse

func Parse(content []byte, validate bool, options ...ParseOption) ([]*SingleWorkflow, error)

func (*SingleWorkflow) Job

func (w *SingleWorkflow) Job() (string, *Job)

func (*SingleWorkflow) Marshal

func (w *SingleWorkflow) Marshal() ([]byte, error)

func (*SingleWorkflow) SetJob

func (w *SingleWorkflow) SetJob(id string, job *Job) error

type Step

type Step struct {
	ID               string            `yaml:"id,omitempty"`
	If               yaml.Node         `yaml:"if,omitempty"`
	Name             string            `yaml:"name,omitempty"`
	Uses             string            `yaml:"uses,omitempty"`
	Run              string            `yaml:"run,omitempty"`
	WorkingDirectory string            `yaml:"working-directory,omitempty"`
	Shell            string            `yaml:"shell,omitempty"`
	Env              yaml.Node         `yaml:"env,omitempty"`
	With             map[string]string `yaml:"with,omitempty"`
	ContinueOnError  bool              `yaml:"continue-on-error,omitempty"`
	TimeoutMinutes   string            `yaml:"timeout-minutes,omitempty"`
}

func (*Step) String

func (s *Step) String() string

String gets the name of step

type Strategy

type Strategy struct {
	FailFastString    string    `yaml:"fail-fast,omitempty"`
	MaxParallelString string    `yaml:"max-parallel,omitempty"`
	RawMatrix         yaml.Node `yaml:"matrix,omitempty"`
}

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL