Как выполняются функции before_script/afters_script по отношению к командам сценария?

# #docker #gitlab #gitlab-ci #gitlab-ci-runner

Вопрос:

Я понимаю, что делает before_script. Он выполняет команды для запуска до выполнения команд задания.
Но как это на самом деле работает под капотом?

Является ли это одной «сущностью», которая выполняет все команды, определенные в одном и том же процессе before_script script и after_script в одном и том же процессе?
Или они выполняются различными процессами (подобластями?) последовательно?

Если, например, в before_script команде a выполняется то, что в обычных условиях, выполняемое в фоновом режиме, может длиться в течение script всего времени, которое будет прервано после завершения области before_script действия?

Ответ №1:

Они выполняются в одном и том же процессе, потому что вы можете, например, использовать в script блоке переменную, заданную, before_script как в следующем фрагменте кода:

   before_script:
    - export DOCKER_IMAGE="${CI_REGISTRY_IMAGE}/app@${CI_IMAGE_DIGEST}"
  script:
    - echo $DOCKER_IMAGE
 

Это не сработало бы, если бы сценарии выполнялись в разных вложенных ячейках.

Если вы хотите быть уверены, что фоновая команда не будет уничтожена, вы можете просто добавить wait команду.

ОБНОВЛЕНИЕ-1:

Эта простая .gitlab-ci.yml настройка:

 stages:
  - test

test:
  stage: test
  before_script:
    - echo "PID $"
  script:
    - echo "PID $"
  tags:
    - shell
 

выводит следующий вывод:

конвейер, который показывает один и тот же PID в before_script и скрипте

это подтверждает то, что я писал раньше.

ОБНОВЛЕНИЕ-2:

Следующий файл .gitlab-ci.yml :

 stages:
  - test

test:
  stage: test
  before_script:
    - bin/script.sh amp;
  script:
    - echo "End of the script block"
    - wait
  tags:
    - shell
 

где:

 $ cat bin/script.sh 
#!/bin/bash
sleep 120
echo "End of a long script"
 

показывает, что wait команда предотвращает script.sh уничтожение:

конвейер с 2-минутным сценарием плюс команда ожидания

Комментарии:

1. Как это показывает, что это один и тот же процесс? Может быть так, что переменные среды просто «перенаправляются» в скрипт, который выполняется как отдельный процесс

2. Я добавил тест, чтобы дать лучшие доказательства.