Leave clear notices about after_script execution context

We frequently see new issues mentioning that something defined
in `before_script` or `script` doesn't work with `after_script`.

Our documentation mentions that first two are concatenated and
executed together, why the third one is executed in a separated
shell context. But it looks like it's not clear enough.

Since this misunderstanding of how scripts are being executed
is repeated frequently, let's make it more clear in docs.
This commit is contained in:
Tomasz Maczukin 2019-06-11 23:31:44 +02:00
parent 9bf141cf71
commit f4b5f930ff
No known key found for this signature in database
GPG Key ID: 7E9EB2E4B0F625CD
2 changed files with 22 additions and 4 deletions

View File

@ -89,6 +89,14 @@ Supported:
- In `script`, it will work in the following lines of `script`.
- In `after_script`, it will work in following lines of `after_script`.
Please notice the specific case of `after_script` scripts, that can:
- Only use variables defined before the script within the same `after_script` section.
- Not use variables defined in `before_script` and `script`.
Both restrictions are caused by the fact, that `after_script` script is executed in a
[separated shell context](https://docs.gitlab.com/ee/ci/yaml/README.html#before_script-and-after_script).
## Persisted variables
NOTE: **Note:**

View File

@ -215,10 +215,20 @@ This can be an array or a multi-line string.
`after_script` is used to define the command that will be run after all
jobs, including failed ones. This has to be an array or a multi-line string.
The `before_script` and the main `script` are concatenated and run in a single context/container.
The `after_script` is run separately. The current working directory is set back to
default. Depending on the executor, changes done outside of the working tree might
not be visible, e.g. software installed in the `before_script`.
Script specified in `before_script` is:
- Concatenated with script specified in the main `script`. Job-level `before_script` definition
override global-level `before_script` definition when concatenated with `script` definition.
- Executed together with main `script` script as one script in a single shell context.
Script specified in `after_script`:
- Have a current working directory set back to the default.
- Is executed in a shell context separated from `before_script` and `script` scripts.
- Because of separated context, cannot see changes done by scripts defined in `before_script` or `script` scripts:
- in shell - for example, command aliases and variables exported in `script` script,
- outside of the working tree (depending on the Runner executor) - for example, software installed
by a `before_script` or `script` script.
It's possible to overwrite the globally defined `before_script` and `after_script`
if you set it per-job: