Показать последнее значение фиксации в веб-приложении? - PullRequest
9 голосов
/ 22 октября 2010

У меня есть несколько приложений на Rails, и я использую Git в качестве системы контроля версий. В качестве хостов репозитория я использую GitHub или Beanstalk.

То, что я пытаюсь сделать, довольно просто в теории. Каким-то образом покажите последний номер фиксации (хеш?) В нижнем колонтитуле веб-приложения. Чтобы при просмотре веб-приложения я мог убедиться, что оно зафиксировано и правильно развернуто.

Я могу представить, что есть два метода решения этой проблемы. Первой будет возможная особенность Git, которая позволяет выводить идентификатор фиксации. Вторым будет веб-хук после фиксации (и Beanstalk, и GitHub позволяют это).

Кто-нибудь когда-нибудь находил способ сделать это или что-то подобное?

Спасибо

Danny

Ответы [ 3 ]

15 голосов
/ 23 октября 2010

Во-первых, уточнение: post-commit ловушка не может добавить идентификатор коммита в файл в коммите, потому что идентификатор коммита зависит от фиксации верхнего дерева (представляющего верхний каталог), идентификатора верхнего дерева вочередь зависит от идентификаторов его членов, а идентификатор файла зависит от его содержимого ... и этот контент должен включать в себя идентификатор фиксации.Невозможно.

Но давайте рассмотрим различные решения:

Live, серверные сценарии

Если ваше веб-приложение развернуто в реальном времени из не-голого репозитория git (янадеюсь, что вы знаете, что вы делаете, не обращаясь к непокрытому репозиторию, т.е. к репозиторию с извлеченным / рабочим деревом), тогда ваше веб-приложение может проверить HEAD, используя git rev-parse HEAD (дает SHA-1 коммита), или лучше git describe --dirty (опция --dirty заставит возвращаемую строку содержать информацию о том, есть ли у вас несвязанные изменения в рабочей области), или git describe --always HEAD.

git rev-parse HEAD даетчто-то вроде 7611062b4ba6d1ebc4cf3e63c11204a4f5057660, тогда как git describe --dirty дает что-то вроде v1.7.3.2-95-g7611062 (что означает коммит с сокращенным SHA-1 из 7611062, 95 коммитов после коммита с тегом 'v1.7.3.2'), но это зависит от того, что вы пометиливыпуски с использованием аннотированных тегов.

Вариантом этого может быть наличие веб-приложения для проверки HEAD из хранилища, которое находится где-то еще в той же файловой системе, например, с git --git-dir=/path/to/.git describe HEAD.

Sidenote: если вы используете Ruby,Вы, вероятно, хотите использовать библиотеку grit .Эквивалент git rev-parse HEAD версии, вероятно, будет (не проверен!):

require 'grit'
include Grit

repo = Repo.new("/var/git/app.git")
head = repo.commits('HEAD', 1)

app_version = head.id


Живые статические файлы, полученные из git checkout

Редактировать: добавлен раздел 2010-10-23 13:33 + 0000
Если вы обслуживаете свои файлы из извлечения (рабочего дерева) из не-пустого хранилища git (невашей ситуации), вы можете использовать команды smudge и clean из filter gitattribute для выполнения CVS-подобного расширения ключевых слов при извлечении / регистрации.

В файле .gitattributes вы определяете файлы, для которых должен действовать атрибут filter:

*.rb filter=commitid

Вы определяете фильтр в файле git config (например, в .git/config), например,

[filter "commitid"]
        smudge = sed -e "s/\$Revision: ?\$/\$Revision: $(git rev-parse HEAD)\$/1"
        clean =  sed -e "s/\$Revision: ?[^$]*\$/\$Revision: \$/1"

Фильтр smudge заменит '$ Revision: $' на, например, '$ Revision: v1.7.3.2-95-g7611062' при оформлении заказа (это означает, что в проверенных выходных файлах это ключевое слово типа CVS будет расширено).Фильтр clean удалит расширение при хранении содержимого файла в базе данных объектов git (в репозитории git);в противном случае у вас возникли бы проблемы со сравнением файла и т. д.


Развертывание с использованием git archive

Если вместо этого вы развернете свое веб-приложение, оно не будетНе находясь в живом репозитории (который имеет свои особенности по отношению к нему и имеет возможные недостатки безопасности), и вы используете git archive где-то (например, чтобы заархивировать приложение, чтобы загрузить его на ваш хостинг-сайт), вы можете использовать подстановка ключевых слов .

Сначала вы должны сказать Git, что вы хотите, чтобы ключевые слова в файле были заменены на git archive.Вы делаете это, устанавливая export-subst для данного файла, например, добавляя к .gitattributes file

*.rb export-subst

, а затем добавляя в свой файл, который содержит / генерирует нижний колонтитул страницы, например,

$Format:%H$

, который будет заменен хэшем коммита (см. Описание симпатичных форматов, например, в git-log manpage).


Развернуто с использованием некоторого сценария развертывания

Если вы используете какой-либо сценарий / механизм сценариев для развертывания веб-приложения, вы должны следовать совету Jefromi , чтобы ваш сценарий развертывания встраивал информацию о версии.

Вы бынужно попросить кого-нибудь еще, как установить Capistrano (при условии, что вы используете его для развертывания), чтобы опубликовать: развертывание замените '@@ VERSION @@' местозаполнителем в вашем файле 'app.rb' с результатом git describe --always HEAD ... Git проекта Makefile использует sed для этого .

4 голосов
/ 22 октября 2010

Я полагаю, что в конечном итоге вы захотите сделать, как часть вашего процесса "сборки" (развертывание, ваше дело?), Сохранить выходные данные git rev-parse HEAD или git describe HEAD (лучше, если вы пометите релизы) в файле. Ваше приложение может затем отобразить содержимое файла. Хеш коммита не может быть частью какого-либо отслеживаемого контента (хеш коммита зависит от отслеживаемого контента). Конечно, если в вашем приложении заканчивается репозиторий, вы можете просто запустить команду из приложения, но гораздо элегантнее сделать это один раз.

Кстати, именно такой подход использует сам git. У него есть teeny shell-скрипт , который в основном выводит git describe вывод в GIT-VERSION-FILE, который затем компилируется для предоставления информации о версии.

Надеюсь, я не неправильно понял вашу ситуацию - вы немного озадачены тем, что вы говорите "возможная особенность Git, которая позволяет выводить идентификатор фиксации". Это очень базовая возможность git.

0 голосов
/ 22 октября 2010

Сначала ответьте на ваш вопрос, запустите следующую команду в вашем скрипте ruby:

`git log -n1 | head -1`.split.last

Второе: что вы имеете в виду, что вы используете beanstalk в качестве хоста хранилища? Разве beanstalk не является сервером очередей?

...