Вопрос или проблема
У меня есть довольно наивный вопрос о концептуальной разнице между двумя альтернативами настройки .gitlab-ci.yml для задания CI проекта GitLab. Во-первых, файл конфигурации runner’а config.toml настроен следующим образом, чтобы использовать shell в качестве исполнителя:
[[runners]]
name = "TestRunner"
url = Blabla.com
token = xxxxxxxxxxxxxx
executor = "shell"
shell = "powershell"
Теперь вопрос в том, в чем систематическая разница между заданием
stages:
- StageA
testjob:
stage: StageA
script:
- echo %AGlobalVar% \\некоторая глобальная переменная, например PATH
- mkdir blabla
tags:
- TestRunner
и если я заменю часть “script” на
script:
- cmd /c echo %AGlobalVar%
- cmd /c mkdir blabla
Задание предназначено для запуска на Windows как локальная машина, shell выбран в качестве исполнителя, а в качестве параметра shell выбрана “powershell” (…или также может быть выбрана “pwsh” или “bash” (если доступно)). В чем систематическая разница, если я вызываю shell-команды “напрямую” (как в первой версии), или если я “оборачиваю” их через команду cmd, как во второй версии?
Итак, вопрос в том, в чем основное различие с точки зрения философии GitLab в концепции runner, если я помещаю в часть script строку вида
- (некоторая shell-команда)
, или если я предкомпозирую это с помощью cmd:
- cmd /c (некоторая shell-команда)
Мое наивное предположение заключается в том, что это может быть связано с тем, что GitLab не рассматривает cmd.exe в качестве объекта shell, а просто как команду shell – эта гипотеза подтверждается тем, что опция “cmd” для параметра shell недоступна как опция для “shell” в config.toml. Но не уверен, что это именно то, что имеет значение, просто наивное предположение.
Ответ или решение
Разница между использованием прямых команд PowerShell и обертыванием их в CMD в GitLab CI/CD
В контексте настройки CI/CD в GitLab, использование shell-исполнителя открывает множество возможностей для автоматизации процессов, но также требует понимания тонкостей работы различных оболочек. В вашем случае возникает вопрос о различии между прямым вызовом команд PowerShell и вызовом тех же команд через командную оболочку cmd.exe
. Давайте подробно разберем оба подхода.
1. Прямой вызов PowerShell команд
При использовании конфигурации, в которой вы указываете для shell
значение "powershell", ваши команды будут выполняться в контексте PowerShell. Ваша конфигурация выглядит следующим образом:
stages:
- StageA
testjob:
stage: StageA
script:
- echo %AGlobalVar% # использование глобальной переменной
- mkdir blabla # создание директории
tags:
- TestRunner
В этом варианте:
- Переменные окружения, такие как
%AGlobalVar%
, интерпретируются в контексте PowerShell, и вы должны использовать синтаксис PowerShell для доступа к этим переменным. Например, корректный способ ссылки на переменные в PowerShell — это использование$Env:AGlobalVar
. - Команды
mkdir
иecho
также интерпретируются как команды PowerShell, что может приводить к различиям в их поведении по сравнению с CMD.
2. Обертывание команд в cmd.exe
Когда вы используете cmd /c
для выполнения команд, вы фактически запускаете новую сессию командной оболочки Windows. Пример такого скрипта:
script:
- cmd /c echo %AGlobalVar%
- cmd /c mkdir blabla
Каковы особенности данного подхода:
- Запуск команд происходит в контексте командной оболочки (CMD), что изменяет способ разбора переменных и синтаксиса команд.
- Команда
echo %AGlobalVar%
будет правильно интерпретирована, если исходная переменная одинакова в окружении CMD. - Использование
cmd /c
может быть менее эффективно, поскольку для каждой команды создается и закрывается сеанс CMD, что может отражаться на производительности CI/CD процесса.
3. Систематическая разница и философия GitLab
Подход к выбору команд зависит прежде всего от вашей среды выполнения и требований к проекту. В GitLab CI/CD каждое задание выполняется в изолированном контейнере, и важно помнить о следующих аспектах:
- Контекст выполнения: GitLab рассматривает
shell
(например, PowerShell) как основную оболочку команд, предназначенную для выполнения скриптов. Использование других оболочек, таких как CMD, требует явного указания и может привести к различиям в интерпретации команд. - Производительность: Прямой вызов команд из PowerShell обычно быстрее, так как избегает накладных расходов на запуск нового процесса.
- Совместимость: Если вы используете специфические возможности PowerShell, такие как объекты и консольные команды, то обертывание команд в CMD может ограничить вашу гибкость.
Заключение
В выборе подхода к написанию скриптов для GitLab CI/CD важно рассматривать специфику работы команды, целевую оболочку и ожидаемое поведение команд. Выбор между прямыми вызовами PowerShell и использованием cmd /c
зависит от ваших требований к окружению и эффективности выполнения. Понимание этих отличий позволит вам более эффективно использовать возможности GitLab, улучшая процесс автоматизации разработки.