fix 99: support string and map variants of container

This commit is contained in:
Casey Lee 2020-02-24 22:35:08 -08:00
parent dadf8918be
commit 51b6167606
No known key found for this signature in database
GPG key ID: 1899120ECD0A1784
5 changed files with 63 additions and 5 deletions

View file

@ -61,9 +61,9 @@ type Job struct {
If string `yaml:"if"`
Steps []*Step `yaml:"steps"`
TimeoutMinutes int64 `yaml:"timeout-minutes"`
Container *ContainerSpec `yaml:"container"`
Services map[string]*ContainerSpec `yaml:"services"`
Strategy *Strategy `yaml:"strategy"`
RawContainer yaml.Node `yaml:"container"`
}
// Strategy for the job
@ -73,6 +73,26 @@ type Strategy struct {
Matrix map[string][]interface{} `yaml:"matrix"`
}
// Container details for the job
func (j *Job) Container() *ContainerSpec {
var val *ContainerSpec
switch j.RawContainer.Kind {
case yaml.ScalarNode:
val = new(ContainerSpec)
err := j.RawContainer.Decode(&val.Image)
if err != nil {
log.Fatal(err)
}
case yaml.MappingNode:
val = new(ContainerSpec)
err := j.RawContainer.Decode(val)
if err != nil {
log.Fatal(err)
}
}
return val
}
// Needs list for Job
func (j *Job) Needs() []string {

View file

@ -70,3 +70,31 @@ jobs:
assert.Contains(t, workflow.On(), "push")
assert.Contains(t, workflow.On(), "pull_request")
}
func TestReadWorkflow_StringContainer(t *testing.T) {
yaml := `
name: local-action-docker-url
jobs:
test:
container: nginx:latest
runs-on: ubuntu-latest
steps:
- uses: ./actions/docker-url
test2:
container:
image: nginx:latest
env:
foo: bar
runs-on: ubuntu-latest
steps:
- uses: ./actions/docker-url
`
workflow, err := ReadWorkflow(strings.NewReader(yaml))
assert.NoError(t, err, "read workflow should succeed")
assert.Len(t, workflow.Jobs, 2)
assert.Contains(t, workflow.Jobs["test"].Container().Image, "nginx:latest")
assert.Contains(t, workflow.Jobs["test2"].Container().Image, "nginx:latest")
assert.Contains(t, workflow.Jobs["test2"].Container().Env["foo"], "bar")
}

View file

@ -53,8 +53,9 @@ func (rc *RunContext) startJobContainer() common.Executor {
job := rc.Run.Job()
var image string
if job.Container != nil {
image = job.Container.Image
c := job.Container()
if c != nil {
image = c.Image
} else {
platformName := rc.ExprEval.Interpolate(job.RunsOn)
image = rc.Config.Platforms[strings.ToLower(platformName)]

View file

@ -87,8 +87,9 @@ func (sc *StepContext) setupEnv() common.Executor {
step := sc.Step
return func(ctx context.Context) error {
var env map[string]string
if job.Container != nil {
env = mergeMaps(rc.GetEnv(), job.Container.Env, step.GetEnv())
c := job.Container()
if c != nil {
env = mergeMaps(rc.GetEnv(), c.Env, step.GetEnv())
} else {
env = mergeMaps(rc.GetEnv(), step.GetEnv())
}

View file

@ -10,3 +10,11 @@ jobs:
TEST_ENV: test-value
steps:
- run: echo ${TEST_ENV} | grep test-value
test2:
runs-on: ubuntu-latest
container: node:10.16-jessie
steps:
- run: echo ${TEST_ENV} | grep test-value
env:
TEST_ENV: test-value