Automatic tagging of releases
你如何在git中标记你的发布版本?
现在,每个版本都由内部版本号标识,但即使回购中没有任何更改,它们也会增加。 我的想法是在登台服务器上成功部署后自动生成它。 例如。
- 运行Hudson构建
- 成功时,添加新标签,即1.0-1
- 在下一次成功构建时添加下一个标记,1.0-2
- 然后在站点页脚中显示版本标记
这需要:
- Hudson管理下一个版本号
- 或脚本将最后一个标记存储在某个文件中
- 或者解析git标签以确定最后一个
有小费吗?
我这样写是为了帮助逐步更新标签,例如1.0.1到1.0.2等
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | #!/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 |
你所谈论的更类似于技术修订号,如
这与真正的应用程序版本不同,您应该仍然独立于Hudson管理,因为它依赖于版本控制策略。
如果您需要Posix版本,几乎与上述答案相同
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | #!/bin/sh #Get the highest tag number VERSION=`git describe --abbrev=0 --tags` VERSION=${VERSION:-'0.0.0'} #Get number parts MAJOR="${VERSION%%.*}"; VERSION="${VERSION#*.}" MINOR="${VERSION%%.*}"; VERSION="${VERSION#*.}" PATCH="${VERSION%%.*}"; VERSION="${VERSION#*.}" #Increase version PATCH=$((PATCH+1)) #Get current hash and see if it already has a tag GIT_COMMIT=`git rev-parse HEAD` NEEDS_TAG=`git describe --contains $GIT_COMMIT` #Create new tag NEW_TAG="$MAJOR.$MINOR.$PATCH" echo"Updating to $NEW_TAG" #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 else echo"Already a tag on this commit" fi |
非常好的解决方案timhc22
唯一的是它需要最后一个标签(无论分支)
如果您处理具有多个分支的项目,则可能会出现问题。
我建议你的基础有所改进。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | #!/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 |
例如,如果你有:
- 主分支:将创建master-X.Y.Z
- 发布/ X.Y:将创建X.Y.Z
无论如何,非常感谢它帮助了我很多。
如果您使用git插件并让Hudson提取代码,Hudson会自动标记构建。我不确定这是否会被自动推送;在我们的设置中,我们做了额外的标记,并在我们的构建脚本中包含一个'git push --tags',所以我们肯定会在我们的中央存储库中看到Hudson标记。
我使用如下。它与分支机构完美配合。下面的评论和gitversion / semver.org启发了以下片段。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 | #!/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 |
好的解决方案我建议使用带注释的标签来表示发布?喜欢:
1 | git tag -a"$NEW_TAG" -m"autogenerated" |