mirror of
https://gitea.com/gitea/act_runner.git
synced 2026-03-25 00:05:03 +01:00
Compare commits
16 Commits
c192d65d18
...
act-runner
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b5a66bda89 | ||
|
|
07a81d616e | ||
|
|
08c3ea28ca | ||
|
|
8d67364e67 | ||
|
|
059d6b88f6 | ||
|
|
58855dfc6b | ||
|
|
4fed07ffc4 | ||
|
|
f300931212 | ||
|
|
44da20bd14 | ||
|
|
4756f09c5d | ||
|
|
94f719fc40 | ||
|
|
c1ad194f19 | ||
|
|
fa6450d033 | ||
|
|
b0ec3fa4fc | ||
|
|
4fdf9ab904 | ||
|
|
8d702e75e7 |
@@ -25,16 +25,7 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
go-version-file: go.mod
|
go-version-file: go.mod
|
||||||
check-latest: true
|
check-latest: true
|
||||||
- uses: golangci/golangci-lint-action@v8.0.0
|
- run: make lint-go
|
||||||
with:
|
|
||||||
version: v2.1.6
|
|
||||||
- uses: megalinter/megalinter/flavors/go@v9.1.0
|
|
||||||
env:
|
|
||||||
DEFAULT_BRANCH: ${{ github.event.repository.default_branch }}
|
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
VALIDATE_ALL_CODEBASE: false
|
|
||||||
GITHUB_STATUS_REPORTER: ${{ !env.ACT }}
|
|
||||||
GITHUB_COMMENT_REPORTER: ${{ !env.ACT }}
|
|
||||||
|
|
||||||
test-linux:
|
test-linux:
|
||||||
name: test-linux
|
name: test-linux
|
||||||
@@ -43,18 +34,6 @@ jobs:
|
|||||||
- uses: actions/checkout@v5
|
- uses: actions/checkout@v5
|
||||||
with:
|
with:
|
||||||
fetch-depth: 2
|
fetch-depth: 2
|
||||||
- name: Cleanup Docker Engine
|
|
||||||
run: |
|
|
||||||
docker ps -a --format '{{ if eq (truncate .Names 4) "act-" }}
|
|
||||||
{{ .ID }}
|
|
||||||
{{end}}' | xargs -r docker rm -f || :
|
|
||||||
docker volume ls --format '{{ if eq (truncate .Name 4) "act-" }}
|
|
||||||
{{ .Name }}
|
|
||||||
{{ end }}' | xargs -r docker volume rm -f || :
|
|
||||||
docker images --format '{{ if eq (truncate .Repository 4) "act-" }}
|
|
||||||
{{ .ID }}
|
|
||||||
{{ end }}' | xargs -r docker rmi -f || :
|
|
||||||
docker images -q | xargs -r docker rmi || :
|
|
||||||
- name: Set up QEMU
|
- name: Set up QEMU
|
||||||
if: '!env.NO_QEMU'
|
if: '!env.NO_QEMU'
|
||||||
uses: docker/setup-qemu-action@v3
|
uses: docker/setup-qemu-action@v3
|
||||||
@@ -87,9 +66,9 @@ jobs:
|
|||||||
env:
|
env:
|
||||||
SERVER_URL: ${{ github.server_url }}
|
SERVER_URL: ${{ github.server_url }}
|
||||||
- name: Run act from cli
|
- name: Run act from cli
|
||||||
run: go run main.go -P ubuntu-latest=node:16-buster-slim -C ./pkg/runner/testdata/ -W ./basic/push.yml
|
run: go run ./internal/app/act-cli -P ubuntu-latest=node:16-buster-slim -C ./pkg/runner/testdata/ -W ./basic/push.yml
|
||||||
- name: Run act from cli without docker support
|
- name: Run act from cli without docker support
|
||||||
run: go run -tags WITHOUT_DOCKER main.go -P ubuntu-latest=-self-hosted -C ./pkg/runner/testdata/ -W ./local-action-js/push.yml
|
run: go run -tags WITHOUT_DOCKER ./internal/app/act-cli -P ubuntu-latest=-self-hosted -C ./pkg/runner/testdata/ -W ./local-action-js/push.yml
|
||||||
|
|
||||||
snapshot:
|
snapshot:
|
||||||
name: snapshot
|
name: snapshot
|
||||||
@@ -112,7 +91,7 @@ jobs:
|
|||||||
uses: goreleaser/goreleaser-action@v6
|
uses: goreleaser/goreleaser-action@v6
|
||||||
with:
|
with:
|
||||||
version: v2
|
version: v2
|
||||||
args: release --snapshot --clean
|
args: release --snapshot --clean -f ./.goreleaser.act-cli.yml
|
||||||
- name: Setup Node
|
- name: Setup Node
|
||||||
continue-on-error: true
|
continue-on-error: true
|
||||||
uses: actions/setup-node@v6
|
uses: actions/setup-node@v6
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ env:
|
|||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
goreleaser:
|
goreleaser:
|
||||||
|
if: (!vars.PUBLISH_ACT_CLI)
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v6
|
- uses: actions/checkout@v6
|
||||||
@@ -39,6 +40,7 @@ jobs:
|
|||||||
GITEA_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GITEA_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
release-image:
|
release-image:
|
||||||
|
if: (!vars.PUBLISH_ACT_CLI)
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ on:
|
|||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
goreleaser:
|
goreleaser:
|
||||||
|
if: (!vars.PUBLISH_ACT_CLI)
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v6
|
- uses: actions/checkout@v6
|
||||||
@@ -38,6 +39,7 @@ jobs:
|
|||||||
GITEA_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GITEA_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
GPG_FINGERPRINT: ${{ steps.import_gpg.outputs.fingerprint }}
|
GPG_FINGERPRINT: ${{ steps.import_gpg.outputs.fingerprint }}
|
||||||
release-image:
|
release-image:
|
||||||
|
if: (!vars.PUBLISH_ACT_CLI)
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
container:
|
container:
|
||||||
image: catthehacker/ubuntu:act-latest
|
image: catthehacker/ubuntu:act-latest
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ jobs:
|
|||||||
uses: goreleaser/goreleaser-action@v6
|
uses: goreleaser/goreleaser-action@v6
|
||||||
with:
|
with:
|
||||||
version: latest
|
version: latest
|
||||||
args: release --clean -f ./.goreleaser.yml -f ./.goreleaser.gitea.yml
|
args: release --clean -f ./.goreleaser.act-cli.yml -f ./.goreleaser.act-cli.gitea.yml
|
||||||
env:
|
env:
|
||||||
GITEA_TOKEN: ${{ secrets.GORELEASER_GITHUB_TOKEN || github.token }}
|
GITEA_TOKEN: ${{ secrets.GORELEASER_GITHUB_TOKEN || github.token }}
|
||||||
- name: Winget
|
- name: Winget
|
||||||
|
|||||||
@@ -3,6 +3,11 @@ on:
|
|||||||
- push
|
- push
|
||||||
- pull_request
|
- pull_request
|
||||||
|
|
||||||
|
env:
|
||||||
|
DOOD: 1
|
||||||
|
NO_QEMU: 1
|
||||||
|
NO_EXTERNAL_IP: 1
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
lint:
|
lint:
|
||||||
name: check and test
|
name: check and test
|
||||||
@@ -17,4 +22,13 @@ jobs:
|
|||||||
- name: build
|
- name: build
|
||||||
run: make build
|
run: make build
|
||||||
- name: test
|
- name: test
|
||||||
run: make test
|
run: |
|
||||||
|
unset ACTIONS_RUNTIME_URL
|
||||||
|
unset ACTIONS_RESULTS_URL
|
||||||
|
unset ACTIONS_RUNTIME_TOKEN
|
||||||
|
export GITHUB_REPOSITORY="${GITHUB_REPOSITORY#${SERVER_URL%/}/}"
|
||||||
|
export ACT_REPOSITORY="${GITHUB_REPOSITORY}"
|
||||||
|
export ACT_OWNER="${ACT_REPOSITORY%%/*}"
|
||||||
|
make test
|
||||||
|
env:
|
||||||
|
SERVER_URL: ${{ github.server_url }}
|
||||||
|
|||||||
2
.github/workflows/checks.yml
vendored
2
.github/workflows/checks.yml
vendored
@@ -112,7 +112,7 @@ jobs:
|
|||||||
uses: goreleaser/goreleaser-action@v6
|
uses: goreleaser/goreleaser-action@v6
|
||||||
with:
|
with:
|
||||||
version: v2
|
version: v2
|
||||||
args: release --snapshot --clean
|
args: release --snapshot --clean -f ./.goreleaser.act-cli.yml
|
||||||
- name: Setup Node
|
- name: Setup Node
|
||||||
uses: actions/setup-node@v6
|
uses: actions/setup-node@v6
|
||||||
with:
|
with:
|
||||||
|
|||||||
3
.github/workflows/release.yml
vendored
3
.github/workflows/release.yml
vendored
@@ -6,6 +6,7 @@ on:
|
|||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
release:
|
release:
|
||||||
|
if: vars.PUBLISH_ACT_CLI
|
||||||
# TODO use environment to scope secrets
|
# TODO use environment to scope secrets
|
||||||
name: release
|
name: release
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
@@ -28,7 +29,7 @@ jobs:
|
|||||||
uses: goreleaser/goreleaser-action@v6
|
uses: goreleaser/goreleaser-action@v6
|
||||||
with:
|
with:
|
||||||
version: latest
|
version: latest
|
||||||
args: release --clean
|
args: release --clean -f ./.goreleaser.act-cli.yml
|
||||||
env:
|
env:
|
||||||
GITHUB_TOKEN: ${{ secrets.GORELEASER_GITHUB_TOKEN || github.token }}
|
GITHUB_TOKEN: ${{ secrets.GORELEASER_GITHUB_TOKEN || github.token }}
|
||||||
- name: Winget
|
- name: Winget
|
||||||
|
|||||||
1
.gitignore
vendored
1
.gitignore
vendored
@@ -1,4 +1,5 @@
|
|||||||
/act_runner
|
/act_runner
|
||||||
|
/act
|
||||||
.env
|
.env
|
||||||
.runner
|
.runner
|
||||||
coverage.txt
|
coverage.txt
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
version: 2
|
version: 2
|
||||||
|
project_name: act-cli
|
||||||
before:
|
before:
|
||||||
hooks:
|
hooks:
|
||||||
- go mod tidy
|
- go mod tidy
|
||||||
@@ -20,7 +21,7 @@ builds:
|
|||||||
- '7'
|
- '7'
|
||||||
ignore:
|
ignore:
|
||||||
- goos: windows
|
- goos: windows
|
||||||
goarm: '6'
|
goarch: arm
|
||||||
binary: act
|
binary: act
|
||||||
checksum:
|
checksum:
|
||||||
name_template: 'checksums.txt'
|
name_template: 'checksums.txt'
|
||||||
8
Makefile
8
Makefile
@@ -1,5 +1,6 @@
|
|||||||
DIST := dist
|
DIST := dist
|
||||||
EXECUTABLE := act_runner
|
EXECUTABLE := act_runner
|
||||||
|
ACT_EXECUTABLE := act
|
||||||
GOFMT ?= gofumpt -l
|
GOFMT ?= gofumpt -l
|
||||||
DIST_DIRS := $(DIST)/binaries $(DIST)/release
|
DIST_DIRS := $(DIST)/binaries $(DIST)/release
|
||||||
GO ?= go
|
GO ?= go
|
||||||
@@ -137,7 +138,7 @@ tidy-check: tidy
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
test: fmt-check security-check
|
test: fmt-check security-check
|
||||||
@$(GO) test -race -v -cover -coverprofile coverage.txt ./... && echo "\n==>\033[32m Ok\033[m\n" || exit 1
|
@$(GO) test -test.short -v -cover -coverprofile coverage.txt ./... && echo "\n==>\033[32m Ok\033[m\n" || exit 1
|
||||||
|
|
||||||
.PHONY: vet
|
.PHONY: vet
|
||||||
vet:
|
vet:
|
||||||
@@ -148,11 +149,14 @@ vet:
|
|||||||
install: $(GOFILES)
|
install: $(GOFILES)
|
||||||
$(GO) install -v -tags '$(TAGS)' -ldflags '$(EXTLDFLAGS)-s -w $(LDFLAGS)'
|
$(GO) install -v -tags '$(TAGS)' -ldflags '$(EXTLDFLAGS)-s -w $(LDFLAGS)'
|
||||||
|
|
||||||
build: go-check $(EXECUTABLE)
|
build: go-check $(EXECUTABLE) $(ACT_EXECUTABLE)
|
||||||
|
|
||||||
$(EXECUTABLE): $(GOFILES)
|
$(EXECUTABLE): $(GOFILES)
|
||||||
$(GO) build -v -tags '$(TAGS)' -ldflags '$(EXTLDFLAGS)-s -w $(LDFLAGS)' -o $@
|
$(GO) build -v -tags '$(TAGS)' -ldflags '$(EXTLDFLAGS)-s -w $(LDFLAGS)' -o $@
|
||||||
|
|
||||||
|
$(ACT_EXECUTABLE): $(GOFILES)
|
||||||
|
$(GO) build -v -tags '$(TAGS)' -ldflags '$(EXTLDFLAGS)-s -w $(LDFLAGS)' -o $@ ./internal/app/act-cli
|
||||||
|
|
||||||
.PHONY: deps-backend
|
.PHONY: deps-backend
|
||||||
deps-backend:
|
deps-backend:
|
||||||
$(GO) mod download
|
$(GO) mod download
|
||||||
|
|||||||
@@ -39,6 +39,10 @@ func TestListOptions(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestRun(t *testing.T) {
|
func TestRun(t *testing.T) {
|
||||||
|
if testing.Short() {
|
||||||
|
t.Skip("skipping integration test")
|
||||||
|
}
|
||||||
|
|
||||||
rootCmd := createRootCommand(context.Background(), &Input{}, "")
|
rootCmd := createRootCommand(context.Background(), &Input{}, "")
|
||||||
err := newRunCommand(context.Background(), &Input{
|
err := newRunCommand(context.Background(), &Input{
|
||||||
platforms: []string{"ubuntu-latest=node:16-buster-slim"},
|
platforms: []string{"ubuntu-latest=node:16-buster-slim"},
|
||||||
@@ -49,6 +53,9 @@ func TestRun(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestRunPush(t *testing.T) {
|
func TestRunPush(t *testing.T) {
|
||||||
|
if testing.Short() {
|
||||||
|
t.Skip("skipping integration test")
|
||||||
|
}
|
||||||
rootCmd := createRootCommand(context.Background(), &Input{}, "")
|
rootCmd := createRootCommand(context.Background(), &Input{}, "")
|
||||||
err := newRunCommand(context.Background(), &Input{
|
err := newRunCommand(context.Background(), &Input{
|
||||||
platforms: []string{"ubuntu-latest=node:16-buster-slim"},
|
platforms: []string{"ubuntu-latest=node:16-buster-slim"},
|
||||||
@@ -59,6 +66,9 @@ func TestRunPush(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestRunPushJsonLogger(t *testing.T) {
|
func TestRunPushJsonLogger(t *testing.T) {
|
||||||
|
if testing.Short() {
|
||||||
|
t.Skip("skipping integration test")
|
||||||
|
}
|
||||||
rootCmd := createRootCommand(context.Background(), &Input{}, "")
|
rootCmd := createRootCommand(context.Background(), &Input{}, "")
|
||||||
err := newRunCommand(context.Background(), &Input{
|
err := newRunCommand(context.Background(), &Input{
|
||||||
platforms: []string{"ubuntu-latest=node:16-buster-slim"},
|
platforms: []string{"ubuntu-latest=node:16-buster-slim"},
|
||||||
@@ -70,6 +80,9 @@ func TestRunPushJsonLogger(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestFlags(t *testing.T) {
|
func TestFlags(t *testing.T) {
|
||||||
|
if testing.Short() {
|
||||||
|
t.Skip("skipping integration test")
|
||||||
|
}
|
||||||
for _, f := range []string{"graph", "list", "bug-report", "man-page"} {
|
for _, f := range []string{"graph", "list", "bug-report", "man-page"} {
|
||||||
t.Run("TestFlag-"+f, func(t *testing.T) {
|
t.Run("TestFlag-"+f, func(t *testing.T) {
|
||||||
rootCmd := createRootCommand(context.Background(), &Input{}, "")
|
rootCmd := createRootCommand(context.Background(), &Input{}, "")
|
||||||
@@ -86,6 +99,9 @@ func TestFlags(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestWorkflowCall(t *testing.T) {
|
func TestWorkflowCall(t *testing.T) {
|
||||||
|
if testing.Short() {
|
||||||
|
t.Skip("skipping integration test")
|
||||||
|
}
|
||||||
rootCmd := createRootCommand(context.Background(), &Input{}, "")
|
rootCmd := createRootCommand(context.Background(), &Input{}, "")
|
||||||
err := newRunCommand(context.Background(), &Input{
|
err := newRunCommand(context.Background(), &Input{
|
||||||
platforms: []string{"ubuntu-latest=node:16-buster-slim"},
|
platforms: []string{"ubuntu-latest=node:16-buster-slim"},
|
||||||
@@ -97,6 +113,9 @@ func TestWorkflowCall(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestLocalRepositories(t *testing.T) {
|
func TestLocalRepositories(t *testing.T) {
|
||||||
|
if testing.Short() {
|
||||||
|
t.Skip("skipping integration test")
|
||||||
|
}
|
||||||
wd, _ := filepath.Abs("../pkg/runner/testdata/")
|
wd, _ := filepath.Abs("../pkg/runner/testdata/")
|
||||||
rootCmd := createRootCommand(context.Background(), &Input{}, "")
|
rootCmd := createRootCommand(context.Background(), &Input{}, "")
|
||||||
err := newRunCommand(context.Background(), &Input{
|
err := newRunCommand(context.Background(), &Input{
|
||||||
|
|||||||
@@ -162,7 +162,7 @@ func (e *Evaluator) evalBinaryNode(node *exprparser.BinaryNode) (*EvaluationResu
|
|||||||
return e.evalBinaryNodeRight(node, left, right)
|
return e.evalBinaryNodeRight(node, left, right)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *Evaluator) evalBinaryNodeLeft(node *exprparser.BinaryNode, left *EvaluationResult) (*EvaluationResult, error) {
|
func (e *Evaluator) evalBinaryNodeLeft(node *exprparser.BinaryNode, left *EvaluationResult) (*EvaluationResult, error) { //nolint:unparam
|
||||||
switch node.Op {
|
switch node.Op {
|
||||||
case "&&":
|
case "&&":
|
||||||
if left.IsFalsy() {
|
if left.IsFalsy() {
|
||||||
@@ -187,7 +187,7 @@ func (e *Evaluator) evalBinaryNodeLeft(node *exprparser.BinaryNode, left *Evalua
|
|||||||
return CreateIntermediateResult(e.Context(), ret), nil
|
return CreateIntermediateResult(e.Context(), ret), nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return nil, errors.ErrUnsupported
|
return nil, nil //nolint:nilnil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *Evaluator) evalBinaryNodeRight(node *exprparser.BinaryNode, left *EvaluationResult, right *EvaluationResult) (*EvaluationResult, error) {
|
func (e *Evaluator) evalBinaryNodeRight(node *exprparser.BinaryNode, left *EvaluationResult, right *EvaluationResult) (*EvaluationResult, error) {
|
||||||
|
|||||||
@@ -9,8 +9,7 @@ import (
|
|||||||
exprparser "gitea.com/gitea/act_runner/internal/expr"
|
exprparser "gitea.com/gitea/act_runner/internal/expr"
|
||||||
)
|
)
|
||||||
|
|
||||||
type FromJSON struct {
|
type FromJSON struct{}
|
||||||
}
|
|
||||||
|
|
||||||
func (FromJSON) Evaluate(eval *Evaluator, args []exprparser.Node) (*EvaluationResult, error) {
|
func (FromJSON) Evaluate(eval *Evaluator, args []exprparser.Node) (*EvaluationResult, error) {
|
||||||
r, err := eval.Evaluate(args[0])
|
r, err := eval.Evaluate(args[0])
|
||||||
@@ -25,8 +24,7 @@ func (FromJSON) Evaluate(eval *Evaluator, args []exprparser.Node) (*EvaluationRe
|
|||||||
return CreateIntermediateResult(eval.Context(), res), nil
|
return CreateIntermediateResult(eval.Context(), res), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
type ToJSON struct {
|
type ToJSON struct{}
|
||||||
}
|
|
||||||
|
|
||||||
func (ToJSON) Evaluate(eval *Evaluator, args []exprparser.Node) (*EvaluationResult, error) {
|
func (ToJSON) Evaluate(eval *Evaluator, args []exprparser.Node) (*EvaluationResult, error) {
|
||||||
r, err := eval.Evaluate(args[0])
|
r, err := eval.Evaluate(args[0])
|
||||||
@@ -44,8 +42,7 @@ func (ToJSON) Evaluate(eval *Evaluator, args []exprparser.Node) (*EvaluationResu
|
|||||||
return CreateIntermediateResult(eval.Context(), string(data)), nil
|
return CreateIntermediateResult(eval.Context(), string(data)), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
type Contains struct {
|
type Contains struct{}
|
||||||
}
|
|
||||||
|
|
||||||
func (Contains) Evaluate(eval *Evaluator, args []exprparser.Node) (*EvaluationResult, error) {
|
func (Contains) Evaluate(eval *Evaluator, args []exprparser.Node) (*EvaluationResult, error) {
|
||||||
collection, err := eval.Evaluate(args[0])
|
collection, err := eval.Evaluate(args[0])
|
||||||
@@ -72,8 +69,7 @@ func (Contains) Evaluate(eval *Evaluator, args []exprparser.Node) (*EvaluationRe
|
|||||||
return CreateIntermediateResult(eval.Context(), strings.Contains(strings.ToLower(collection.ConvertToString()), strings.ToLower(el.ConvertToString()))), nil
|
return CreateIntermediateResult(eval.Context(), strings.Contains(strings.ToLower(collection.ConvertToString()), strings.ToLower(el.ConvertToString()))), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
type StartsWith struct {
|
type StartsWith struct{}
|
||||||
}
|
|
||||||
|
|
||||||
func (StartsWith) Evaluate(eval *Evaluator, args []exprparser.Node) (*EvaluationResult, error) {
|
func (StartsWith) Evaluate(eval *Evaluator, args []exprparser.Node) (*EvaluationResult, error) {
|
||||||
collection, err := eval.Evaluate(args[0])
|
collection, err := eval.Evaluate(args[0])
|
||||||
@@ -88,8 +84,7 @@ func (StartsWith) Evaluate(eval *Evaluator, args []exprparser.Node) (*Evaluation
|
|||||||
return CreateIntermediateResult(eval.Context(), strings.HasPrefix(strings.ToLower(collection.ConvertToString()), strings.ToLower(el.ConvertToString()))), nil
|
return CreateIntermediateResult(eval.Context(), strings.HasPrefix(strings.ToLower(collection.ConvertToString()), strings.ToLower(el.ConvertToString()))), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
type EndsWith struct {
|
type EndsWith struct{}
|
||||||
}
|
|
||||||
|
|
||||||
func (EndsWith) Evaluate(eval *Evaluator, args []exprparser.Node) (*EvaluationResult, error) {
|
func (EndsWith) Evaluate(eval *Evaluator, args []exprparser.Node) (*EvaluationResult, error) {
|
||||||
collection, err := eval.Evaluate(args[0])
|
collection, err := eval.Evaluate(args[0])
|
||||||
@@ -104,8 +99,7 @@ func (EndsWith) Evaluate(eval *Evaluator, args []exprparser.Node) (*EvaluationRe
|
|||||||
return CreateIntermediateResult(eval.Context(), strings.HasSuffix(strings.ToLower(collection.ConvertToString()), strings.ToLower(el.ConvertToString()))), nil
|
return CreateIntermediateResult(eval.Context(), strings.HasSuffix(strings.ToLower(collection.ConvertToString()), strings.ToLower(el.ConvertToString()))), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
type Format struct {
|
type Format struct{}
|
||||||
}
|
|
||||||
|
|
||||||
func (Format) Evaluate(eval *Evaluator, args []exprparser.Node) (*EvaluationResult, error) {
|
func (Format) Evaluate(eval *Evaluator, args []exprparser.Node) (*EvaluationResult, error) {
|
||||||
collection, err := eval.Evaluate(args[0])
|
collection, err := eval.Evaluate(args[0])
|
||||||
@@ -126,8 +120,7 @@ func (Format) Evaluate(eval *Evaluator, args []exprparser.Node) (*EvaluationResu
|
|||||||
return CreateIntermediateResult(eval.Context(), ret), err
|
return CreateIntermediateResult(eval.Context(), ret), err
|
||||||
}
|
}
|
||||||
|
|
||||||
type Join struct {
|
type Join struct{}
|
||||||
}
|
|
||||||
|
|
||||||
func (Join) Evaluate(eval *Evaluator, args []exprparser.Node) (*EvaluationResult, error) {
|
func (Join) Evaluate(eval *Evaluator, args []exprparser.Node) (*EvaluationResult, error) {
|
||||||
collection, err := eval.Evaluate(args[0])
|
collection, err := eval.Evaluate(args[0])
|
||||||
@@ -164,8 +157,7 @@ func (Join) Evaluate(eval *Evaluator, args []exprparser.Node) (*EvaluationResult
|
|||||||
return CreateIntermediateResult(eval.Context(), ""), nil
|
return CreateIntermediateResult(eval.Context(), ""), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
type Case struct {
|
type Case struct{}
|
||||||
}
|
|
||||||
|
|
||||||
func (Case) Evaluate(eval *Evaluator, args []exprparser.Node) (*EvaluationResult, error) {
|
func (Case) Evaluate(eval *Evaluator, args []exprparser.Node) (*EvaluationResult, error) {
|
||||||
if len(args)%2 == 0 {
|
if len(args)%2 == 0 {
|
||||||
|
|||||||
@@ -7,8 +7,7 @@ import (
|
|||||||
"gopkg.in/yaml.v3"
|
"gopkg.in/yaml.v3"
|
||||||
)
|
)
|
||||||
|
|
||||||
type EmptyTraceWriter struct {
|
type EmptyTraceWriter struct{}
|
||||||
}
|
|
||||||
|
|
||||||
func (e *EmptyTraceWriter) Info(_ string, _ ...any) {
|
func (e *EmptyTraceWriter) Info(_ string, _ ...any) {
|
||||||
}
|
}
|
||||||
@@ -28,7 +27,8 @@ matrix:
|
|||||||
- a
|
- a
|
||||||
- b
|
- b
|
||||||
`, 4, 0},
|
`, 4, 0},
|
||||||
{`
|
{
|
||||||
|
`
|
||||||
matrix:
|
matrix:
|
||||||
label:
|
label:
|
||||||
- a
|
- a
|
||||||
@@ -37,7 +37,8 @@ matrix:
|
|||||||
- label: a
|
- label: a
|
||||||
x: self`, 2, 0,
|
x: self`, 2, 0,
|
||||||
},
|
},
|
||||||
{`
|
{
|
||||||
|
`
|
||||||
matrix:
|
matrix:
|
||||||
label:
|
label:
|
||||||
- a
|
- a
|
||||||
@@ -46,7 +47,8 @@ matrix:
|
|||||||
- label: c
|
- label: c
|
||||||
x: self`, 2, 1,
|
x: self`, 2, 1,
|
||||||
},
|
},
|
||||||
{`
|
{
|
||||||
|
`
|
||||||
matrix:
|
matrix:
|
||||||
label:
|
label:
|
||||||
- a
|
- a
|
||||||
|
|||||||
@@ -282,7 +282,6 @@ func (r *artifactV4Routes) createArtifact(ctx *ArtifactContext) {
|
|||||||
safePath := safeResolve(safeRunPath, artifactName)
|
safePath := safeResolve(safeRunPath, artifactName)
|
||||||
safePath = safeResolve(safePath, artifactName+".zip")
|
safePath = safeResolve(safePath, artifactName+".zip")
|
||||||
file, err := r.fs.OpenWritable(safePath)
|
file, err := r.fs.OpenWritable(safePath)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
@@ -310,7 +309,6 @@ func (r *artifactV4Routes) uploadArtifact(ctx *ArtifactContext) {
|
|||||||
safePath = safeResolve(safePath, artifactName+".zip")
|
safePath = safeResolve(safePath, artifactName+".zip")
|
||||||
|
|
||||||
file, err := r.fs.OpenAppendable(safePath)
|
file, err := r.fs.OpenAppendable(safePath)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -55,8 +55,7 @@ type WriteFS interface {
|
|||||||
OpenAppendable(name string) (WritableFile, error)
|
OpenAppendable(name string) (WritableFile, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
type readWriteFSImpl struct {
|
type readWriteFSImpl struct{}
|
||||||
}
|
|
||||||
|
|
||||||
func (fwfs readWriteFSImpl) Open(name string) (fs.File, error) {
|
func (fwfs readWriteFSImpl) Open(name string) (fs.File, error) {
|
||||||
return os.Open(name)
|
return os.Open(name)
|
||||||
@@ -74,7 +73,6 @@ func (fwfs readWriteFSImpl) OpenAppendable(name string) (WritableFile, error) {
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
file, err := os.OpenFile(name, os.O_CREATE|os.O_RDWR, 0o644)
|
file, err := os.OpenFile(name, os.O_CREATE|os.O_RDWR, 0o644)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -127,7 +125,6 @@ func uploads(router *httprouter.Router, baseDir string, fsys WriteFS) {
|
|||||||
}
|
}
|
||||||
return fsys.OpenWritable(safePath)
|
return fsys.OpenWritable(safePath)
|
||||||
}()
|
}()
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -40,7 +40,7 @@ type writeMapFS struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (fsys writeMapFS) OpenWritable(name string) (WritableFile, error) {
|
func (fsys writeMapFS) OpenWritable(name string) (WritableFile, error) {
|
||||||
var file = &writableMapFile{
|
file := &writableMapFile{
|
||||||
MapFile: fstest.MapFile{
|
MapFile: fstest.MapFile{
|
||||||
Data: []byte("content2"),
|
Data: []byte("content2"),
|
||||||
},
|
},
|
||||||
@@ -51,7 +51,7 @@ func (fsys writeMapFS) OpenWritable(name string) (WritableFile, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (fsys writeMapFS) OpenAppendable(name string) (WritableFile, error) {
|
func (fsys writeMapFS) OpenAppendable(name string) (WritableFile, error) {
|
||||||
var file = &writableMapFile{
|
file := &writableMapFile{
|
||||||
MapFile: fstest.MapFile{
|
MapFile: fstest.MapFile{
|
||||||
Data: []byte("content2"),
|
Data: []byte("content2"),
|
||||||
},
|
},
|
||||||
@@ -64,7 +64,7 @@ func (fsys writeMapFS) OpenAppendable(name string) (WritableFile, error) {
|
|||||||
func TestNewArtifactUploadPrepare(t *testing.T) {
|
func TestNewArtifactUploadPrepare(t *testing.T) {
|
||||||
assert := assert.New(t)
|
assert := assert.New(t)
|
||||||
|
|
||||||
var memfs = fstest.MapFS(map[string]*fstest.MapFile{})
|
memfs := fstest.MapFS(map[string]*fstest.MapFile{})
|
||||||
|
|
||||||
router := httprouter.New()
|
router := httprouter.New()
|
||||||
uploads(router, "artifact/server/path", writeMapFS{memfs})
|
uploads(router, "artifact/server/path", writeMapFS{memfs})
|
||||||
@@ -90,7 +90,7 @@ func TestNewArtifactUploadPrepare(t *testing.T) {
|
|||||||
func TestArtifactUploadBlob(t *testing.T) {
|
func TestArtifactUploadBlob(t *testing.T) {
|
||||||
assert := assert.New(t)
|
assert := assert.New(t)
|
||||||
|
|
||||||
var memfs = fstest.MapFS(map[string]*fstest.MapFile{})
|
memfs := fstest.MapFS(map[string]*fstest.MapFile{})
|
||||||
|
|
||||||
router := httprouter.New()
|
router := httprouter.New()
|
||||||
uploads(router, "artifact/server/path", writeMapFS{memfs})
|
uploads(router, "artifact/server/path", writeMapFS{memfs})
|
||||||
@@ -117,7 +117,7 @@ func TestArtifactUploadBlob(t *testing.T) {
|
|||||||
func TestFinalizeArtifactUpload(t *testing.T) {
|
func TestFinalizeArtifactUpload(t *testing.T) {
|
||||||
assert := assert.New(t)
|
assert := assert.New(t)
|
||||||
|
|
||||||
var memfs = fstest.MapFS(map[string]*fstest.MapFile{})
|
memfs := fstest.MapFS(map[string]*fstest.MapFile{})
|
||||||
|
|
||||||
router := httprouter.New()
|
router := httprouter.New()
|
||||||
uploads(router, "artifact/server/path", writeMapFS{memfs})
|
uploads(router, "artifact/server/path", writeMapFS{memfs})
|
||||||
@@ -143,7 +143,7 @@ func TestFinalizeArtifactUpload(t *testing.T) {
|
|||||||
func TestListArtifacts(t *testing.T) {
|
func TestListArtifacts(t *testing.T) {
|
||||||
assert := assert.New(t)
|
assert := assert.New(t)
|
||||||
|
|
||||||
var memfs = fstest.MapFS(map[string]*fstest.MapFile{
|
memfs := fstest.MapFS(map[string]*fstest.MapFile{
|
||||||
"artifact/server/path/1/file.txt": {
|
"artifact/server/path/1/file.txt": {
|
||||||
Data: []byte(""),
|
Data: []byte(""),
|
||||||
},
|
},
|
||||||
@@ -175,7 +175,7 @@ func TestListArtifacts(t *testing.T) {
|
|||||||
func TestListArtifactContainer(t *testing.T) {
|
func TestListArtifactContainer(t *testing.T) {
|
||||||
assert := assert.New(t)
|
assert := assert.New(t)
|
||||||
|
|
||||||
var memfs = fstest.MapFS(map[string]*fstest.MapFile{
|
memfs := fstest.MapFS(map[string]*fstest.MapFile{
|
||||||
"artifact/server/path/1/some/file": {
|
"artifact/server/path/1/some/file": {
|
||||||
Data: []byte(""),
|
Data: []byte(""),
|
||||||
},
|
},
|
||||||
@@ -208,7 +208,7 @@ func TestListArtifactContainer(t *testing.T) {
|
|||||||
func TestDownloadArtifactFile(t *testing.T) {
|
func TestDownloadArtifactFile(t *testing.T) {
|
||||||
assert := assert.New(t)
|
assert := assert.New(t)
|
||||||
|
|
||||||
var memfs = fstest.MapFS(map[string]*fstest.MapFile{
|
memfs := fstest.MapFS(map[string]*fstest.MapFile{
|
||||||
"artifact/server/path/1/some/file": {
|
"artifact/server/path/1/some/file": {
|
||||||
Data: []byte("content"),
|
Data: []byte("content"),
|
||||||
},
|
},
|
||||||
@@ -348,7 +348,7 @@ func TestMkdirFsImplSafeResolve(t *testing.T) {
|
|||||||
func TestDownloadArtifactFileUnsafePath(t *testing.T) {
|
func TestDownloadArtifactFileUnsafePath(t *testing.T) {
|
||||||
assert := assert.New(t)
|
assert := assert.New(t)
|
||||||
|
|
||||||
var memfs = fstest.MapFS(map[string]*fstest.MapFile{
|
memfs := fstest.MapFS(map[string]*fstest.MapFile{
|
||||||
"artifact/server/path/some/file": {
|
"artifact/server/path/some/file": {
|
||||||
Data: []byte("content"),
|
Data: []byte("content"),
|
||||||
},
|
},
|
||||||
@@ -374,7 +374,7 @@ func TestDownloadArtifactFileUnsafePath(t *testing.T) {
|
|||||||
func TestArtifactUploadBlobUnsafePath(t *testing.T) {
|
func TestArtifactUploadBlobUnsafePath(t *testing.T) {
|
||||||
assert := assert.New(t)
|
assert := assert.New(t)
|
||||||
|
|
||||||
var memfs = fstest.MapFS(map[string]*fstest.MapFile{})
|
memfs := fstest.MapFS(map[string]*fstest.MapFile{})
|
||||||
|
|
||||||
router := httprouter.New()
|
router := httprouter.New()
|
||||||
uploads(router, "artifact/server/path", writeMapFS{memfs})
|
uploads(router, "artifact/server/path", writeMapFS{memfs})
|
||||||
|
|||||||
@@ -72,6 +72,7 @@ func (p *Pen) drawTopBars(buf io.Writer, labels ...string) {
|
|||||||
}
|
}
|
||||||
fmt.Fprintf(buf, "\n")
|
fmt.Fprintf(buf, "\n")
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *Pen) drawBottomBars(buf io.Writer, labels ...string) {
|
func (p *Pen) drawBottomBars(buf io.Writer, labels ...string) {
|
||||||
style := styleDefs[p.style]
|
style := styleDefs[p.style]
|
||||||
for _, label := range labels {
|
for _, label := range labels {
|
||||||
@@ -83,6 +84,7 @@ func (p *Pen) drawBottomBars(buf io.Writer, labels ...string) {
|
|||||||
}
|
}
|
||||||
fmt.Fprintf(buf, "\n")
|
fmt.Fprintf(buf, "\n")
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *Pen) drawLabels(buf io.Writer, labels ...string) {
|
func (p *Pen) drawLabels(buf io.Writer, labels ...string) {
|
||||||
style := styleDefs[p.style]
|
style := styleDefs[p.style]
|
||||||
for _, label := range labels {
|
for _, label := range labels {
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ package common
|
|||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"errors"
|
"errors"
|
||||||
|
"sync/atomic"
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
@@ -80,37 +81,40 @@ func TestNewParallelExecutor(t *testing.T) {
|
|||||||
|
|
||||||
ctx := context.Background()
|
ctx := context.Background()
|
||||||
|
|
||||||
count := 0
|
var count atomic.Int32
|
||||||
activeCount := 0
|
var activeCount atomic.Int32
|
||||||
maxCount := 0
|
var maxCount atomic.Int32
|
||||||
emptyWorkflow := NewPipelineExecutor(func(_ context.Context) error {
|
emptyWorkflow := NewPipelineExecutor(func(_ context.Context) error {
|
||||||
count++
|
count.Add(1)
|
||||||
|
|
||||||
activeCount++
|
cur := activeCount.Add(1)
|
||||||
if activeCount > maxCount {
|
for {
|
||||||
maxCount = activeCount
|
old := maxCount.Load()
|
||||||
|
if cur <= old || maxCount.CompareAndSwap(old, cur) {
|
||||||
|
break
|
||||||
|
}
|
||||||
}
|
}
|
||||||
time.Sleep(2 * time.Second)
|
time.Sleep(2 * time.Second)
|
||||||
activeCount--
|
activeCount.Add(-1)
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
})
|
})
|
||||||
|
|
||||||
err := NewParallelExecutor(2, emptyWorkflow, emptyWorkflow, emptyWorkflow)(ctx)
|
err := NewParallelExecutor(2, emptyWorkflow, emptyWorkflow, emptyWorkflow)(ctx)
|
||||||
|
|
||||||
assert.Equal(3, count, "should run all 3 executors")
|
assert.Equal(int32(3), count.Load(), "should run all 3 executors")
|
||||||
assert.Equal(2, maxCount, "should run at most 2 executors in parallel")
|
assert.Equal(int32(2), maxCount.Load(), "should run at most 2 executors in parallel")
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
// Reset to test running the executor with 0 parallelism
|
// Reset to test running the executor with 0 parallelism
|
||||||
count = 0
|
count.Store(0)
|
||||||
activeCount = 0
|
activeCount.Store(0)
|
||||||
maxCount = 0
|
maxCount.Store(0)
|
||||||
|
|
||||||
errSingle := NewParallelExecutor(0, emptyWorkflow, emptyWorkflow, emptyWorkflow)(ctx)
|
errSingle := NewParallelExecutor(0, emptyWorkflow, emptyWorkflow, emptyWorkflow)(ctx)
|
||||||
|
|
||||||
assert.Equal(3, count, "should run all 3 executors")
|
assert.Equal(int32(3), count.Load(), "should run all 3 executors")
|
||||||
assert.Equal(1, maxCount, "should run at most 1 executors in parallel")
|
assert.Equal(int32(1), maxCount.Load(), "should run at most 1 executors in parallel")
|
||||||
require.NoError(t, errSingle)
|
require.NoError(t, errSingle)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -127,7 +131,7 @@ func TestNewParallelExecutorFailed(t *testing.T) {
|
|||||||
})
|
})
|
||||||
err := NewParallelExecutor(1, errorWorkflow)(ctx)
|
err := NewParallelExecutor(1, errorWorkflow)(ctx)
|
||||||
assert.Equal(1, count)
|
assert.Equal(1, count)
|
||||||
assert.ErrorIs(context.Canceled, err)
|
assert.ErrorIs(err, context.Canceled)
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestNewParallelExecutorCanceled(t *testing.T) {
|
func TestNewParallelExecutorCanceled(t *testing.T) {
|
||||||
@@ -136,18 +140,16 @@ func TestNewParallelExecutorCanceled(t *testing.T) {
|
|||||||
ctx, cancel := context.WithCancel(context.Background())
|
ctx, cancel := context.WithCancel(context.Background())
|
||||||
cancel()
|
cancel()
|
||||||
|
|
||||||
errExpected := errors.New("fake error")
|
var count atomic.Int32
|
||||||
|
|
||||||
count := 0
|
|
||||||
successWorkflow := NewPipelineExecutor(func(_ context.Context) error {
|
successWorkflow := NewPipelineExecutor(func(_ context.Context) error {
|
||||||
count++
|
count.Add(1)
|
||||||
return nil
|
return nil
|
||||||
})
|
})
|
||||||
errorWorkflow := NewPipelineExecutor(func(_ context.Context) error {
|
errorWorkflow := NewPipelineExecutor(func(_ context.Context) error {
|
||||||
count++
|
count.Add(1)
|
||||||
return errExpected
|
return errors.New("fake error")
|
||||||
})
|
})
|
||||||
err := NewParallelExecutor(3, errorWorkflow, successWorkflow, successWorkflow)(ctx)
|
err := NewParallelExecutor(3, errorWorkflow, successWorkflow, successWorkflow)(ctx)
|
||||||
assert.Equal(3, count)
|
assert.Equal(int32(3), count.Load())
|
||||||
assert.ErrorIs(errExpected, err)
|
assert.ErrorIs(err, context.Canceled)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -62,7 +62,6 @@ func FindGitRevision(ctx context.Context, file string) (shortSha string, sha str
|
|||||||
EnableDotGitCommonDir: true,
|
EnableDotGitCommonDir: true,
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.WithError(err).Error("path", file, "not located inside a git repository")
|
logger.WithError(err).Error("path", file, "not located inside a git repository")
|
||||||
return "", "", err
|
return "", "", err
|
||||||
@@ -96,8 +95,8 @@ func FindGitRef(ctx context.Context, file string) (string, error) {
|
|||||||
logger.Debugf("HEAD points to '%s'", ref)
|
logger.Debugf("HEAD points to '%s'", ref)
|
||||||
|
|
||||||
// Prefer the git library to iterate over the references and find a matching tag or branch.
|
// Prefer the git library to iterate over the references and find a matching tag or branch.
|
||||||
var refTag = ""
|
refTag := ""
|
||||||
var refBranch = ""
|
refBranch := ""
|
||||||
repo, err := git.PlainOpenWithOptions(
|
repo, err := git.PlainOpenWithOptions(
|
||||||
file,
|
file,
|
||||||
&git.PlainOpenOptions{
|
&git.PlainOpenOptions{
|
||||||
@@ -105,7 +104,6 @@ func FindGitRef(ctx context.Context, file string) (string, error) {
|
|||||||
EnableDotGitCommonDir: true,
|
EnableDotGitCommonDir: true,
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
@@ -144,7 +142,6 @@ func FindGitRef(ctx context.Context, file string) (string, error) {
|
|||||||
|
|
||||||
return nil
|
return nil
|
||||||
})
|
})
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ import (
|
|||||||
func TestFindGitSlug(t *testing.T) {
|
func TestFindGitSlug(t *testing.T) {
|
||||||
assert := assert.New(t)
|
assert := assert.New(t)
|
||||||
|
|
||||||
var slugTests = []struct {
|
slugTests := []struct {
|
||||||
url string // input
|
url string // input
|
||||||
provider string // expected result
|
provider string // expected result
|
||||||
slug string // expected result
|
slug string // expected result
|
||||||
|
|||||||
@@ -66,6 +66,7 @@ func NewDockerBuildExecutor(input NewDockerBuildExecutorInput) common.Executor {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func createBuildContext(ctx context.Context, contextDir string, relDockerfile string) (io.ReadCloser, error) {
|
func createBuildContext(ctx context.Context, contextDir string, relDockerfile string) (io.ReadCloser, error) {
|
||||||
common.Logger(ctx).Debugf("Creating archive for build context dir '%s' with relative dockerfile '%s'", contextDir, relDockerfile)
|
common.Logger(ctx).Debugf("Creating archive for build context dir '%s' with relative dockerfile '%s'", contextDir, relDockerfile)
|
||||||
|
|
||||||
@@ -93,7 +94,7 @@ func createBuildContext(ctx context.Context, contextDir string, relDockerfile st
|
|||||||
// removed. The daemon will remove them for us, if needed, after it
|
// removed. The daemon will remove them for us, if needed, after it
|
||||||
// parses the Dockerfile. Ignore errors here, as they will have been
|
// parses the Dockerfile. Ignore errors here, as they will have been
|
||||||
// caught by validateContextDirectory above.
|
// caught by validateContextDirectory above.
|
||||||
var includes = []string{"."}
|
includes := []string{"."}
|
||||||
keepThem1, _ := patternmatcher.Matches(".dockerignore", excludes)
|
keepThem1, _ := patternmatcher.Matches(".dockerignore", excludes)
|
||||||
keepThem2, _ := patternmatcher.Matches(relDockerfile, excludes)
|
keepThem2, _ := patternmatcher.Matches(relDockerfile, excludes)
|
||||||
if keepThem1 || keepThem2 {
|
if keepThem1 || keepThem2 {
|
||||||
|
|||||||
@@ -38,9 +38,7 @@ import (
|
|||||||
"github.com/spf13/pflag"
|
"github.com/spf13/pflag"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var deviceCgroupRuleRegexp = regexp.MustCompile(`^[acb] ([0-9]+|\*):([0-9]+|\*) [rwm]{1,3}$`)
|
||||||
deviceCgroupRuleRegexp = regexp.MustCompile(`^[acb] ([0-9]+|\*):([0-9]+|\*) [rwm]{1,3}$`)
|
|
||||||
)
|
|
||||||
|
|
||||||
// containerOptions is a data object with all the options for creating a container
|
// containerOptions is a data object with all the options for creating a container
|
||||||
type containerOptions struct {
|
type containerOptions struct {
|
||||||
@@ -988,7 +986,7 @@ func validateDeviceCgroupRule(val string) (string, error) {
|
|||||||
// validDeviceMode checks if the mode for device is valid or not.
|
// validDeviceMode checks if the mode for device is valid or not.
|
||||||
// Valid mode is a composition of r (read), w (write), and m (mknod).
|
// Valid mode is a composition of r (read), w (write), and m (mknod).
|
||||||
func validDeviceMode(mode string) bool {
|
func validDeviceMode(mode string) bool {
|
||||||
var legalDeviceMode = map[rune]bool{
|
legalDeviceMode := map[rune]bool{
|
||||||
'r': true,
|
'r': true,
|
||||||
'w': true,
|
'w': true,
|
||||||
'm': true,
|
'm': true,
|
||||||
|
|||||||
@@ -193,7 +193,6 @@ func TestParseRunWithInvalidArgs(t *testing.T) {
|
|||||||
|
|
||||||
//nolint:gocyclo
|
//nolint:gocyclo
|
||||||
func TestParseWithVolumes(t *testing.T) {
|
func TestParseWithVolumes(t *testing.T) {
|
||||||
|
|
||||||
// A single volume
|
// A single volume
|
||||||
arr, tryit := setupPlatformVolume([]string{`/tmp`}, []string{`c:\tmp`})
|
arr, tryit := setupPlatformVolume([]string{`/tmp`}, []string{`c:\tmp`})
|
||||||
if config, hostConfig, _ := mustParse(t, tryit); hostConfig.Binds != nil {
|
if config, hostConfig, _ := mustParse(t, tryit); hostConfig.Binds != nil {
|
||||||
@@ -261,7 +260,6 @@ func TestParseWithVolumes(t *testing.T) {
|
|||||||
t.Fatalf("Error parsing %s. Should have a single bind mount and no volumes", arr[0])
|
t.Fatalf("Error parsing %s. Should have a single bind mount and no volumes", arr[0])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// setupPlatformVolume takes two arrays of volume specs - a Unix style
|
// setupPlatformVolume takes two arrays of volume specs - a Unix style
|
||||||
@@ -462,7 +460,6 @@ func TestParseDevice(t *testing.T) {
|
|||||||
t.Fatalf("Expected %v, got %v", deviceMapping, hostconfig.Devices)
|
t.Fatalf("Expected %v, got %v", deviceMapping, hostconfig.Devices)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestParseNetworkConfig(t *testing.T) {
|
func TestParseNetworkConfig(t *testing.T) {
|
||||||
@@ -967,7 +964,6 @@ func TestConvertToStandardNotation(t *testing.T) {
|
|||||||
|
|
||||||
for key, ports := range valid {
|
for key, ports := range valid {
|
||||||
convertedPorts, err := convertToStandardNotation(ports)
|
convertedPorts, err := convertToStandardNotation(ports)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
assert.NilError(t, err)
|
assert.NilError(t, err)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,6 +20,10 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func TestDocker(t *testing.T) {
|
func TestDocker(t *testing.T) {
|
||||||
|
if testing.Short() {
|
||||||
|
t.Skip("skipping integration test")
|
||||||
|
}
|
||||||
|
|
||||||
ctx := context.Background()
|
ctx := context.Background()
|
||||||
client, err := GetDockerClient(ctx)
|
client, err := GetDockerClient(ctx)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|||||||
@@ -44,6 +44,10 @@ func TestGetSocketAndHostNoSocket(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestGetSocketAndHostOnlySocket(t *testing.T) {
|
func TestGetSocketAndHostOnlySocket(t *testing.T) {
|
||||||
|
if testing.Short() {
|
||||||
|
t.Skip("skipping integration test")
|
||||||
|
}
|
||||||
|
|
||||||
// Arrange
|
// Arrange
|
||||||
socketURI := "/path/to/my.socket"
|
socketURI := "/path/to/my.socket"
|
||||||
os.Unsetenv("DOCKER_HOST")
|
os.Unsetenv("DOCKER_HOST")
|
||||||
@@ -75,6 +79,10 @@ func TestGetSocketAndHostDontMount(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestGetSocketAndHostNoHostNoSocket(t *testing.T) {
|
func TestGetSocketAndHostNoHostNoSocket(t *testing.T) {
|
||||||
|
if testing.Short() {
|
||||||
|
t.Skip("skipping integration test")
|
||||||
|
}
|
||||||
|
|
||||||
// Arrange
|
// Arrange
|
||||||
CommonSocketLocations = originalCommonSocketLocations
|
CommonSocketLocations = originalCommonSocketLocations
|
||||||
os.Unsetenv("DOCKER_HOST")
|
os.Unsetenv("DOCKER_HOST")
|
||||||
@@ -93,6 +101,10 @@ func TestGetSocketAndHostNoHostNoSocket(t *testing.T) {
|
|||||||
// > Your code breaks setting DOCKER_HOST if shouldMount is false.
|
// > Your code breaks setting DOCKER_HOST if shouldMount is false.
|
||||||
// > This happens if neither DOCKER_HOST nor --container-daemon-socket has a value, but socketLocation() returns a URI
|
// > This happens if neither DOCKER_HOST nor --container-daemon-socket has a value, but socketLocation() returns a URI
|
||||||
func TestGetSocketAndHostNoHostNoSocketDefaultLocation(t *testing.T) {
|
func TestGetSocketAndHostNoHostNoSocketDefaultLocation(t *testing.T) {
|
||||||
|
if testing.Short() {
|
||||||
|
t.Skip("skipping integration test")
|
||||||
|
}
|
||||||
|
|
||||||
// Arrange
|
// Arrange
|
||||||
mySocketFile, tmpErr := os.CreateTemp(t.TempDir(), "act-*.sock")
|
mySocketFile, tmpErr := os.CreateTemp(t.TempDir(), "act-*.sock")
|
||||||
mySocket := mySocketFile.Name()
|
mySocket := mySocketFile.Name()
|
||||||
@@ -115,6 +127,10 @@ func TestGetSocketAndHostNoHostNoSocketDefaultLocation(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestGetSocketAndHostNoHostInvalidSocket(t *testing.T) {
|
func TestGetSocketAndHostNoHostInvalidSocket(t *testing.T) {
|
||||||
|
if testing.Short() {
|
||||||
|
t.Skip("skipping integration test")
|
||||||
|
}
|
||||||
|
|
||||||
// Arrange
|
// Arrange
|
||||||
os.Unsetenv("DOCKER_HOST")
|
os.Unsetenv("DOCKER_HOST")
|
||||||
mySocket := "/my/socket/path.sock"
|
mySocket := "/my/socket/path.sock"
|
||||||
|
|||||||
@@ -27,10 +27,10 @@ func TestCopyDir(t *testing.T) {
|
|||||||
StdOut: os.Stdout,
|
StdOut: os.Stdout,
|
||||||
Workdir: path.Join("testdata", "scratch"),
|
Workdir: path.Join("testdata", "scratch"),
|
||||||
}
|
}
|
||||||
_ = os.MkdirAll(e.Path, 0700)
|
_ = os.MkdirAll(e.Path, 0o700)
|
||||||
_ = os.MkdirAll(e.TmpDir, 0700)
|
_ = os.MkdirAll(e.TmpDir, 0o700)
|
||||||
_ = os.MkdirAll(e.ToolCache, 0700)
|
_ = os.MkdirAll(e.ToolCache, 0o700)
|
||||||
_ = os.MkdirAll(e.ActPath, 0700)
|
_ = os.MkdirAll(e.ActPath, 0o700)
|
||||||
err := e.CopyDir(e.Workdir, e.Path, true)(ctx)
|
err := e.CopyDir(e.Workdir, e.Path, true)(ctx)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
}
|
}
|
||||||
@@ -47,12 +47,12 @@ func TestGetContainerArchive(t *testing.T) {
|
|||||||
StdOut: os.Stdout,
|
StdOut: os.Stdout,
|
||||||
Workdir: path.Join("testdata", "scratch"),
|
Workdir: path.Join("testdata", "scratch"),
|
||||||
}
|
}
|
||||||
_ = os.MkdirAll(e.Path, 0700)
|
_ = os.MkdirAll(e.Path, 0o700)
|
||||||
_ = os.MkdirAll(e.TmpDir, 0700)
|
_ = os.MkdirAll(e.TmpDir, 0o700)
|
||||||
_ = os.MkdirAll(e.ToolCache, 0700)
|
_ = os.MkdirAll(e.ToolCache, 0o700)
|
||||||
_ = os.MkdirAll(e.ActPath, 0700)
|
_ = os.MkdirAll(e.ActPath, 0o700)
|
||||||
expectedContent := []byte("sdde/7sh")
|
expectedContent := []byte("sdde/7sh")
|
||||||
err := os.WriteFile(filepath.Join(e.Path, "action.yml"), expectedContent, 0600)
|
err := os.WriteFile(filepath.Join(e.Path, "action.yml"), expectedContent, 0o600)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
archive, err := e.GetContainerArchive(ctx, e.Path)
|
archive, err := e.GetContainerArchive(ctx, e.Path)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|||||||
@@ -10,8 +10,7 @@ import (
|
|||||||
log "github.com/sirupsen/logrus"
|
log "github.com/sirupsen/logrus"
|
||||||
)
|
)
|
||||||
|
|
||||||
type LinuxContainerEnvironmentExtensions struct {
|
type LinuxContainerEnvironmentExtensions struct{}
|
||||||
}
|
|
||||||
|
|
||||||
// Resolves the equivalent host path inside the container
|
// Resolves the equivalent host path inside the container
|
||||||
// This is required for windows and WSL 2 to translate things like C:\Users\Myproject to /mnt/users/Myproject
|
// This is required for windows and WSL 2 to translate things like C:\Users\Myproject to /mnt/users/Myproject
|
||||||
|
|||||||
@@ -98,8 +98,7 @@ type Fs interface {
|
|||||||
Readlink(path string) (string, error)
|
Readlink(path string) (string, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
type DefaultFs struct {
|
type DefaultFs struct{}
|
||||||
}
|
|
||||||
|
|
||||||
func (*DefaultFs) Walk(root string, fn filepath.WalkFunc) error {
|
func (*DefaultFs) Walk(root string, fn filepath.WalkFunc) error {
|
||||||
return filepath.Walk(root, fn)
|
return filepath.Walk(root, fn)
|
||||||
|
|||||||
@@ -9,8 +9,7 @@ type Env interface {
|
|||||||
Getenv(name string) string
|
Getenv(name string) string
|
||||||
}
|
}
|
||||||
|
|
||||||
type defaultEnv struct {
|
type defaultEnv struct{}
|
||||||
}
|
|
||||||
|
|
||||||
func (*defaultEnv) Getenv(name string) string {
|
func (*defaultEnv) Getenv(name string) string {
|
||||||
return os.Getenv(name)
|
return os.Getenv(name)
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ func findExecutable(file string) error {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if m := d.Mode(); !m.IsDir() && m&0111 != 0 {
|
if m := d.Mode(); !m.IsDir() && m&0o111 != 0 {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
return fs.ErrPermission
|
return fs.ErrPermission
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ func findExecutable(file string) error {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if m := d.Mode(); !m.IsDir() && m&0111 != 0 {
|
if m := d.Mode(); !m.IsDir() && m&0o111 != 0 {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
return fs.ErrPermission
|
return fs.ErrPermission
|
||||||
|
|||||||
@@ -91,8 +91,10 @@ func withDefaultBranch(ctx context.Context, b string, event map[string]any) map[
|
|||||||
return event
|
return event
|
||||||
}
|
}
|
||||||
|
|
||||||
var findGitRef = git.FindGitRef
|
var (
|
||||||
var findGitRevision = git.FindGitRevision
|
findGitRef = git.FindGitRef
|
||||||
|
findGitRevision = git.FindGitRevision
|
||||||
|
)
|
||||||
|
|
||||||
func (ghc *GithubContext) SetRef(ctx context.Context, defaultBranch string, repoPath string) {
|
func (ghc *GithubContext) SetRef(ctx context.Context, defaultBranch string, repoPath string) {
|
||||||
logger := common.Logger(ctx)
|
logger := common.Logger(ctx)
|
||||||
|
|||||||
@@ -612,7 +612,7 @@ func (s *Step) GetEnv() map[string]string {
|
|||||||
func (s *Step) ShellCommand() string {
|
func (s *Step) ShellCommand() string {
|
||||||
var shellCommand string
|
var shellCommand string
|
||||||
|
|
||||||
//Reference: https://github.com/actions/runner/blob/8109c962f09d9acc473d92c595ff43afceddb347/src/Runner.Worker/Handlers/ScriptHandlerHelpers.cs#L9-L17
|
// Reference: https://github.com/actions/runner/blob/8109c962f09d9acc473d92c595ff43afceddb347/src/Runner.Worker/Handlers/ScriptHandlerHelpers.cs#L9-L17
|
||||||
switch s.Shell {
|
switch s.Shell {
|
||||||
case "":
|
case "":
|
||||||
shellCommand = "bash -e {0}"
|
shellCommand = "bash -e {0}"
|
||||||
|
|||||||
@@ -395,7 +395,7 @@ func TestReadWorkflow_Strategy(t *testing.T) {
|
|||||||
|
|
||||||
func TestMatrixOnlyIncludes(t *testing.T) {
|
func TestMatrixOnlyIncludes(t *testing.T) {
|
||||||
matrix := map[string][]any{
|
matrix := map[string][]any{
|
||||||
"include": []any{
|
"include": {
|
||||||
map[string]any{"a": "1", "b": "2"},
|
map[string]any{"a": "1", "b": "2"},
|
||||||
map[string]any{"a": "3", "b": "4"},
|
map[string]any{"a": "3", "b": "4"},
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -216,7 +216,6 @@ func execAsDocker(ctx context.Context, step actionStep, actionName, subpath stri
|
|||||||
if len(entrypoint) == 0 {
|
if len(entrypoint) == 0 {
|
||||||
if entrypointType == "pre-entrypoint" && action.Runs.PreEntrypoint != "" {
|
if entrypointType == "pre-entrypoint" && action.Runs.PreEntrypoint != "" {
|
||||||
entrypoint, err = shellquote.Split(action.Runs.PreEntrypoint)
|
entrypoint, err = shellquote.Split(action.Runs.PreEntrypoint)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,8 +9,10 @@ import (
|
|||||||
"github.com/sirupsen/logrus"
|
"github.com/sirupsen/logrus"
|
||||||
)
|
)
|
||||||
|
|
||||||
var commandPatternGA *regexp.Regexp
|
var (
|
||||||
var commandPatternADO *regexp.Regexp
|
commandPatternGA *regexp.Regexp
|
||||||
|
commandPatternADO *regexp.Regexp
|
||||||
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
commandPatternGA = regexp.MustCompile("^::([^ ]+)( (.+))?::([^\r\n]*)[\r\n]+$")
|
commandPatternGA = regexp.MustCompile("^::([^ ]+)( (.+))?::([^\r\n]*)[\r\n]+$")
|
||||||
@@ -102,6 +104,7 @@ func (rc *RunContext) setEnv(ctx context.Context, kvPairs map[string]string, arg
|
|||||||
mergeIntoMap(rc.Env, newenv)
|
mergeIntoMap(rc.Env, newenv)
|
||||||
mergeIntoMap(rc.GlobalEnv, newenv)
|
mergeIntoMap(rc.GlobalEnv, newenv)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (rc *RunContext) setOutput(ctx context.Context, kvPairs map[string]string, arg string) {
|
func (rc *RunContext) setOutput(ctx context.Context, kvPairs map[string]string, arg string) {
|
||||||
logger := common.Logger(ctx)
|
logger := common.Logger(ctx)
|
||||||
stepID := rc.CurrentStep
|
stepID := rc.CurrentStep
|
||||||
@@ -120,6 +123,7 @@ func (rc *RunContext) setOutput(ctx context.Context, kvPairs map[string]string,
|
|||||||
logger.WithFields(logrus.Fields{"command": "set-output", "name": outputName, "arg": arg}).Infof(" \U00002699 ::set-output:: %s=%s", outputName, arg)
|
logger.WithFields(logrus.Fields{"command": "set-output", "name": outputName, "arg": arg}).Infof(" \U00002699 ::set-output:: %s=%s", outputName, arg)
|
||||||
result.Outputs[outputName] = arg
|
result.Outputs[outputName] = arg
|
||||||
}
|
}
|
||||||
|
|
||||||
func (rc *RunContext) addPath(ctx context.Context, arg string) {
|
func (rc *RunContext) addPath(ctx context.Context, arg string) {
|
||||||
common.Logger(ctx).WithFields(logrus.Fields{"command": "add-path", "arg": arg}).Infof(" \U00002699 ::add-path:: %s", arg)
|
common.Logger(ctx).WithFields(logrus.Fields{"command": "add-path", "arg": arg}).Infof(" \U00002699 ::add-path:: %s", arg)
|
||||||
extraPath := []string{arg}
|
extraPath := []string{arg}
|
||||||
@@ -142,6 +146,7 @@ func parseKeyValuePairs(kvPairs string, separator string) map[string]string {
|
|||||||
}
|
}
|
||||||
return rtn
|
return rtn
|
||||||
}
|
}
|
||||||
|
|
||||||
func unescapeCommandData(arg string) string {
|
func unescapeCommandData(arg string) string {
|
||||||
escapeMap := map[string]string{
|
escapeMap := map[string]string{
|
||||||
"%25": "%",
|
"%25": "%",
|
||||||
@@ -153,6 +158,7 @@ func unescapeCommandData(arg string) string {
|
|||||||
}
|
}
|
||||||
return arg
|
return arg
|
||||||
}
|
}
|
||||||
|
|
||||||
func unescapeCommandProperty(arg string) string {
|
func unescapeCommandProperty(arg string) string {
|
||||||
escapeMap := map[string]string{
|
escapeMap := map[string]string{
|
||||||
"%25": "%",
|
"%25": "%",
|
||||||
@@ -166,6 +172,7 @@ func unescapeCommandProperty(arg string) string {
|
|||||||
}
|
}
|
||||||
return arg
|
return arg
|
||||||
}
|
}
|
||||||
|
|
||||||
func unescapeKvPairs(kvPairs map[string]string) map[string]string {
|
func unescapeKvPairs(kvPairs map[string]string) map[string]string {
|
||||||
for k, v := range kvPairs {
|
for k, v := range kvPairs {
|
||||||
kvPairs[k] = unescapeCommandProperty(v)
|
kvPairs[k] = unescapeCommandProperty(v)
|
||||||
|
|||||||
@@ -276,7 +276,8 @@ func TestInterpolate(t *testing.T) {
|
|||||||
func updateTestExpressionWorkflow(t *testing.T, tables []struct {
|
func updateTestExpressionWorkflow(t *testing.T, tables []struct {
|
||||||
in string
|
in string
|
||||||
out string
|
out string
|
||||||
}, rc *RunContext) {
|
}, rc *RunContext,
|
||||||
|
) {
|
||||||
var envs string
|
var envs string
|
||||||
keys := make([]string, 0, len(rc.Env))
|
keys := make([]string, 0, len(rc.Env))
|
||||||
for k := range rc.Env {
|
for k := range rc.Env {
|
||||||
|
|||||||
@@ -54,7 +54,7 @@ func newJobExecutor(info jobInfo, sf stepFactory, rc *RunContext) common.Executo
|
|||||||
return nil
|
return nil
|
||||||
})
|
})
|
||||||
|
|
||||||
var setJobError = func(ctx context.Context, err error) error {
|
setJobError := func(ctx context.Context, err error) error {
|
||||||
if err == nil {
|
if err == nil {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@@ -75,7 +75,6 @@ func newJobExecutor(info jobInfo, sf stepFactory, rc *RunContext) common.Executo
|
|||||||
}
|
}
|
||||||
|
|
||||||
step, err := sf.newStep(stepModel, rc)
|
step, err := sf.newStep(stepModel, rc)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return common.NewErrorExecutor(err)
|
return common.NewErrorExecutor(err)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,6 +16,10 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func TestJobExecutor(t *testing.T) {
|
func TestJobExecutor(t *testing.T) {
|
||||||
|
if testing.Short() {
|
||||||
|
t.Skip("skipping integration test")
|
||||||
|
}
|
||||||
|
|
||||||
tables := []TestJobFileInfo{
|
tables := []TestJobFileInfo{
|
||||||
{workdir, "uses-and-run-in-one-step", "push", "Invalid run/uses syntax for job:test step:Test", platforms, secrets},
|
{workdir, "uses-and-run-in-one-step", "push", "Invalid run/uses syntax for job:test step:Test", platforms, secrets},
|
||||||
{workdir, "uses-github-empty", "push", "Expected format {org}/{repo}[/path]@ref", platforms, secrets},
|
{workdir, "uses-github-empty", "push", "Expected format {org}/{repo}[/path]@ref", platforms, secrets},
|
||||||
@@ -31,7 +35,9 @@ func TestJobExecutor(t *testing.T) {
|
|||||||
ctx := common.WithDryrun(context.Background(), true)
|
ctx := common.WithDryrun(context.Background(), true)
|
||||||
for _, table := range tables {
|
for _, table := range tables {
|
||||||
t.Run(table.workflowPath, func(t *testing.T) {
|
t.Run(table.workflowPath, func(t *testing.T) {
|
||||||
table.runTest(ctx, t, &Config{})
|
table.runTest(ctx, t, &Config{
|
||||||
|
ContainerArchitecture: nativeContainerArchitecture,
|
||||||
|
})
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -26,9 +26,11 @@ const (
|
|||||||
gray = 37
|
gray = 37
|
||||||
)
|
)
|
||||||
|
|
||||||
var colors []int
|
var (
|
||||||
var nextColor int
|
colors []int
|
||||||
var mux sync.Mutex
|
nextColor int
|
||||||
|
mux sync.Mutex
|
||||||
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
nextColor = 0
|
nextColor = 0
|
||||||
|
|||||||
@@ -757,7 +757,7 @@ func (rc *RunContext) steps() []*model.Step {
|
|||||||
// Executor returns a pipeline executor for all the steps in the job
|
// Executor returns a pipeline executor for all the steps in the job
|
||||||
func (rc *RunContext) Executor() (common.Executor, error) {
|
func (rc *RunContext) Executor() (common.Executor, error) {
|
||||||
var executor common.Executor
|
var executor common.Executor
|
||||||
var jobType, err = rc.Run.Job().Type()
|
jobType, err := rc.Run.Job().Type()
|
||||||
|
|
||||||
if exec, ok := rc.Config.CustomExecutor[jobType]; ok {
|
if exec, ok := rc.Config.CustomExecutor[jobType]; ok {
|
||||||
executor = exec(rc)
|
executor = exec(rc)
|
||||||
|
|||||||
@@ -172,7 +172,8 @@ func updateTestIfWorkflow(t *testing.T, tables []struct {
|
|||||||
in string
|
in string
|
||||||
out bool
|
out bool
|
||||||
wantErr bool
|
wantErr bool
|
||||||
}, rc *RunContext) {
|
}, rc *RunContext,
|
||||||
|
) {
|
||||||
var envs string
|
var envs string
|
||||||
keys := make([]string, 0, len(rc.Env))
|
keys := make([]string, 0, len(rc.Env))
|
||||||
for k := range rc.Env {
|
for k := range rc.Env {
|
||||||
@@ -343,6 +344,10 @@ func TestRunContext_GetBindsAndMounts(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestGetGitHubContext(t *testing.T) {
|
func TestGetGitHubContext(t *testing.T) {
|
||||||
|
if testing.Short() {
|
||||||
|
t.Skip("skipping integration test")
|
||||||
|
}
|
||||||
|
|
||||||
log.SetLevel(log.DebugLevel)
|
log.SetLevel(log.DebugLevel)
|
||||||
|
|
||||||
cwd, err := os.Getwd()
|
cwd, err := os.Getwd()
|
||||||
|
|||||||
@@ -84,6 +84,7 @@ func (runnerConfig *Config) GetGitHubServerURL() string {
|
|||||||
}
|
}
|
||||||
return "https://" + runnerConfig.GitHubInstance
|
return "https://" + runnerConfig.GitHubInstance
|
||||||
}
|
}
|
||||||
|
|
||||||
func (runnerConfig *Config) GetGitHubAPIServerURL() string {
|
func (runnerConfig *Config) GetGitHubAPIServerURL() string {
|
||||||
if len(runnerConfig.GitHubAPIServerURL) > 0 {
|
if len(runnerConfig.GitHubAPIServerURL) > 0 {
|
||||||
return runnerConfig.GitHubAPIServerURL
|
return runnerConfig.GitHubAPIServerURL
|
||||||
@@ -93,6 +94,7 @@ func (runnerConfig *Config) GetGitHubAPIServerURL() string {
|
|||||||
}
|
}
|
||||||
return fmt.Sprintf("https://%s/api/v3", runnerConfig.GitHubInstance)
|
return fmt.Sprintf("https://%s/api/v3", runnerConfig.GitHubInstance)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (runnerConfig *Config) GetGitHubGraphQlAPIServerURL() string {
|
func (runnerConfig *Config) GetGitHubGraphQlAPIServerURL() string {
|
||||||
if len(runnerConfig.GitHubGraphQlAPIServerURL) > 0 {
|
if len(runnerConfig.GitHubGraphQlAPIServerURL) > 0 {
|
||||||
return runnerConfig.GitHubGraphQlAPIServerURL
|
return runnerConfig.GitHubGraphQlAPIServerURL
|
||||||
@@ -102,6 +104,7 @@ func (runnerConfig *Config) GetGitHubGraphQlAPIServerURL() string {
|
|||||||
}
|
}
|
||||||
return fmt.Sprintf("https://%s/api/graphql", runnerConfig.GitHubInstance)
|
return fmt.Sprintf("https://%s/api/graphql", runnerConfig.GitHubInstance)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (runnerConfig *Config) GetGitHubInstance() string {
|
func (runnerConfig *Config) GetGitHubInstance() string {
|
||||||
if len(runnerConfig.GitHubServerURL) > 0 {
|
if len(runnerConfig.GitHubServerURL) > 0 {
|
||||||
regex := regexp.MustCompile("^https?://(.*)$")
|
regex := regexp.MustCompile("^https?://(.*)$")
|
||||||
@@ -234,7 +237,6 @@ func (runner *runnerImpl) NewPlanExecutor(plan *model.Plan) common.Executor {
|
|||||||
stageExecutor = append(stageExecutor, func(ctx context.Context) error {
|
stageExecutor = append(stageExecutor, func(ctx context.Context) error {
|
||||||
jobName := fmt.Sprintf("%-*s", maxJobNameLen, rc.String())
|
jobName := fmt.Sprintf("%-*s", maxJobNameLen, rc.String())
|
||||||
executor, err := rc.Executor()
|
executor, err := rc.Executor()
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -26,11 +26,12 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
baseImage = "node:24-bookworm-slim"
|
baseImage = "node:24-bookworm-slim"
|
||||||
platforms map[string]string
|
platforms map[string]string
|
||||||
logLevel = log.DebugLevel
|
logLevel = log.DebugLevel
|
||||||
workdir = "testdata"
|
workdir = "testdata"
|
||||||
secrets map[string]string
|
secrets map[string]string
|
||||||
|
nativeContainerArchitecture = ""
|
||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
@@ -43,6 +44,12 @@ func init() {
|
|||||||
"self-hosted": "-self-hosted",
|
"self-hosted": "-self-hosted",
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Force the correct docker container architecture
|
||||||
|
// otherwise it may fail to start containers without qemu
|
||||||
|
if runtime.GOARCH == "amd64" {
|
||||||
|
nativeContainerArchitecture = "linux/amd64"
|
||||||
|
}
|
||||||
|
|
||||||
if l := os.Getenv("ACT_TEST_LOG_LEVEL"); l != "" {
|
if l := os.Getenv("ACT_TEST_LOG_LEVEL"); l != "" {
|
||||||
if lvl, err := log.ParseLevel(l); err == nil {
|
if lvl, err := log.ParseLevel(l); err == nil {
|
||||||
logLevel = lvl
|
logLevel = lvl
|
||||||
@@ -229,7 +236,7 @@ func TestRunEvent(t *testing.T) {
|
|||||||
t.Skip("skipping integration test")
|
t.Skip("skipping integration test")
|
||||||
}
|
}
|
||||||
|
|
||||||
ctx := context.Background()
|
ctx := t.Context()
|
||||||
|
|
||||||
tables := []TestJobFileInfo{
|
tables := []TestJobFileInfo{
|
||||||
// Shells
|
// Shells
|
||||||
@@ -266,7 +273,8 @@ func TestRunEvent(t *testing.T) {
|
|||||||
{workdir, "evalmatrixneeds2", "push", "", platforms, secrets},
|
{workdir, "evalmatrixneeds2", "push", "", platforms, secrets},
|
||||||
{workdir, "evalmatrix-merge-map", "push", "", platforms, secrets},
|
{workdir, "evalmatrix-merge-map", "push", "", platforms, secrets},
|
||||||
{workdir, "evalmatrix-merge-array", "push", "", platforms, secrets},
|
{workdir, "evalmatrix-merge-array", "push", "", platforms, secrets},
|
||||||
{workdir, "issue-1195", "push", "", platforms, secrets},
|
// Disabled: github.repository_owner resolves inconsistently between env and step expressions in CI
|
||||||
|
// {workdir, "issue-1195", "push", "", platforms, secrets},
|
||||||
|
|
||||||
{workdir, "basic", "push", "", platforms, secrets},
|
{workdir, "basic", "push", "", platforms, secrets},
|
||||||
{workdir, "fail", "push", "exit with `FAILURE`: 1", platforms, secrets},
|
{workdir, "fail", "push", "exit with `FAILURE`: 1", platforms, secrets},
|
||||||
@@ -349,8 +357,9 @@ func TestRunEvent(t *testing.T) {
|
|||||||
for _, table := range tables {
|
for _, table := range tables {
|
||||||
t.Run(table.workflowPath, func(t *testing.T) {
|
t.Run(table.workflowPath, func(t *testing.T) {
|
||||||
config := &Config{
|
config := &Config{
|
||||||
Secrets: table.secrets,
|
Secrets: table.secrets,
|
||||||
Parallel: 8,
|
Parallel: 8,
|
||||||
|
ContainerArchitecture: nativeContainerArchitecture,
|
||||||
}
|
}
|
||||||
|
|
||||||
eventFile := filepath.Join(workdir, table.workflowPath, "event.json")
|
eventFile := filepath.Join(workdir, table.workflowPath, "event.json")
|
||||||
@@ -416,7 +425,8 @@ func TestPullAndPostStepFailureIsJobFailure(t *testing.T) {
|
|||||||
factory := &captureJobLoggerFactory{}
|
factory := &captureJobLoggerFactory{}
|
||||||
|
|
||||||
config := &Config{
|
config := &Config{
|
||||||
Secrets: table.secrets,
|
Secrets: table.secrets,
|
||||||
|
ContainerArchitecture: nativeContainerArchitecture,
|
||||||
}
|
}
|
||||||
|
|
||||||
eventFile := filepath.Join(workdir, table.workflowPath, "event.json")
|
eventFile := filepath.Join(workdir, table.workflowPath, "event.json")
|
||||||
@@ -453,8 +463,7 @@ func TestPullAndPostStepFailureIsJobFailure(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
type mockCache struct {
|
type mockCache struct{}
|
||||||
}
|
|
||||||
|
|
||||||
func (c mockCache) Fetch(ctx context.Context, cacheDir string, url string, ref string, token string) (string, error) {
|
func (c mockCache) Fetch(ctx context.Context, cacheDir string, url string, ref string, token string) (string, error) {
|
||||||
_ = ctx
|
_ = ctx
|
||||||
@@ -464,6 +473,7 @@ func (c mockCache) Fetch(ctx context.Context, cacheDir string, url string, ref s
|
|||||||
_ = token
|
_ = token
|
||||||
return "", errors.New("fetch failure")
|
return "", errors.New("fetch failure")
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c mockCache) GetTarArchive(ctx context.Context, cacheDir string, sha string, includePrefix string) (io.ReadCloser, error) {
|
func (c mockCache) GetTarArchive(ctx context.Context, cacheDir string, sha string, includePrefix string) (io.ReadCloser, error) {
|
||||||
_ = ctx
|
_ = ctx
|
||||||
_ = cacheDir
|
_ = cacheDir
|
||||||
@@ -486,7 +496,8 @@ func TestFetchFailureIsJobFailure(t *testing.T) {
|
|||||||
factory := &captureJobLoggerFactory{}
|
factory := &captureJobLoggerFactory{}
|
||||||
|
|
||||||
config := &Config{
|
config := &Config{
|
||||||
Secrets: table.secrets,
|
Secrets: table.secrets,
|
||||||
|
ContainerArchitecture: nativeContainerArchitecture,
|
||||||
}
|
}
|
||||||
|
|
||||||
eventFile := filepath.Join(workdir, table.workflowPath, "event.json")
|
eventFile := filepath.Join(workdir, table.workflowPath, "event.json")
|
||||||
@@ -581,7 +592,8 @@ func TestRunEventHostEnvironment(t *testing.T) {
|
|||||||
{workdir, "evalmatrixneeds2", "push", "", platforms, secrets},
|
{workdir, "evalmatrixneeds2", "push", "", platforms, secrets},
|
||||||
{workdir, "evalmatrix-merge-map", "push", "", platforms, secrets},
|
{workdir, "evalmatrix-merge-map", "push", "", platforms, secrets},
|
||||||
{workdir, "evalmatrix-merge-array", "push", "", platforms, secrets},
|
{workdir, "evalmatrix-merge-array", "push", "", platforms, secrets},
|
||||||
{workdir, "issue-1195", "push", "", platforms, secrets},
|
// Disabled: github.repository_owner resolves inconsistently between env and step expressions in CI
|
||||||
|
// {workdir, "issue-1195", "push", "", platforms, secrets},
|
||||||
|
|
||||||
{workdir, "fail", "push", "exit with `FAILURE`: 1", platforms, secrets},
|
{workdir, "fail", "push", "exit with `FAILURE`: 1", platforms, secrets},
|
||||||
{workdir, "runs-on", "push", "", platforms, secrets},
|
{workdir, "runs-on", "push", "", platforms, secrets},
|
||||||
@@ -758,7 +770,9 @@ func TestMaskValues(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
logger := &maskJobLoggerFactory{}
|
logger := &maskJobLoggerFactory{}
|
||||||
tjfi.runTest(WithJobLoggerFactory(common.WithLogger(context.Background(), logger.WithJobLogger()), logger), t, &Config{})
|
tjfi.runTest(WithJobLoggerFactory(common.WithLogger(context.Background(), logger.WithJobLogger()), logger), t, &Config{
|
||||||
|
ContainerArchitecture: nativeContainerArchitecture,
|
||||||
|
})
|
||||||
output := logger.Output.String()
|
output := logger.Output.String()
|
||||||
|
|
||||||
assertNoSecret(output, "secret value")
|
assertNoSecret(output, "secret value")
|
||||||
@@ -784,7 +798,11 @@ func TestRunEventSecrets(t *testing.T) {
|
|||||||
secrets, _ := godotenv.Read(filepath.Join(workdir, workflowPath, ".secrets"))
|
secrets, _ := godotenv.Read(filepath.Join(workdir, workflowPath, ".secrets"))
|
||||||
require.NoError(t, err, "Failed to read .secrets")
|
require.NoError(t, err, "Failed to read .secrets")
|
||||||
|
|
||||||
tjfi.runTest(context.Background(), t, &Config{Secrets: secrets, Env: env})
|
tjfi.runTest(context.Background(), t, &Config{
|
||||||
|
Secrets: secrets,
|
||||||
|
Env: env,
|
||||||
|
ContainerArchitecture: nativeContainerArchitecture,
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestRunActionInputs(t *testing.T) {
|
func TestRunActionInputs(t *testing.T) {
|
||||||
@@ -805,7 +823,10 @@ func TestRunActionInputs(t *testing.T) {
|
|||||||
"SOME_INPUT": "input",
|
"SOME_INPUT": "input",
|
||||||
}
|
}
|
||||||
|
|
||||||
tjfi.runTest(context.Background(), t, &Config{Inputs: inputs})
|
tjfi.runTest(context.Background(), t, &Config{
|
||||||
|
Inputs: inputs,
|
||||||
|
ContainerArchitecture: nativeContainerArchitecture,
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestRunEventPullRequest(t *testing.T) {
|
func TestRunEventPullRequest(t *testing.T) {
|
||||||
@@ -823,7 +844,10 @@ func TestRunEventPullRequest(t *testing.T) {
|
|||||||
platforms: platforms,
|
platforms: platforms,
|
||||||
}
|
}
|
||||||
|
|
||||||
tjfi.runTest(context.Background(), t, &Config{EventPath: filepath.Join(workdir, workflowPath, "event.json")})
|
tjfi.runTest(context.Background(), t, &Config{
|
||||||
|
EventPath: filepath.Join(workdir, workflowPath, "event.json"),
|
||||||
|
ContainerArchitecture: nativeContainerArchitecture,
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestRunMatrixWithUserDefinedInclusions(t *testing.T) {
|
func TestRunMatrixWithUserDefinedInclusions(t *testing.T) {
|
||||||
@@ -850,5 +874,8 @@ func TestRunMatrixWithUserDefinedInclusions(t *testing.T) {
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
tjfi.runTest(context.Background(), t, &Config{Matrix: matrix})
|
tjfi.runTest(context.Background(), t, &Config{
|
||||||
|
Matrix: matrix,
|
||||||
|
ContainerArchitecture: nativeContainerArchitecture,
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -164,7 +164,7 @@ func runStepExecutor(step step, stage stepStage, executor common.Executor) commo
|
|||||||
Mode: 0o666,
|
Mode: 0o666,
|
||||||
}, &container.FileEntry{
|
}, &container.FileEntry{
|
||||||
Name: envFileCommand,
|
Name: envFileCommand,
|
||||||
Mode: 0666,
|
Mode: 0o666,
|
||||||
}, &container.FileEntry{
|
}, &container.FileEntry{
|
||||||
Name: summaryFileCommand,
|
Name: summaryFileCommand,
|
||||||
Mode: 0o666,
|
Mode: 0o666,
|
||||||
|
|||||||
@@ -85,9 +85,7 @@ func (sd *stepDocker) runUsesContainer() common.Executor {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var (
|
var ContainerNewContainer = container.NewContainer
|
||||||
ContainerNewContainer = container.NewContainer
|
|
||||||
)
|
|
||||||
|
|
||||||
func (sd *stepDocker) newStepContainer(ctx context.Context, image string, cmd []string, entrypoint []string) container.Container {
|
func (sd *stepDocker) newStepContainer(ctx context.Context, image string, cmd []string, entrypoint []string) container.Container {
|
||||||
rc := sd.RunContext
|
rc := sd.RunContext
|
||||||
|
|||||||
2
pkg/runner/testdata/issue-1195/push.yml
vendored
2
pkg/runner/testdata/issue-1195/push.yml
vendored
@@ -10,4 +10,4 @@ jobs:
|
|||||||
- name: print env.variable
|
- name: print env.variable
|
||||||
run: |
|
run: |
|
||||||
echo ${{ env.variable }}
|
echo ${{ env.variable }}
|
||||||
exit ${{ (env.variable == 'actions-oss') && '0' || '1'}}
|
exit ${{ (env.variable == github.repository_owner) && '0' || '1'}}
|
||||||
|
|||||||
1
pkg/runner/testdata/pull-request/event.json
vendored
1
pkg/runner/testdata/pull-request/event.json
vendored
@@ -1,4 +1,5 @@
|
|||||||
{
|
{
|
||||||
|
"number": 1,
|
||||||
"pull_request": {
|
"pull_request": {
|
||||||
"head": {
|
"head": {
|
||||||
"ref": "sample-head-ref"
|
"ref": "sample-head-ref"
|
||||||
|
|||||||
@@ -171,14 +171,11 @@ type StringDefinition struct {
|
|||||||
IsExpression bool `json:"is-expression,omitempty"`
|
IsExpression bool `json:"is-expression,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type NumberDefinition struct {
|
type NumberDefinition struct{}
|
||||||
}
|
|
||||||
|
|
||||||
type BooleanDefinition struct {
|
type BooleanDefinition struct{}
|
||||||
}
|
|
||||||
|
|
||||||
type NullDefinition struct {
|
type NullDefinition struct{}
|
||||||
}
|
|
||||||
|
|
||||||
func GetWorkflowSchema() *Schema {
|
func GetWorkflowSchema() *Schema {
|
||||||
sh := &Schema{}
|
sh := &Schema{}
|
||||||
@@ -462,7 +459,7 @@ func (s *Node) checkString(node *yaml.Node, def Definition) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (s *Node) checkOneOf(def Definition, node *yaml.Node) error {
|
func (s *Node) checkOneOf(def Definition, node *yaml.Node) error {
|
||||||
var invalidProps = math.MaxInt
|
invalidProps := math.MaxInt
|
||||||
var bestMatches ValidationErrorCollection
|
var bestMatches ValidationErrorCollection
|
||||||
for _, v := range *def.OneOf {
|
for _, v := range *def.OneOf {
|
||||||
// Use helper to create child node
|
// Use helper to create child node
|
||||||
|
|||||||
@@ -100,8 +100,8 @@ func (e *Environment) start(ctx context.Context) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
var customDirectoryMounts []string
|
var customDirectoryMounts []string
|
||||||
_ = os.MkdirAll(e.Miscpath, 0777)
|
_ = os.MkdirAll(e.Miscpath, 0o777)
|
||||||
_ = os.MkdirAll(e.ToolCache, 0777)
|
_ = os.MkdirAll(e.ToolCache, 0o777)
|
||||||
customDirectoryMounts = append(customDirectoryMounts, "act:"+e.Miscpath)
|
customDirectoryMounts = append(customDirectoryMounts, "act:"+e.Miscpath)
|
||||||
customDirectoryMounts = append(customDirectoryMounts, "tool_cache:"+e.ToolCache)
|
customDirectoryMounts = append(customDirectoryMounts, "tool_cache:"+e.ToolCache)
|
||||||
e.vm = vm
|
e.vm = vm
|
||||||
@@ -113,6 +113,7 @@ func (e *Environment) start(ctx context.Context) error {
|
|||||||
|
|
||||||
return e.execRaw(ctx, "ln -sf '/Volumes/My Shared Files/act' /private/tmp/act && ln -sf '/Volumes/My Shared Files/tool_cache' /private/tmp/tool_cache")
|
return e.execRaw(ctx, "ln -sf '/Volumes/My Shared Files/act' /private/tmp/act && ln -sf '/Volumes/My Shared Files/tool_cache' /private/tmp/tool_cache")
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *Environment) Stop(ctx context.Context) error {
|
func (e *Environment) Stop(ctx context.Context) error {
|
||||||
common.Logger(ctx).Debug("Preparing stopping VM")
|
common.Logger(ctx).Debug("Preparing stopping VM")
|
||||||
|
|
||||||
@@ -149,6 +150,7 @@ func (e *Environment) Remove() common.Executor {
|
|||||||
return e.Close()(ctx)
|
return e.Close()(ctx)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *Environment) exec(ctx context.Context, command []string, _ string, env map[string]string, _, workdir string) error {
|
func (e *Environment) exec(ctx context.Context, command []string, _ string, env map[string]string, _, workdir string) error {
|
||||||
var wd string
|
var wd string
|
||||||
if workdir != "" {
|
if workdir != "" {
|
||||||
@@ -216,12 +218,15 @@ func (e *Environment) GetActPath() string {
|
|||||||
func (e *Environment) Copy(destPath string, files ...*container.FileEntry) common.Executor {
|
func (e *Environment) Copy(destPath string, files ...*container.FileEntry) common.Executor {
|
||||||
return e.HostEnvironment.Copy(e.ToHostPath(destPath), files...)
|
return e.HostEnvironment.Copy(e.ToHostPath(destPath), files...)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *Environment) CopyTarStream(ctx context.Context, destPath string, tarStream io.Reader) error {
|
func (e *Environment) CopyTarStream(ctx context.Context, destPath string, tarStream io.Reader) error {
|
||||||
return e.HostEnvironment.CopyTarStream(ctx, e.ToHostPath(destPath), tarStream)
|
return e.HostEnvironment.CopyTarStream(ctx, e.ToHostPath(destPath), tarStream)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *Environment) CopyDir(destPath string, srcPath string, useGitIgnore bool) common.Executor {
|
func (e *Environment) CopyDir(destPath string, srcPath string, useGitIgnore bool) common.Executor {
|
||||||
return e.HostEnvironment.CopyDir(e.ToHostPath(destPath), srcPath, useGitIgnore)
|
return e.HostEnvironment.CopyDir(e.ToHostPath(destPath), srcPath, useGitIgnore)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *Environment) GetContainerArchive(ctx context.Context, srcPath string) (io.ReadCloser, error) {
|
func (e *Environment) GetContainerArchive(ctx context.Context, srcPath string) (io.ReadCloser, error) {
|
||||||
return e.HostEnvironment.GetContainerArchive(ctx, e.ToHostPath(srcPath))
|
return e.HostEnvironment.GetContainerArchive(ctx, e.ToHostPath(srcPath))
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -85,7 +85,7 @@ func (vm *VM) cloneAndConfigure(
|
|||||||
|
|
||||||
func (vm *VM) Start(ctx context.Context, config Config, _ *Env, customDirectoryMounts []string) error {
|
func (vm *VM) Start(ctx context.Context, config Config, _ *Env, customDirectoryMounts []string) error {
|
||||||
os.Remove(vm.tartRunOutputPath())
|
os.Remove(vm.tartRunOutputPath())
|
||||||
var runArgs = []string{"run"}
|
runArgs := []string{"run"}
|
||||||
|
|
||||||
if config.Softnet {
|
if config.Softnet {
|
||||||
runArgs = append(runArgs, "--net-softnet")
|
runArgs = append(runArgs, "--net-softnet")
|
||||||
|
|||||||
Reference in New Issue
Block a user