2010-09-21 12 views
18

W jaki sposób otagujesz swoje wersje wydań w git?git: Automatyczne oznaczanie wydań

Teraz każde wydanie jest identyfikowane według numeru kompilacji, ale zwiększa się, nawet jeśli nie ma zmian w repozytorium. Moim pomysłem jest automatyczne wygenerowanie go po pomyślnym wdrożeniu na serwerze testowym. Na przykład.

  • prowadzony Hudson budować
  • gdy uda, dodać nowy tag, czyli 1.0-1
  • na następnej udanej kompilacji dodać kolejny tag, 1.0-2
  • wersja znacznik jest wyświetlany wtedy w stopce serwisu

Wymagałoby to:

  • Hudson zarządzać kolejne numery wersji
  • lub skryptu do przechowywania ostatni tag w jakimś pliku
  • lub analizowania tagi git aby określić ostatnie

jakieś wskazówki?

Odpowiedz

1

Hudson automatycznie taguje kompilację, jeśli używasz wtyczki git i pozwala Hudson wyodrębnić kod. Nie jestem pewien, czy zostanie to automatycznie zepchnięte; w naszej konfiguracji robimy dodatkowe tagowanie i dołączamy "git push --tags" w naszym skrypcie kompilacji, więc zdecydowanie widzimy tagi Hudsona w naszym centralnym repozytorium.

16

Napisałem to, aby pomóc w aktualizowaniu tagów przyrostowo, na przykład 1.0.1 do 1.0.2 itp

#!/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

Czy jest to uruchamiane przez hak git (jeśli tak, który?), czy uruchamiasz to ręcznie zamiast 'git push'? – Gady

+1

Jest to tylko plik .sh, który uruchamiam ręcznie (ale plik .sh jest również uruchamiany automatycznie jako część kompilacji Jenkins, w której projekt zawsze wymaga aktualizacji numeru wersji). Prawdopodobnie mógłby zostać dodany do haka (nie wiem zbyt wiele o hakach git, szczerze mówiąc, więc nie mogę tam pomóc!). – timhc22

+1

Dodaj '2>/dev/null' na końcu' git description - zawiera $ GIT_COMMIT', aby usunąć ostrzeżenie "fatalne". Dzięki za scenariusz – koxon

2

Naprawdę dobre rozwiązanie timhc22 Jedyną rzeczą jest to, że trwa ostatni tag (niezależnie od dziedziny) Jeśli pracujesz nad projektem z wieloma gałęziami można mieć problem . Zaproponowałem tylko ulepszenie z twoją bazą.

#!/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 

Działa to na przykład, jeśli masz:

  • oddział główny: stworzy master-XYZ
  • uwolnienie/XY: stworzy XYZ

W każdym razie wielkie dzięki, bardzo mi pomogło.

1

Używam jak poniżej. Działa doskonale z gałęziami. Poniżej fragmenty inspirowane powyższymi komentarzami i 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 
Powiązane problemy