Скрипт для саморасполагаемого shell runner в GitLab

Вопрос или проблема

У меня есть довольно наивный вопрос о концептуальной разнице между двумя альтернативами настройки .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, улучшая процесс автоматизации разработки.

Оцените материал
Добавить комментарий

Капча загружается...