fix tests
Signed-off-by: Casey Lee <cplee@nektos.com>
This commit is contained in:
parent
e40ab0145f
commit
09773f7c5c
7 changed files with 160 additions and 30 deletions
2
Makefile
2
Makefile
|
@ -21,7 +21,7 @@ test:
|
||||||
go test -cover -short ./...
|
go test -cover -short ./...
|
||||||
|
|
||||||
check:
|
check:
|
||||||
$(ACT) -rj ci
|
$(ACT) -orj ci
|
||||||
|
|
||||||
build: check
|
build: check
|
||||||
$(eval export SNAPSHOT_VERSION=$(VERSION))
|
$(eval export SNAPSHOT_VERSION=$(VERSION))
|
||||||
|
|
|
@ -2,7 +2,6 @@ package runner
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"fmt"
|
|
||||||
"regexp"
|
"regexp"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
|
@ -72,10 +71,7 @@ func (rc *RunContext) setOutput(ctx context.Context, kvPairs map[string]string,
|
||||||
}
|
}
|
||||||
func (rc *RunContext) addPath(ctx context.Context, arg string) {
|
func (rc *RunContext) addPath(ctx context.Context, arg string) {
|
||||||
common.Logger(ctx).Infof(" \U00002699 ::add-path:: %s", arg)
|
common.Logger(ctx).Infof(" \U00002699 ::add-path:: %s", arg)
|
||||||
if rc.Env == nil {
|
rc.ExtraPath = append(rc.ExtraPath, arg)
|
||||||
rc.Env = make(map[string]string)
|
|
||||||
}
|
|
||||||
rc.Env["PATH"] = fmt.Sprintf("%s:%s", arg, rc.Env["PATH"])
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func parseKeyValuePairs(kvPairs string) map[string]string {
|
func parseKeyValuePairs(kvPairs string) map[string]string {
|
||||||
|
|
|
@ -34,10 +34,10 @@ func TestAddpath(t *testing.T) {
|
||||||
handler := rc.commandHandler(ctx)
|
handler := rc.commandHandler(ctx)
|
||||||
|
|
||||||
handler("::add-path::/zoo\n")
|
handler("::add-path::/zoo\n")
|
||||||
assert.Equal("/zoo:", rc.Env["PATH"])
|
assert.Equal("/zoo", rc.ExtraPath[0])
|
||||||
|
|
||||||
handler("::add-path::/booo\n")
|
handler("::add-path::/boo\n")
|
||||||
assert.Equal("/booo:/zoo:", rc.Env["PATH"])
|
assert.Equal("/boo", rc.ExtraPath[1])
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestStopCommands(t *testing.T) {
|
func TestStopCommands(t *testing.T) {
|
||||||
|
|
|
@ -75,7 +75,17 @@ func (rc *RunContext) newVM() *otto.Otto {
|
||||||
vmFormat,
|
vmFormat,
|
||||||
vmJoin,
|
vmJoin,
|
||||||
vmToJSON,
|
vmToJSON,
|
||||||
vmHashFiles(rc.Config.Workdir),
|
vmAlways,
|
||||||
|
vmCancelled,
|
||||||
|
rc.vmHashFiles(),
|
||||||
|
rc.vmSuccess(),
|
||||||
|
rc.vmFailure(),
|
||||||
|
|
||||||
|
rc.vmGithub(),
|
||||||
|
rc.vmEnv(),
|
||||||
|
rc.vmJob(),
|
||||||
|
rc.vmSteps(),
|
||||||
|
rc.vmRunner(),
|
||||||
}
|
}
|
||||||
vm := otto.New()
|
vm := otto.New()
|
||||||
for _, configer := range configers {
|
for _, configer := range configers {
|
||||||
|
@ -85,12 +95,12 @@ func (rc *RunContext) newVM() *otto.Otto {
|
||||||
}
|
}
|
||||||
|
|
||||||
func vmContains(vm *otto.Otto) {
|
func vmContains(vm *otto.Otto) {
|
||||||
vm.Set("contains", func(searchString interface{}, searchValue string) bool {
|
_ = vm.Set("contains", func(searchString interface{}, searchValue string) bool {
|
||||||
if searchStringString, ok := searchString.(string); ok {
|
if searchStringString, ok := searchString.(string); ok {
|
||||||
return strings.Contains(strings.ToLower(searchStringString), strings.ToLower(searchValue))
|
return strings.Contains(strings.ToLower(searchStringString), strings.ToLower(searchValue))
|
||||||
} else if searchStringArray, ok := searchString.([]string); ok {
|
} else if searchStringArray, ok := searchString.([]string); ok {
|
||||||
for _, s := range searchStringArray {
|
for _, s := range searchStringArray {
|
||||||
if strings.ToLower(s) == strings.ToLower(searchValue) {
|
if strings.EqualFold(s, searchValue) {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -100,19 +110,19 @@ func vmContains(vm *otto.Otto) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func vmStartsWith(vm *otto.Otto) {
|
func vmStartsWith(vm *otto.Otto) {
|
||||||
vm.Set("startsWith", func(searchString string, searchValue string) bool {
|
_ = vm.Set("startsWith", func(searchString string, searchValue string) bool {
|
||||||
return strings.HasPrefix(strings.ToLower(searchString), strings.ToLower(searchValue))
|
return strings.HasPrefix(strings.ToLower(searchString), strings.ToLower(searchValue))
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func vmEndsWith(vm *otto.Otto) {
|
func vmEndsWith(vm *otto.Otto) {
|
||||||
vm.Set("endsWith", func(searchString string, searchValue string) bool {
|
_ = vm.Set("endsWith", func(searchString string, searchValue string) bool {
|
||||||
return strings.HasSuffix(strings.ToLower(searchString), strings.ToLower(searchValue))
|
return strings.HasSuffix(strings.ToLower(searchString), strings.ToLower(searchValue))
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func vmFormat(vm *otto.Otto) {
|
func vmFormat(vm *otto.Otto) {
|
||||||
vm.Set("format", func(s string, vals ...string) string {
|
_ = vm.Set("format", func(s string, vals ...string) string {
|
||||||
for i, v := range vals {
|
for i, v := range vals {
|
||||||
s = strings.ReplaceAll(s, fmt.Sprintf("{%d}", i), v)
|
s = strings.ReplaceAll(s, fmt.Sprintf("{%d}", i), v)
|
||||||
}
|
}
|
||||||
|
@ -121,7 +131,7 @@ func vmFormat(vm *otto.Otto) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func vmJoin(vm *otto.Otto) {
|
func vmJoin(vm *otto.Otto) {
|
||||||
vm.Set("join", func(element interface{}, optionalElem string) string {
|
_ = vm.Set("join", func(element interface{}, optionalElem string) string {
|
||||||
slist := make([]string, 0)
|
slist := make([]string, 0)
|
||||||
if elementString, ok := element.(string); ok {
|
if elementString, ok := element.(string); ok {
|
||||||
slist = append(slist, elementString)
|
slist = append(slist, elementString)
|
||||||
|
@ -136,7 +146,7 @@ func vmJoin(vm *otto.Otto) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func vmToJSON(vm *otto.Otto) {
|
func vmToJSON(vm *otto.Otto) {
|
||||||
vm.Set("toJSON", func(o interface{}) string {
|
_ = vm.Set("toJSON", func(o interface{}) string {
|
||||||
rtn, err := json.MarshalIndent(o, "", " ")
|
rtn, err := json.MarshalIndent(o, "", " ")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logrus.Errorf("Unable to marsal: %v", err)
|
logrus.Errorf("Unable to marsal: %v", err)
|
||||||
|
@ -146,10 +156,10 @@ func vmToJSON(vm *otto.Otto) {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func vmHashFiles(workdir string) func(*otto.Otto) {
|
func (rc *RunContext) vmHashFiles() func(*otto.Otto) {
|
||||||
return func(vm *otto.Otto) {
|
return func(vm *otto.Otto) {
|
||||||
vm.Set("hashFiles", func(path string) string {
|
_ = vm.Set("hashFiles", func(path string) string {
|
||||||
files, _, err := glob.Glob([]string{filepath.Join(workdir, path)})
|
files, _, err := glob.Glob([]string{filepath.Join(rc.Config.Workdir, path)})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logrus.Error(err)
|
logrus.Error(err)
|
||||||
return ""
|
return ""
|
||||||
|
@ -169,3 +179,99 @@ func vmHashFiles(workdir string) func(*otto.Otto) {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (rc *RunContext) vmSuccess() func(*otto.Otto) {
|
||||||
|
return func(vm *otto.Otto) {
|
||||||
|
_ = vm.Set("success", func() bool {
|
||||||
|
return !rc.PriorStepFailed
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
func (rc *RunContext) vmFailure() func(*otto.Otto) {
|
||||||
|
return func(vm *otto.Otto) {
|
||||||
|
_ = vm.Set("failure", func() bool {
|
||||||
|
return rc.PriorStepFailed
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func vmAlways(vm *otto.Otto) {
|
||||||
|
_ = vm.Set("always", func() bool {
|
||||||
|
return true
|
||||||
|
})
|
||||||
|
}
|
||||||
|
func vmCancelled(vm *otto.Otto) {
|
||||||
|
_ = vm.Set("cancelled", func() bool {
|
||||||
|
return false
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func (rc *RunContext) vmGithub() func(*otto.Otto) {
|
||||||
|
github := map[string]interface{}{
|
||||||
|
"event": make(map[string]interface{}),
|
||||||
|
"event_path": "/github/workflow/event.json",
|
||||||
|
"workflow": rc.Run.Workflow.Name,
|
||||||
|
"run_id": "1",
|
||||||
|
"run_number": "1",
|
||||||
|
"actor": "nektos/act",
|
||||||
|
|
||||||
|
// TODO
|
||||||
|
"repository": "",
|
||||||
|
"event_name": "",
|
||||||
|
"sha": "",
|
||||||
|
"ref": "",
|
||||||
|
"head_ref": "",
|
||||||
|
"base_ref": "",
|
||||||
|
"token": "",
|
||||||
|
"workspace": rc.Config.Workdir,
|
||||||
|
"action": "",
|
||||||
|
}
|
||||||
|
|
||||||
|
err := json.Unmarshal([]byte(rc.EventJSON), github["event"])
|
||||||
|
if err != nil {
|
||||||
|
logrus.Error(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return func(vm *otto.Otto) {
|
||||||
|
_ = vm.Set("github", github)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (rc *RunContext) vmEnv() func(*otto.Otto) {
|
||||||
|
env := map[string]interface{}{}
|
||||||
|
// TODO
|
||||||
|
|
||||||
|
return func(vm *otto.Otto) {
|
||||||
|
_ = vm.Set("env", env)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (rc *RunContext) vmJob() func(*otto.Otto) {
|
||||||
|
job := map[string]interface{}{}
|
||||||
|
// TODO
|
||||||
|
|
||||||
|
return func(vm *otto.Otto) {
|
||||||
|
_ = vm.Set("job", job)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (rc *RunContext) vmSteps() func(*otto.Otto) {
|
||||||
|
steps := map[string]interface{}{}
|
||||||
|
// TODO
|
||||||
|
|
||||||
|
return func(vm *otto.Otto) {
|
||||||
|
_ = vm.Set("steps", steps)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (rc *RunContext) vmRunner() func(*otto.Otto) {
|
||||||
|
runner := map[string]interface{}{
|
||||||
|
"os": "Linux",
|
||||||
|
"temp": "/tmp",
|
||||||
|
"tool_cache": "/tmp",
|
||||||
|
}
|
||||||
|
|
||||||
|
return func(vm *otto.Otto) {
|
||||||
|
_ = vm.Set("runner", runner)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -3,6 +3,7 @@ package runner
|
||||||
import (
|
import (
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
"github.com/nektos/act/pkg/model"
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -12,6 +13,12 @@ func TestEvaluate(t *testing.T) {
|
||||||
Config: &Config{
|
Config: &Config{
|
||||||
Workdir: ".",
|
Workdir: ".",
|
||||||
},
|
},
|
||||||
|
Run: &model.Run{
|
||||||
|
JobID: "job1",
|
||||||
|
Workflow: &model.Workflow{
|
||||||
|
Name: "test-workflow",
|
||||||
|
},
|
||||||
|
},
|
||||||
}
|
}
|
||||||
ee := rc.NewExpressionEvaluator()
|
ee := rc.NewExpressionEvaluator()
|
||||||
|
|
||||||
|
@ -36,6 +43,15 @@ func TestEvaluate(t *testing.T) {
|
||||||
{"join('hello','mona')", "hello mona", ""},
|
{"join('hello','mona')", "hello mona", ""},
|
||||||
{"toJSON({'foo':'bar'})", "{\n \"foo\": \"bar\"\n}", ""},
|
{"toJSON({'foo':'bar'})", "{\n \"foo\": \"bar\"\n}", ""},
|
||||||
{"hashFiles('**/package-lock.json')", "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", ""},
|
{"hashFiles('**/package-lock.json')", "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", ""},
|
||||||
|
{"success()", "true", ""},
|
||||||
|
{"failure()", "false", ""},
|
||||||
|
{"always()", "true", ""},
|
||||||
|
{"cancelled()", "false", ""},
|
||||||
|
{"github.workflow", "test-workflow", ""},
|
||||||
|
{"github.actor", "nektos/act", ""},
|
||||||
|
{"github.run_id", "1", ""},
|
||||||
|
{"github.run_number", "1", ""},
|
||||||
|
{"runner.os", "Linux", ""},
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, table := range tables {
|
for _, table := range tables {
|
||||||
|
@ -59,6 +75,12 @@ func TestInterpolate(t *testing.T) {
|
||||||
Config: &Config{
|
Config: &Config{
|
||||||
Workdir: ".",
|
Workdir: ".",
|
||||||
},
|
},
|
||||||
|
Run: &model.Run{
|
||||||
|
JobID: "job1",
|
||||||
|
Workflow: &model.Workflow{
|
||||||
|
Name: "test-workflow",
|
||||||
|
},
|
||||||
|
},
|
||||||
}
|
}
|
||||||
ee := rc.NewExpressionEvaluator()
|
ee := rc.NewExpressionEvaluator()
|
||||||
|
|
||||||
|
|
|
@ -22,21 +22,20 @@ import (
|
||||||
|
|
||||||
// RunContext contains info about current job
|
// RunContext contains info about current job
|
||||||
type RunContext struct {
|
type RunContext struct {
|
||||||
Config *Config
|
Config *Config
|
||||||
Run *model.Run
|
Run *model.Run
|
||||||
EventJSON string
|
EventJSON string
|
||||||
Env map[string]string
|
Env map[string]string
|
||||||
Outputs map[string]string
|
Outputs map[string]string
|
||||||
Tempdir string
|
Tempdir string
|
||||||
|
PriorStepFailed bool
|
||||||
|
ExtraPath []string
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetEnv returns the env for the context
|
// GetEnv returns the env for the context
|
||||||
func (rc *RunContext) GetEnv() map[string]string {
|
func (rc *RunContext) GetEnv() map[string]string {
|
||||||
if rc.Env == nil {
|
if rc.Env == nil {
|
||||||
rc.Env = mergeMaps(rc.Run.Workflow.Env, rc.Run.Job().Env)
|
rc.Env = mergeMaps(rc.Run.Workflow.Env, rc.Run.Job().Env)
|
||||||
if rc.Env["PATH"] == "" {
|
|
||||||
rc.Env["PATH"] = "/usr/local/bin:/usr/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin"
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return rc.Env
|
return rc.Env
|
||||||
}
|
}
|
||||||
|
@ -64,8 +63,10 @@ func (rc *RunContext) Executor() common.Executor {
|
||||||
err := rc.newStepExecutor(s)(ctx)
|
err := rc.newStepExecutor(s)(ctx)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
common.Logger(ctx).Infof(" \u2705 Success - %s", s)
|
common.Logger(ctx).Infof(" \u2705 Success - %s", s)
|
||||||
|
rc.PriorStepFailed = false
|
||||||
} else {
|
} else {
|
||||||
common.Logger(ctx).Errorf(" \u274C Failure - %s", s)
|
common.Logger(ctx).Errorf(" \u274C Failure - %s", s)
|
||||||
|
rc.PriorStepFailed = true
|
||||||
}
|
}
|
||||||
return err
|
return err
|
||||||
})
|
})
|
||||||
|
|
|
@ -163,7 +163,12 @@ func (rc *RunContext) setupShellCommand(containerSpec *model.ContainerSpec, shel
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
if _, err := tempScript.Write([]byte(run)); err != nil {
|
_, err = tempScript.WriteString(fmt.Sprintf("PATH=\"%s:${PATH}\"\n", strings.Join(rc.ExtraPath, ":")))
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if _, err := tempScript.WriteString(run); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
log.Debugf("Wrote command '%s' to '%s'", run, tempScript.Name())
|
log.Debugf("Wrote command '%s' to '%s'", run, tempScript.Name())
|
||||||
|
|
Loading…
Reference in a new issue