2012-04-19 8 views
16

Я использую поток git в течение нескольких месяцев, и он работал очень хорошо. Я хотел бы автоматизировать операцию «bump version».Ищете способ автоматизировать «рельефную версию» с потоком git

Проект представляет собой PHP, а footer.php имеет токен для замены тегом текущей версии. Я уверен, что с некоторым awk'ing git log и PHP-файла все должно получиться, но я предполагаю, что кто-то сделал это раньше ...

Любые идеи?

ответ

13

Вы можете использовать the semver gem, который добавляет файл .semver в корень вашего мерзавца репо. Semantic version numbers - это рекомендация по поводу структурированных/согласованных/значимых номеров версий, этот камень просто упрощает реализацию.

Таким образом, все, что вам будет нужно сделать, это добавить:

semver inc major|minor|patch 

в рабочий процесс (вручную или по сценарию), так что .semver обновляется во время выпуска.

Если вам не нужна зависимость ruby, semver довольно прост, поэтому немного экспериментов с sed, скорее всего, даст рабочее решение.

1

Вот код, который мы используем для увеличения номера версии в constants.h:

constants='../Include/constants.h' 

# Get the current build number 
currentbuild=`grep PRODUCT_BUILD $constants|sed 's/[^0-9]//g'` 
currentversion=`grep PRODUCT_VERSION $constants|sed 's/[^.0-9]//g'` 

echo "currentbuild=$currentbuild and currentversion=$currentversion" 
newver=$((1+$currentbuild)) 

# Update the build number on-disk: 
cp $constants /tmp/constants 
if sed -e "/PRODUCT_BUILD/ s/[0-9][0-9]*/${newver}/" </tmp/constants> $constants 
then  
    echo "Updated build number from $currentversion.$currentbuild to $currentversion.$newver." 
    cd ../Include 
    # Check it into version control 
    svn ci -m "updated build number to ${currentversion}.${newver} for $buildid in $buildroot" 
else 
    echo "There was a problem updating $constants to build $newver" 
fi  
10

В моем разветвленном проекте git-flow я фактически реализовал крючки и фильтры, запрос, который многие сделали в оригинальном проекте, но до сих пор не был реализован. С помощью этих функций вы можете автоматически обновлять номера версий в своем проекте. Раздвоенного проекта можно найти здесь https://github.com/petervanderdoes/gitflow

Для некоторых Bash сценариев на версию натыкаясь вы можете проверить два г я создал https://gist.github.com/2877083 или https://gist.github.com/2878492

8

Там также bumpversion (подробнее на https://github.com/peritus/bumpversion), что направлена ​​на то, чтобы заменить эту магию.

Установите с pip install bumpversion, сообщите, какие файлы содержат номер вашей версии и хотите ли вы зафиксировать и пометить это. Он также может быть сконфигурирован (с семантическим версированием по умолчанию), поэтому вы можете добавить декларативный файл конфигурации о том, как удалять версии для этого программного проекта по вашему выбору, а другие могут также использовать версии.

+0

Это отличный маленький инструмент. Спасибо – Alex

+0

'bumpversion', похоже, был оставлен оригинальным разработчиком, но есть [fork] (https://github.com/c4urself/bump2version), который более активно поддерживается и добавляет некоторые функции, такие как анотированные теги. – ostrokach

3

Semver веб-страниц государства:

Учитывая номер версии MAJOR.MINOR.PATCH, приращение:

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

Дополнительные ярлыки для метаданных предварительного выпуска и сборки доступны в виде расширений MAJOR.MINOR.PATCH.

Gitflow использует соглашение об именах для филиалов, исправление ошибок живет на ветви с префиксом hotfix/ и новых функций с префиксом feature/.

Если какая-либо ветка этого типа слита в ветвь освобождения, это приводит к увеличению PATCH. Если функция была объединена, поле MINOR должно быть увеличено.

Учитывая конкретную ревизию, вы должны иметь возможность определить, была ли объединена одна из ветвей и какое поле было удалено.

Жесткая часть вычисляет разломы. Раньше я рассматривал использование рефлексии для скомпилированного кода, чтобы определить, изменился ли API, однако я полагаю, что было бы намного проще использовать ключевое слово в сообщениях фиксации, чтобы назначать нарушения.

0

Вы можете автоматизировать перегрузку каждой транзакции. Здесь вы можете найти это сделать с помощью сценария оболочки и встроенного GIT крюка: https://github.com/addonszz/Galileo/tree/develop/githooks

Оболочки сума для запуска является: https://github.com/evandrocoan/.versioning/blob/master/scripts/updateVersion.sh

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

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

Патч, вы можете подключить каждый конец исправления потока git. В приведенной выше ссылке нет недостатка в том, чтобы перехватить исправление, чтобы увеличить скорость исправления: ./githooks/updateVersion.sh patch

Но второстепенным и крупным нет никакого трюка, все они выполняются в выпуске финишной части.

Obs

Я нашел решение, чтобы зацепить предварительно исправление-совершившее, то на вопрос: How to pre-hook the gitflow hotfix finish?

0

Если я правильно понимаю вашу работу «врезаться версию» правильно, то вы имеете в виду увеличивая номер версии в произвольном количестве файлов после того, как вы начали выпуск с git flow release start x.x.x, где версия также представлена ​​в теге git.

Поскольку первоначальный git-поток из Driessen был отменен, неофициальным преемником, похоже, является Peter van der Does gitflow-avh (https://github.com/petervanderdoes/gitflow-avh/), который содержит большое количество крючков потока git. Для получения полного списка см. https://github.com/petervanderdoes/gitflow-avh/tree/develop/hooks.

Я сделал версию натыкаясь на post-flow-release-start с этой небольшой скрипт:

VERSION=$1 

# Get rid of version prefix 
STRIPPED_VERSION=`echo $VERSION | cut -d'v' -f 2` 
sed -i '' -E "s/^([ |#|[:alpha:]]*)\[.*\]$/\1[$STRIPPED_VERSION]/1" ./README.md 
sed -i '' -E "s/^([\t| ]*\"version\":)\".*\"/\1\"$STRIPPED_VERSION\"/1" ./package.json 
git commit -a -m "version $STRIPPED_VERSION" 

exit 0 

Это немного жесткая, потому что два файла зашиты (README.md и package.json). Вы можете выполнить поиск старой версии из последнего тега, а затем повторить ее для всех сконфигурированных файлов в цикле.

Предостережения:
Для OSX требуется суффикс для sed -i, однако вы можете использовать пустые кавычки.Кроме того, расширенный параметр регулярного выражения для sed назван по-разному в Linux.

1

Вы также можете посмотреть на моем репо для bumpversion его в настоящее время сделаны для файлов установки питона, которые могут быть изменены Using-bumpversion-package