Skip to content

CI: Flatten the nested arrays for before_script, script and after_script to make including easy and fun

Description

Wouldn't this make everyone's life with gitlab-ci.yml easy and fun?

.something: &something
- echo something
- ./dosomething

.somethingelse: &somethingelse
- echo somethingelse
- ./dosomethingelse

job1:
  script:
  - *something
  - echo job1

job2:
  script:
  - *something
  - *somethingelse
  - echo job2

At first, it sounds looks perfectly fine and reasonable. Why wouldn't it work?

But then one realizes it won't work because the array isn't flat anymore. The output object is the below - and nested arrays are problematic:

{job1: {script: [['echo something', './dosomething'], 'echo job1']}, job2: {script: [['echo something', './dosomething'], ['echo somethingelse', './dosomethingelse'], 'echo job2'}}

Workaround

@ayufan proposed a workaround: https://gitlab.com/gitlab-org/gitlab-ce/issues/19677#note_13008199

.bundle_install: &bundle_install |
  echo aa
  echo bb

.bundle_exec: &bundle_exec |
  echo aa
  echo bb

test:
  script:
  - *bundle_install
  - *bundle_exec

The | syntax is a way to write a single command but appear as multi-line in YAML. The runner treats it as a single bash command. In other words, it's equivalent to running echo aa && echo bb- and this is an inferior solution since when the job fails on a very long multi-line statement it's not clear which command failed.

Proposal

Flatten the hell out of before_script, script, after_script and make life easy!

{script: [['echo something', './dosomething'], 'echo job1']} -> {script: ['echo something', './dosomething', 'echo job1']}

Links to related issues and merge requests / references

https://gitlab.com/gitlab-org/gitlab-ce/issues/19677

CC @ayufan @grzesiek @markpundsack @bikebilly @markglenfletcher