mirror of
https://github.com/go-gitea/gitea.git
synced 2026-09-25 14:13:40 +09:00
Updates actionslib to https://gitea.com/gitea/actionslib/releases/tag/v1.2.1, moves workflow parsing into it and aligns behaviour with GitHub. 1. `uses:` supports `self:` (Gitea-only feature) and `$/` paths. 1. `strategy`, `matrix`, `max-parallel` and `fail-fast` accept expressions, including over `needs`. A job whose `name`, `runs-on` or `continue-on-error` reads `needs` is resolved once they finish. 1. A job `if:` may only read `github`, `needs`, `vars` and `inputs` and is decided before the matrix, as on github.com. 1. Matrix `fail-fast` cancels the other combinations, and `always()` jobs keep running when a run is cancelled. 1. Invalid workflow files, including a malformed `on:` and unknown or cyclic `needs`, show up on push as failed runs with the error. 1. A job whose `if:` or `concurrency:` fails to evaluate is skipped or failed with the error, instead of staying blocked. 1. Reusable workflows: a missing and an unreadable repository fail alike, public callers cannot use private workflows, nested jobs cannot exceed the caller's token permissions. 1. Runner labels match case-insensitively, and `runs-on` accepts an array from an expression. Runner PR: https://gitea.com/gitea/runner/pulls/1247 Docs PR: https://gitea.com/gitea/docs/pulls/553 Fixes: https://github.com/go-gitea/gitea/issues/38990 Fixes: https://github.com/go-gitea/gitea/issues/39382 Fixes: https://github.com/go-gitea/gitea/issues/32364 Fixes: https://github.com/go-gitea/gitea/issues/36077 Fixes: https://github.com/go-gitea/gitea/issues/23277 Fixes: https://github.com/go-gitea/gitea/issues/29020 Co-authored-by: Claude (Opus 5) <noreply@anthropic.com> Co-authored-by: Zettat123 <zettat123@gmail.com>
73 lines
2.0 KiB
Go
73 lines
2.0 KiB
Go
// Copyright 2026 The Gitea Authors. All rights reserved.
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
package jobparser
|
|
|
|
import (
|
|
"gitea.dev/actionslib/pkg/exprparser"
|
|
"gitea.dev/actionslib/pkg/model"
|
|
|
|
"go.yaml.in/yaml/v4"
|
|
)
|
|
|
|
// NewInterpeter returns an interpeter used in the server,
|
|
// need github, needs, strategy, matrix, inputs context only,
|
|
// see https://docs.github.com/en/actions/learn-github-actions/contexts#context-availability
|
|
func NewInterpeter(
|
|
jobID string,
|
|
strategy *Strategy,
|
|
matrix map[string]any,
|
|
gitCtx *model.GithubContext,
|
|
results map[string]*JobResult,
|
|
vars map[string]string,
|
|
inputs map[string]any,
|
|
) exprparser.Interpreter {
|
|
run := &model.Run{
|
|
Workflow: &model.Workflow{
|
|
Jobs: map[string]*model.Job{},
|
|
},
|
|
JobID: jobID,
|
|
}
|
|
for id, result := range results {
|
|
need := yaml.Node{}
|
|
_ = need.Encode(result.Needs)
|
|
run.Workflow.Jobs[id] = &model.Job{
|
|
RawNeeds: need,
|
|
Result: result.Result,
|
|
Outputs: result.Outputs,
|
|
}
|
|
}
|
|
|
|
ee := &exprparser.EvaluationEnvironment{
|
|
Github: gitCtx,
|
|
Env: nil, // no need
|
|
// TODO: The empty JobContext.Status is right for now because Gitea never checks `if` condition when the workflow run is cancelled.
|
|
// This is an implementation gap in Gitea Actions. When a workflow run is cancelled, Gitea should check the job's `if` condition,
|
|
// and if the condition is met (e.g. `if: ${{ cancelled() }}` ), the job should be executed rather than cancelled.
|
|
Job: &model.JobContext{},
|
|
Steps: nil, // no need
|
|
Runner: nil, // no need
|
|
Secrets: nil, // no need
|
|
Strategy: strategy.context(),
|
|
Matrix: matrix,
|
|
Needs: exprparser.NeedsContext(run),
|
|
Inputs: inputs,
|
|
Vars: vars,
|
|
}
|
|
|
|
config := exprparser.Config{
|
|
Run: run,
|
|
WorkingDir: "", // WorkingDir is used for the function hashFiles, but it's not needed in the server
|
|
Context: "job",
|
|
}
|
|
|
|
return exprparser.NewInterpeter(ee, config)
|
|
}
|
|
|
|
// JobResult is the minimum requirement of job results for Interpeter
|
|
type JobResult struct {
|
|
Needs []string
|
|
Result string
|
|
Outputs map[string]string
|
|
}
|