#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, удалить его и запустить новый с некоторыми параметрами.
- Как мне подключить команды docker (stop, rm и run)? Может быть
amp;amp;
? - Должен ли я использовать
"
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;
для объединения двух команд, то вторая будет выполнена только в том случае, если первая выполнена успешно. Итак, это зависит от того, как вы хотите, чтобы ваш скрипт вел себя.