Sed не удалось заменить строку в кавычках во время Gitlab CI - PullRequest
0 голосов
/ 17 мая 2018

Я пытаюсь динамически установить имя и тег изображения для AWS Elastic Beanstalk в моем файле Dockerrun.aws.json:

"Image": {
  "Name": "IMAGETAG",
  "Update": "true"
}

со следующей командой sed в качестве скрипта в моем файле GI GitLab:

sed -i.bak "s|IMAGETAG|$CONTAINER_TEST_IMAGE|" Dockerrun.aws.json && rm Dockerrun.aws.json.bak; eb deploy Production

Где $CONTAINER_TEST_IMAGE - это проверенная хорошая переменная среды (протестировано с помощью echo $CONTAINER_TEST_IMAGE в качестве скрипта). $CONTAINER_TEST_IMAGE содержит структуру следующего содержимого (где ... - полный идентификатор):

gitlab.company.com:123/my-group/my-project:core_7de09851...8f_testing

Проблема, с которой я сталкиваюсь, заключается в том, что sed не работает во время конвейера CI. Я не понимаю, почему, учитывая, что если я установлю переменную среды локально и запуском той же команды, она успешно заменит значение Name на тот же URL структуры. Это тестирование проводилось на Macbook.

Я знаю, что файл не обновляется, потому что журнал Gitlab CI сообщает

WARN: Failed to pull Docker image IMAGETAG:latest, retrying...

Я пробовал несколько вещей, которые не работали:

  • Выполнение команд sed и eb deploy в виде отдельных сценариев (две разные строки в файле CI)
  • Переключите переменную, которую я хочу заменить в Dockerrun.aws.json, на <IMAGE>
  • Пока он был на <IMAGE>, вместо * .bak выполнялся sed -i='' "s|<IMAGE>|$CONTAINER_RELEASE_IMAGE|" Dockerrun.aws.json, а затем записывался (я где-то читал, что sed имеет несоответствия в OSX с версией -i = '')

Есть ли у кого-нибудь мысли о том, что это за проблема и как ее можно решить?

1 Ответ

0 голосов
/ 28 мая 2018

Было два аспекта, которые шли неправильно:

  1. Команда sed не выполнялась правильно на бегуне, но работала локально
  2. eb deploy былоигнорируя обновленный файл

Для первой части он работает sed команда:

sed -ri "s|\"IMAGETAG\"|\"$1\"|" Dockerrun.aws.json

где строка в Dockerrun.aws.json"Name": "IMAGETAG",.sed все еще смущает меня здесь, поэтому я не могу объяснить, почему эта работает против оригинальной команды.

Для части 2, очевидно, eb deploy всегда будет смотреть на последний коммит, если это возможно, а не натекущий рабочий каталог.Думаю, имеет смысл.Чтобы обойти это, запустите команду как eb deploy --staged.Вы можете прочитать больше об этом флаге на сайте AWS .

Также обратите внимание, что мой .gitlab-ci.yml просто вызывает скрипт для запуска всего этого, а не делает его там.

- chmod +x ./scripts/ebdeploy.sh
- ./scripts/ebdeploy.sh $CONTAINER_TEST_IMAGE
...