Как вызвать несколько многострочных команд в скрипте yml?

#bash #shell #yaml #gitlab-ci

#bash #оболочка #yaml #gitlab-ci

Вопрос:

Я не совсем уверен, как добавить многострочный скрипт с несколькими командами в файл yml моего CI — который в моем случае является .gitlab-ci.yml :

 production:
    stage: deploy
    image: ${DOCKER_IMAGE}
    script:
        - while IFS='-' read -r dom app; do
            docker stop "$dom-$app" || true amp;amp;
            docker rm "$dom-$app" || true 
            docker run
               --name "$dom-$app"
               --detach
               --restart=always
               -e VIRTUAL_HOST=$dom
               "$dom-$app":latest
        done < $FILE
  

Итак, что я здесь делаю, так это читаю файл со списком приложений. Для каждой строки я должен остановить существующий образ docker, удалить его и запустить новый с некоторыми параметрами.

  1. Как мне подключить команды docker (stop, rm и run)? Может быть amp;amp; ?
  2. Должен ли я использовать " for $dom-$app ?

Ответ №1:

Существует несколько способов создания многострочных строк в YAML.

При использовании многострочной простой строки все строки будут складываться вместе с пробелами.

Кроме того, ваша последняя строка строки имеет недостаточный отступ.

Более длинные строки, подобные этой, следует заключать в кавычки, потому что высока вероятность того, что внутри строки есть : или # , которая является специальной в YAML.

Я предлагаю использовать стиль буквального блока, потому что это означает, что текст будет интерпретироваться именно так, как вы его видите:

     script:
    - |
      while IFS='-' read -r dom app; do
        docker stop "$dom-$app" || true
        docker rm "$dom-$app" || true 
        docker run 
         --name "$dom-$app" 
         --detach 
         --restart=always 
         -e VIRTUAL_HOST=$dom 
         "$dom-$app":latest
      done < $FILE
  

(Обратите внимание, что последовательности (элементы, начинающиеся с - ) не обязательно должны иметь отступ, поэтому - находится непосредственно под script .)

Вы можете найти более подробную информацию о стилях цитирования YAML на моем веб-сайте:https://www.yaml.info/learn/quote.html

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

1. Спасибо. Должен ли я заключать свои переменные в кавычки? В name параметре я это сделал, в VIRTUAL_HOST Я этого не делал… И нужно ли мне amp;amp; в конце каждой команды? В первом я сделал это, во втором нет..

2. Цитирование в bash всегда является хорошей идеей, если переменные могут содержать пробелы, например. Поэтому, если вы не уверены, процитируйте это. Но это чисто вопрос bash. Если вы используете amp;amp; для объединения двух команд, то вторая будет выполнена только в том случае, если первая выполнена успешно. Итак, это зависит от того, как вы хотите, чтобы ваш скрипт вел себя.