Вставьте 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 будет делать трюк здесь, и если бы я мог найти один лайнер для этого, было бы очень легко добавить к моему развертыванию script.

Спасибо заранее!

Ответ 1

В корне вашего развернутого дерева git вы можете сделать что-то вроде следующего:

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

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

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

Ответ 2

Я никогда не слышал о 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 Настройка Git - Git Атрибуты " Pro Git, чтобы получить больше идей.

Ответ 3

В ответ на комментарий геттли я решил опубликовать окончательный результат, который у меня был. Здесь мое решение, основанное на решении 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 описать страницу руководства.

Далее, 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.

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

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