2010-09-21 2 views
18

Как вы помечаете свои версии релиза в git?git: Автоматическая маркировка релизов

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

  • запустить Хадсон построить
  • в случае успеха, добавить новый тег, то есть 1.0-1
  • на следующей успешной сборки добавить следующий тег, 1.0-2
  • версия тег отображается затем в сноске сайта

Это потребует:

  • Hudson управлять следующей версии номера
  • или скрипт для сохранения последнего тега в некотором файле
  • или разобрать Git теги для определения последних

Любые советы?

ответ

1

Hudson автоматически маркирует сборку, если вы используете плагин git и позволяете Хадсону извлекать код. Я не уверен, что это автоматически активируется; в нашей настройке мы добавили дополнительные теги и включили «git push -tags» в наш скрипт сборки, поэтому мы определенно видим теги Hudson в нашем центральном репозитории.

16

Я написал это, чтобы помочь с обновлением тегов поэтапно, например. 1.0.1 до 1.0.2 и т.д.

#!/bin/bash 

#get highest tag number 
VERSION=`git describe --abbrev=0 --tags` 

#replace . with space so can split into an array 
VERSION_BITS=(${VERSION//./ }) 

#get number parts and increase last one by 1 
VNUM1=${VERSION_BITS[0]} 
VNUM2=${VERSION_BITS[1]} 
VNUM3=${VERSION_BITS[2]} 
VNUM3=$((VNUM3+1)) 

#create new tag 
NEW_TAG="$VNUM1.$VNUM2.$VNUM3" 

echo "Updating $VERSION to $NEW_TAG" 

#get current hash and see if it already has a tag 
GIT_COMMIT=`git rev-parse HEAD` 
NEEDS_TAG=`git describe --contains $GIT_COMMIT` 

#only tag if no tag already (would be better if the git describe command above could have a silent option) 
if [ -z "$NEEDS_TAG" ]; then 
    echo "Tagged with $NEW_TAG (Ignoring fatal:cannot describe - this means commit is untagged) " 
    git tag $NEW_TAG 
    git push --tags 
else 
    echo "Already a tag on this commit" 
fi 
+0

Это вызвано крючком git (если да, то какой?), или вы запускаете это вручную вместо 'git push'? – Gady

+1

Это просто файл .sh, который я запускаю вручную (но файл .sh также запускается автоматически как часть сборки Jenkins, в которой проекту всегда требуется обновление до номера версии). Вероятно, это могло бы быть добавлено к крюку (я действительно мало знаю о git-крючках, чтобы быть честным, поэтому не могу помочь там, я боюсь!) – timhc22

+1

Добавить '2>/dev/null' в конце' git описать - содержит $ GIT_COMMIT', чтобы удалить «фатальное» предупреждение. Спасибо за скрипт – koxon

2

Действительно хорошее решение timhc22 Единственное, что она занимает последнюю метку (независимо от ветви) Если вы работаете над проектом с несколькими филиалами вы могли бы иметь проблему , Я предложил только улучшение с вашей базой.

#!/bin/sh 

# retrieve branch name 
BRANCH_NAME=$(git branch | sed -n '/\* /s///p') 

# remove prefix release 
REGEXP_RELEASE="release\/" 
VERSION_BRANCH=$(echo "$BRANCH_NAME" | sed "s/$REGEXP_RELEASE//") 

echo "Current version branch is $VERSION_BRANCH" 

# retrieve the last commit on the branch 
VERSION=$(git describe --tags --match=$VERSION_BRANCH* --abbrev=0) 

# split into array 
VERSION_BITS=(${VERSION//./ }) 

#get number parts and increase last one by 1 
VNUM1=${VERSION_BITS[0]} 
VNUM2=${VERSION_BITS[1]} 
VNUM3=${VERSION_BITS[2]} 
VNUM3=$((VNUM3+1)) 

#create new tag 
NEW_TAG="$VNUM1.$VNUM2.$VNUM3" 

echo "Updating $VERSION to $NEW_TAG" 

#get current hash and see if it already has a tag 
GIT_COMMIT=`git rev-parse HEAD` 
NEEDS_TAG=`git describe --contains $GIT_COMMIT` 

#only tag if no tag already (would be better if the git describe command above could have a silent option) 
if [ -z "$NEEDS_TAG" ]; then 
    echo "Tagged with $NEW_TAG (Ignoring fatal:cannot describe - this means commit is untagged) " 
    git tag $NEW_TAG 
    git push --tags 
else 
    echo "Already a tag on this commit" 
fi 

Это работает, например, если у вас есть:

  • мастер филиала: будет создавать мастер-XYZ
  • релиз/XY: создаст XYZ

В любом случае Большое спасибо, это мне очень помогло.

1

Я использую, как показано ниже. Он отлично работает с филиалами. Ниже приведены фрагменты, основанные на следующих комментариях: gitversion/semver.org.

#!/bin/sh 

# This script will be executed after commit in placed in .git/hooks/post-commit 

# Semantic Versioning 2.0.0 guideline 
# 
# Given a version number MAJOR.MINOR.PATCH, increment the: 
# MAJOR version when you make incompatible API changes, 
# MINOR version when you add functionality in a backwards-compatible manner, and 
# PATCH version when you make backwards-compatible bug fixes. 

echo "Starting the taging process based on commit message +semver: xxxxx" 

#get highest tags across all branches, not just the current branch 
VERSION=`git describe --tags $(git rev-list --tags --max-count=1)` 

# split into array 
VERSION_BITS=(${VERSION//./ }) 

echo "Latest version tag: $VERSION" 

#get number parts and increase last one by 1 
VNUM1=${VERSION_BITS[0]} 
VNUM2=${VERSION_BITS[1]} 
VNUM3=${VERSION_BITS[2]} 
# VNUM3=$((VNUM3+1)) 

# Taken from gitversion 
# major-version-bump-message: '\+semver:\s?(breaking|major)' 
# minor-version-bump-message: '\+semver:\s?(feature|minor)' 
# patch-version-bump-message: '\+semver:\s?(fix|patch)' 
# get last commit message and extract the count for "semver: (major|minor|patch)" 
COUNT_OF_COMMIT_MSG_HAVE_SEMVER_MAJOR=`git log -1 --pretty=%B | egrep -c '\+semver:\s?(breaking|major)'` 
COUNT_OF_COMMIT_MSG_HAVE_SEMVER_MINOR=`git log -1 --pretty=%B | egrep -c '\+semver:\s?(feature|minor)'` 
COUNT_OF_COMMIT_MSG_HAVE_SEMVER_PATCH=`git log -1 --pretty=%B | egrep -c '\+semver:\s?(fix|patch)'` 

if [ $COUNT_OF_COMMIT_MSG_HAVE_SEMVER_MAJOR -gt 0 ]; then 
    VNUM1=$((VNUM1+1)) 
fi 
if [ $COUNT_OF_COMMIT_MSG_HAVE_SEMVER_MINOR -gt 0 ]; then 
    VNUM2=$((VNUM2+1)) 
fi 
if [ $COUNT_OF_COMMIT_MSG_HAVE_SEMVER_PATCH -gt 0 ]; then 
    VNUM3=$((VNUM3+1)) 
fi 

# count all commits for a branch 
GIT_COMMIT_COUNT=`git rev-list --count HEAD` 
echo "Commit count: $GIT_COMMIT_COUNT" 
export BUILD_NUMBER=$GIT_COMMIT_COUNT 

#create new tag 
NEW_TAG="$VNUM1.$VNUM2.$VNUM3" 

echo "Updating $VERSION to $NEW_TAG" 

#only tag if commit message have version-bump-message as mentioned above 
if [ $COUNT_OF_COMMIT_MSG_HAVE_SEMVER_MAJOR -gt 0 ] || [ $COUNT_OF_COMMIT_MSG_HAVE_SEMVER_MINOR -gt 0 ] || [ $COUNT_OF_COMMIT_MSG_HAVE_SEMVER_PATCH -gt 0 ]; then 
    echo "Tagged with $NEW_TAG (Ignoring fatal:cannot describe - this means commit is untagged) " 
    git tag "$NEW_TAG" 
else 
    echo "Already a tag on this commit" 
fi 
Смежные вопросы