Как настроить этап ci Gitlab с помощью нескольких команд оболочки

# #shell #gitlab #continuous-integration #yaml #gitlab-ci

Вопрос:

Приведем этот пример конфигурации конвейера .Net CI для Gitlab

 image: mcr.microsoft.com/dotnet/sdk:5.0

stages:
  - build

build:
  stage: build
  script:
      - |
        BUILD_WARNINGS_LOG_FILE="buildWarnings.log";
        
        dotnet build -consoleloggerparameters:"Summary;Verbosity=normal" -m -p:"WarnLevel=5;EnforceCodeStyleInBuild=true" -t:"clean,build" -fl1 "/flp1:logFile=$BUILD_WARNINGS_LOG_FILE;warningsonly";
        
        if [ $? -eq 0 ] amp;amp; [ $(wc -l < $BUILD_WARNINGS_LOG_FILE) -gt 0 ]
        then
          # do stuff here
        fi
 

Конвейер завершается сбоем из-за недопустимого синтаксиса. Это происходит потому, что он не знает, что существует несколько команд оболочки для выполнения.

Этот .sh файл работает на моем локальном компьютере

 #!/bin/bash

BUILD_WARNINGS_LOG_FILE="buildWarnings.log";

dotnet build --output build -consoleloggerparameters:"Summary;Verbosity=normal" -m -p:"WarnLevel=5;EnforceCodeStyleInBuild=true" -t:"clean,build" -fl1 "/flp1:logFile=$BUILD_WARNINGS_LOG_FILE;warningsonly";

if [ $? -eq 0 ] amp;amp; [ $(wc -l < $BUILD_WARNINGS_LOG_FILE) -gt 0 ]
then
  # do stuff here
fi
 

итак, как я могу правильно встроить его в этап ci Gitlab?

Ответ №1:

Есть три способа сделать это:

  1. Добавьте свой сценарий оболочки в изображение, чтобы вы могли его выполнить: (в вашем случае для этого потребуется создать новое изображение на основе mcr.microsoft.com/dotnet/sdk:5.0 )
 image: mcr.microsoft.com/dotnet/sdk:5.0

stages:
  - build

build:
  stage: build
  script:
      - bash /path/to/your/script.sh
 
  1. Создайте сценарий оболочки во время выполнения (просто скопируйте сценарий в файл оболочки и сделайте его исполняемым).
 image: mcr.microsoft.com/dotnet/sdk:5.0

stages:
  - build

build:
  stage: build
  script:
      - echo "BUILD_WARNINGS_LOG_FILE="buildWarnings.log";ndotnet buildn-consoleloggerparameters:"Summary;Verbosity=normal" -m -p:"WarnLevel=5;EnforceCodeStyleInBuild=true" -t:"clean,build" -fl1 "/flp1:logFile=$BUILD_WARNINGS_LOG_FILE;warningsonly";nif [ $? -eq 0 ] amp;amp; [ $(wc -l < $BUILD_WARNINGS_LOG_FILE) -gt 0 ]nthennfi" > my-bash.sh
      - chmod  X my-bash.sh
      - bash ./my-bash.sh
 
  1. Используйте правильный синтаксис команды multi-bash. (обратите внимание на черточку после трубы)
 image: mcr.microsoft.com/dotnet/sdk:5.0

stages:
  - build

build:
  stage: build
  script:
      - |-
        BUILD_WARNINGS_LOG_FILE="buildWarnings.log";
        
        dotnet build -consoleloggerparameters:"Summary;Verbosity=normal" -m -p:"WarnLevel=5;EnforceCodeStyleInBuild=true" -t:"clean,build" -fl1 "/flp1:logFile=$BUILD_WARNINGS_LOG_FILE;warningsonly";
        
        if [ $? -eq 0 ] amp;amp; [ $(wc -l < $BUILD_WARNINGS_LOG_FILE) -gt 0 ]
        then
          # do stuff here
        fi
 

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

1. Я предпочитаю третье решение. К сожалению, это не работает, потому что Gitlab считает, что сценарий является сценарием Powershell … по крайней мере, я вижу это в журналах ошибок In C:WindowsTEMPbuild_script975465063script.ps1 , но я попытаюсь преобразовать его в сценарий PS и попробовать