GitLab CI YAML: before_script doesn't accept single string or nested strings
### Summary The `before_script` of `.gitlab-ci.yml` cannot be a single string. The [documentation](https://docs.gitlab.com/ce/ci/yaml/README.html#before_script) states that it can be. Also `script` of a job can be a single string, so this is inconsistent. `after_script` behaves in the same way. ### Steps to reproduce Example of what should be a valid `.gitlab-ci.yml` ```yaml before_script: | do_stuff my_job: script: | do_stuff ``` ### What is the current *bug* behavior? This will be rejected by the linter. Notice that `my_job` is accepted. ### What is the expected *correct* behavior? Everything should be ok ### Relevant logs and/or screenshots Linter output: ``` Status: syntax is incorrect Error: before_script config should be an array of strings ``` #### Results of GitLab environment info Checked using self hosted version 10.4.2 and current Gitlab.com #### Workaround Its possible to workaround the issue pretty easily ```yaml before_script: - | do_stuff ``` ### Technical proposal ```diff diff --git a/lib/gitlab/ci/config/entry/job.rb b/lib/gitlab/ci/config/entry/job.rb index a20b802be58..e580e42d374 100644 --- a/lib/gitlab/ci/config/entry/job.rb +++ b/lib/gitlab/ci/config/entry/job.rb @@ -48,7 +48,7 @@ class Job < ::Gitlab::Config::Entry::Node end end - entry :before_script, Entry::Script, + entry :before_script, Entry::Commands, description: 'Global before script overridden in this job.', inherit: true @@ -60,7 +60,7 @@ class Job < ::Gitlab::Config::Entry::Node description: 'Deprecated: stage this job will be executed into.', inherit: false - entry :after_script, Entry::Script, + entry :after_script, Entry::Commands, description: 'Commands that will be executed when finishing job.', inherit: true diff --git a/lib/gitlab/ci/config/entry/root.rb b/lib/gitlab/ci/config/entry/root.rb index 54ef84b965a..622dbb857d0 100644 --- a/lib/gitlab/ci/config/entry/root.rb +++ b/lib/gitlab/ci/config/entry/root.rb @@ -32,7 +32,7 @@ class Root < ::Gitlab::Config::Entry::Node description: 'List of external YAML files to include.', reserved: true - entry :before_script, Entry::Script, + entry :before_script, Entry::Commands, description: 'Script that will be executed before each job.', reserved: true @@ -44,7 +44,7 @@ class Root < ::Gitlab::Config::Entry::Node description: 'Docker images that will be linked to the container.', reserved: true - entry :after_script, Entry::Script, + entry :after_script, Entry::Commands, description: 'Script that will be executed after each job.', reserved: true ``` This will make `before_script` and `after_script` behave exactly like `script`: - accept single string - flatten arrays up to 10 levels deep to work with nested `!reference` calls.
issue