Лучший способ применить патч git через Ansible

Мне нужно развернуть кучу серверов Ubuntu таким же образом, поэтому я подумал об использовании ansible вместо того, чтобы делать это вручную каждый раз, когда мне нужен новый.

Одна из вещей, которые мне нужно сделать, это клонировать исходный репозиторий с помощью git и применить к нему собственный патч. Я надеялся сохранить патч в моем каталоге ansible в files/, но, похоже, в модуле git ansible нет функции «git apply». Как лучше всего делать что-то подобное?

Некоторые варианты:

  1. Запустите мой собственный репозиторий git с веткой, включающей мой патч. Это сработает, но мне придется где-то поддерживать свой собственный репозиторий git и убедиться, что мои серверы имеют к нему доступ/разрешения. Было бы неплохо, если бы все конфигурации хранились в моем каталоге ansible вместо того, чтобы полагаться на другой репозиторий git, который мне приходится поддерживать.
  2. Используйте оболочку или командный модуль. Легче всего начать работать, но я не смогу повторно запустить playbook.
  3. Другие предложения?

person digitalsky    schedule 05.02.2016    source источник
comment
Можете ли вы применить патч к ветке master репозитория, который вы клонируете?   -  person Code-Apprentice    schedule 05.02.2016
comment
Поскольку я клонирую восходящий/публичный репозиторий, я не смогу этого сделать.   -  person digitalsky    schedule 05.02.2016
comment
я бы создал еще одну ветку и просто переключил модуль git ansible на version: {{ the_version }}, где the_version — ваша ветка.   -  person ddavison    schedule 05.02.2016
comment
Так вы говорите, что у вас нет прав на запись в репо?   -  person Code-Apprentice    schedule 05.02.2016
comment
если у вас нет доступа, то разветвите его.   -  person ddavison    schedule 05.02.2016
comment
@digitalsky как насчет использования shell или script командных модулей в ansible и после успешного git clone , запустить cd <local-clone-dir>; git am <filename.patch> ? Всегда есть вероятность, что исправление может не применяться к последней версии клонированного исходного кода, что можно обнаружить по коду возврата команд git. Обычно git возвращает 0 в случае успеха и 1 в случае неудачи.   -  person TheCodeArtist    schedule 05.02.2016
comment
Спасибо за все ответы. Я хотел бы подчеркнуть, что в моем ОП упоминается другое репо/ветвь как вариант 1, но я пытаюсь найти способ заставить это работать без собственного репо/форка/ветки из-за проблем с обслуживанием/доступом.   -  person digitalsky    schedule 05.02.2016
comment
@TheCodeArtist: Спасибо за предложение - я планирую сделать что-то подобное для варианта 2, но не думаю, что смогу повторно запустить плейбук таким образом, потому что он попытается повторно применить патч.   -  person digitalsky    schedule 05.02.2016
comment
@digitalsky, поэтому в своем сценарии добавьте git log --oneline | grep <commit-title> перед попыткой git am, чтобы определить, был ли уже применен патч. Для отслеживаемости не забудьте добавить эхо/отпечатки, такие как Checking for patch <xyz>..., Patch <xyz> already applied. Skipping... и т. д., чтобы регистрировать ход выполнения и отслеживание пути, чтобы помочь в отладке, когда что-то когда-либо терпит неудачу в автоматизированном производственном экземпляре.   -  person TheCodeArtist    schedule 05.02.2016
comment
@TheCodeArtist: Сейчас у меня есть задача 1 скопировать патч на удаленный компьютер и зарегистрировать переменную. Затем task2 применяет git (используя модуль commnad), когда переменная.изменена. Это при условии, что всякий раз, когда требуется копия, мне нужно запустить git apply. Но мне больше нравится твоя идея. Спасибо! Хотя в идеале модуль git должен обрабатывать что-то вроде этого.   -  person digitalsky    schedule 05.02.2016


Ответы (1)


Используйте модуль Ansible script.

Напишите сценарий оболочки, который пытается исправить репозиторий git с помощью локального исправления.

Обрабатывайте различные возможности, такие как:

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

Пример шаблона сценария оболочки для вышеуказанного:

# sync the local copy with latest changes from the upstream git repository.

# TODO : Check here for return code of "git am" for failure.
#
# If <filename.patch> already applied, then :
# - This is probably a cookbook re-run,
#   or
# - The latest upstream source now comes with the patch applied.
# Display/Log an info message about this and skip to the end of the script.

# Patch latest upstream source with a local patch
echo "Attempting to apply <filename.patch>..." 
cd <local-clone-dir>
git am <filename.patch>

# TODO : Check here for return code of "git am" for failure.
#
# In case <filename.patch> no longer applies 
# to the latest version of the source from upstream repo,
# display/log the error and abort immediately.
    
echo "Successfully applied <filename.patch>." 

# Continue with rest of the tasks.
person TheCodeArtist    schedule 05.02.2016
comment
Я бы добавил в ваш список возможностей, что Git user.name и user.email не настроены, так как команда git am попытается выполнить фиксацию после применения патча. - person JHowIX; 02.06.2016