diff --git a/common/network.go b/common/network.go index c09dda5d74814c5e402045508dc10883188e3164..3f9f52a5cbd4bffa7642db06e5eebfbd4c412eb8 100644 --- a/common/network.go +++ b/common/network.go @@ -4,7 +4,6 @@ import ( "context" "fmt" "io" - "strings" "gitlab.com/gitlab-org/gitlab-ci-multi-runner/helpers/url" ) diff --git a/helpers/gitlab_ci_yaml_parser/data_bag.go b/helpers/gitlab_ci_yaml_parser/data_bag.go index c76f76e3b52576cd06e5a033099cc9406c4c37c6..af46fc9f24ca9801c822d76f3ad4658557b7f2d3 100644 --- a/helpers/gitlab_ci_yaml_parser/data_bag.go +++ b/helpers/gitlab_ci_yaml_parser/data_bag.go @@ -22,6 +22,20 @@ func (m *DataBag) GetSlice(keys ...string) ([]interface{}, bool) { return nil, false } +func (m *DataBag) GetStringSlice(keys ...string) (slice []string, ok bool) { + rawSlice, ok := m.GetSlice(keys...) + if !ok { + return + } + + for _, rawElement := range rawSlice { + if element, ok := rawElement.(string); ok { + slice = append(slice, element) + } + } + return +} + func (m *DataBag) GetSubOptions(keys ...string) (result DataBag, ok bool) { value, ok := helpers.GetMapKey(*m, keys...) if ok { diff --git a/helpers/gitlab_ci_yaml_parser/parser.go b/helpers/gitlab_ci_yaml_parser/parser.go index 7f5aa5dbcf256c16ec684624f0e3d63513f5c955..c3f0f53bc3d7d0823d57d7977692f8cfb4e5fdc7 100644 --- a/helpers/gitlab_ci_yaml_parser/parser.go +++ b/helpers/gitlab_ci_yaml_parser/parser.go @@ -223,7 +223,7 @@ func (c *GitLabCiYamlParser) prepareImage(job *common.JobResponse) (err error) { if imageDefinition, ok := c.jobConfig.GetSubOptions("image"); ok { job.Image.Name, _ = imageDefinition.GetString("name") - job.Image.Entrypoint, _ = imageDefinition.GetString("entrypoint") + job.Image.Entrypoint, _ = imageDefinition.GetStringSlice("entrypoint") return } @@ -234,33 +234,24 @@ func (c *GitLabCiYamlParser) prepareImage(job *common.JobResponse) (err error) { if imageDefinition, ok := c.config.GetSubOptions("image"); ok { job.Image.Name, _ = imageDefinition.GetString("name") + job.Image.Entrypoint, _ = imageDefinition.GetStringSlice("entrypoint") return } return } -func parseExtendedServiceDefinitionMap(serviceDefinition map[interface{}]interface{}) common.Image { - var name, alias, command, entrypoint string +func parseExtendedServiceDefinitionMap(serviceDefinition map[interface{}]interface{}) (image common.Image) { + service := make(DataBag) for key, value := range serviceDefinition { - switch key { - case "name": - name = value.(string) - case "alias": - alias = value.(string) - case "command": - command = value.(string) - case "entrypoint": - entrypoint = value.(string) - } + service[key.(string)] = value } - return common.Image{ - Name: name, - Alias: alias, - Command: command, - Entrypoint: entrypoint, - } + image.Name, _ = service.GetString("name") + image.Alias, _ = service.GetString("alias") + image.Command, _ = service.GetStringSlice("command") + image.Entrypoint, _ = service.GetStringSlice("entrypoint") + return } func (c *GitLabCiYamlParser) prepareServices(job *common.JobResponse) (err error) { diff --git a/helpers/gitlab_ci_yaml_parser/parser_test.go b/helpers/gitlab_ci_yaml_parser/parser_test.go index 57bc795765cb5e072bb02dd0cd80173567a4f497..d128df3c63bdf07371ac7774aeb199632ea66b13 100644 --- a/helpers/gitlab_ci_yaml_parser/parser_test.go +++ b/helpers/gitlab_ci_yaml_parser/parser_test.go @@ -34,26 +34,27 @@ job4: script: job4 image: name: alpine - entrypoint: /bin/sh + entrypoint: ["/bin/sh"] services: - name: service:1 - command: sleep 30 + command: ["sleep", "30"] alias: service-1 - name: service:2 - entrypoint: /bin/sh + entrypoint: ["/bin/sh"] alias: service-2 ` var testFile2 = ` image: name: global:image + entrypoint: [/bin/sh] services: - name: service:1 - command: sleep 30 + command: ["sleep", "30"] alias: service-1 - name: service:2 - entrypoint: /bin/sh + entrypoint: [/bin/sh] alias: service-2 job1: @@ -126,33 +127,35 @@ func TestFileParsing(t *testing.T) { // file1 - job4 jobResponse = getJobResponse(t, testFile1, "job4", false) assert.Equal(t, "alpine", jobResponse.Image.Name) - assert.Equal(t, "/bin/sh", jobResponse.Image.Entrypoint) + assert.Equal(t, []string{"/bin/sh"}, jobResponse.Image.Entrypoint) require.Len(t, jobResponse.Services, 2) assert.Equal(t, "service:1", jobResponse.Services[0].Name) assert.Equal(t, "service-1", jobResponse.Services[0].Alias) - assert.Equal(t, "sleep 30", jobResponse.Services[0].Command) + assert.Equal(t, []string{"sleep", "30"}, jobResponse.Services[0].Command) assert.Empty(t, jobResponse.Services[0].Entrypoint) assert.Equal(t, "service:2", jobResponse.Services[1].Name) assert.Equal(t, "service-2", jobResponse.Services[1].Alias) assert.Empty(t, jobResponse.Services[1].Command) - assert.Equal(t, "/bin/sh", jobResponse.Services[1].Entrypoint) + assert.Equal(t, []string{"/bin/sh"}, jobResponse.Services[1].Entrypoint) // file2 - job1 jobResponse = getJobResponse(t, testFile2, "job1", false) assert.Equal(t, "global:image", jobResponse.Image.Name) + assert.Equal(t, []string{"/bin/sh"}, jobResponse.Image.Entrypoint) require.Len(t, jobResponse.Services, 2) assert.Equal(t, "service:1", jobResponse.Services[0].Name) assert.Equal(t, "service-1", jobResponse.Services[0].Alias) - assert.Equal(t, "sleep 30", jobResponse.Services[0].Command) + assert.Equal(t, []string{"sleep", "30"}, jobResponse.Services[0].Command) assert.Empty(t, jobResponse.Services[0].Entrypoint) assert.Equal(t, "service:2", jobResponse.Services[1].Name) assert.Equal(t, "service-2", jobResponse.Services[1].Alias) assert.Empty(t, jobResponse.Services[1].Command) - assert.Equal(t, "/bin/sh", jobResponse.Services[1].Entrypoint) + assert.Equal(t, []string{"/bin/sh"}, jobResponse.Services[1].Entrypoint) // file2 - job2 jobResponse = getJobResponse(t, testFile2, "job2", false) assert.Equal(t, "job2:image", jobResponse.Image.Name) + assert.Empty(t, jobResponse.Image.Entrypoint) require.Len(t, jobResponse.Services, 2) assert.Equal(t, "service:1", jobResponse.Services[0].Name) assert.Empty(t, jobResponse.Services[0].Alias)