2012-10-13 1 views
11

Что я делаю Я думаю, что это должно быть довольно просто, но я не могу понять, как заставить его работать.Вставьте номер версии git в файлы во время развертывания

Я хочу встроить уникальный номер версии в файлы html и javascript по двум причинам. Первая причина заключается в том, что я хочу, чтобы убедиться, что, когда Javascript файл будет загружен, система не пытается использовать кэш, если есть новая версия, но если я мог бы назвать его, используя что-то вроде

<script src="/app.js?v1.0.1-1-95425234"></script> 

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

Я встретил git describe по пути, и я думаю, что его выходное значение будет действительно хорошо подходит для этого.

В основном я хочу, чтобы взять ключ в моем JavaScript и HTML файлах, такой как GIT-CURRENT-VERSION и заменить его на выходе git describe

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

Я подозреваю, что какая-то комбинация sed и grep будет делать трюк здесь, и если бы я мог найти один лайнер для этого, было бы очень легко добавить к моему сценарию развертывания.

Заранее благодарен!

+0

Какую структуру вы используете? Я думаю, что есть лучшие решения, такие как рекурсивная замена «GIT-CURRENT-VERSION». – guettli

+0

guettli - Я опубликовал то, что я использовал. Надеюсь, поможет! –

ответ

5

Вы могли бы сделать что-то вроде следующих из корня вашего развернутого мерзавца дерева:

export VERSION="$(git describe)" 
find . -type f -print0 | xargs -0 sed -i "s/GIT-CURRENT-VERSION/$VERSION/g" 

(Это было только беглое тестирование - использовать с осторожностью.)

Обратите внимание, что это оставит свое дерево с локальными изменениями.

9

Я никогда не слышал о fabric, но если ткань использует (или звонки) git archive, то вы можете использовать gitattributes. То есть, вы можете можете иметь ваши HTML-файлы с чем-то вроде:

<script src="/app.js?$Format:%H$"></script> 

И в .gitattributes на верхней части хранилища:

*.html export-subst 

Затем, когда вы создаете архив с git-archive, $Format:%H$ будет заменяется хешем фиксации. Вы можете использовать все, что доступно, с --pretty-format в git-log.

Проверьте руководство по gitattributes, или намного лучше: глава «8.2 Customizing Git - Git Attributes» из Pro Git книги, чтобы получить больше идей.

1

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

export DESCRIPTION="$(git describe)" 
find [PATH] -regextype posix-extended -regex ".*\.(js|html)" -type f -print0 | xargs -0 sed -i "s/CURRENT-GIT-DESCRIPTION/$DESCRIPTION/g" 

Я расскажу немного о том, что я здесь делаю.

export DESCRIPTION="$(git describe)" Получает текущее описание текущего состояния репозитория git. Для получения дополнительной информации, проверьте git describe Manual Page.

Далее, find [PATH] -regextype posix-extended -regex ".*\.(js|html)" -type f -print0 вы можете заменить [PATH] на путь к вашему репозиторию. -regextype posix-extended -regex ".*\.(js|html)" спускается через ваши каталоги и находит все файлы, соответствующие регулярному выражению, определяемые ".*\.(js|html)". В моем случае я знаю, что мне нужны только замены в файлах javascript или html. Наконец xargs -0 sed -i "s/CURRENT-GIT-DESCRIPTION/$DESCRIPTION/g" сообщает системе заменить CURRENT-GIT-DESCRIPTION на значение, определенное git describe выше.

В моем случае это работает очень хорошо, поскольку я использую fabric для развертывания на сервере, и поскольку я хочу, чтобы изменения вступили в реальное время, то, что я делаю, это обновление репозитория, а затем его копирование в новое развертывание системы. Когда система готова к работе, я избавлюсь от файлов данных git, оставив это как обычную структуру данных. Теперь я могу просто сказать системе использовать новую сборку, и все готово к работе.

Надеюсь, что это поможет другим людям, желающим достичь чего-то подобного!

 Смежные вопросы

  • Нет связанных вопросов^_^