Вставьте 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, оставив это как обычную структуру данных. Теперь я могу просто сказать системе использовать новую сборку, и все готово к работе.
Надеюсь, что это поможет другим людям, желающим добиться чего-то подобного!