Автоматическая пометка релизов
Как вы помечаете свои версии выпуска в git?
Теперь каждый релиз идентифицируется номером сборки, но они увеличиваются, даже если в репо нет изменений. Моя идея - автоматически генерировать его при успешном развертывании на промежуточном сервере. Например.
- запустите сборку Hudson
- при успешном добавлении нового тега, т.е. 1.0-1
- в следующей успешной сборке добавить следующий тег, 1.0-2
- отображается тег версии, а затем в нижнем колонтитуле сайта
Для этого потребуется:
- Хадсон для управления номерами следующих версий
- или script для хранения последнего тега в каком-либо файле
- или проанализировать теги git для определения последнего
Любые советы?
Ответы
Ответ 1
То, о чем вы говорите, больше похоже на номер технической версии, который a git describe
сгенерирует.
Это отличается от настоящей версии приложения, которой вы все равно должны управлять независимо от Hudson, поскольку она зависит от политики управления версиями.
Ответ 2
Я написал это, чтобы помочь с постепенным обновлением тегов, например 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 2>/dev/null'
#only tag if no tag already
if [ -z "$NEEDS_TAG" ]; then
git tag $NEW_TAG
echo "Tagged with $NEW_TAG"
git push --tags
else
echo "Already a tag on this commit"
fi
Ответ 3
В случае, если вам понадобится версия Posix, почти так же, как ответ выше
#!/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
Ответ 4
Хадсон автоматически помечает сборку, если вы используете плагин git и позволяете Хадсону извлекать код. Я не уверен, что это автоматически активируется; в нашей настройке мы добавили дополнительную метку и включили "git push -tags" в нашей сборке script, поэтому мы определенно видим теги Hudson в нашем центральном репозитории.
Ответ 5
Действительно хорошее решение 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
Это работает, например, если у вас есть:
- главная ветка: создаст master-X.Y.Z
- релиз /X.Y: создаст X.Y.Z
В любом случае спасибо большое, это мне очень помогло.
Ответ 6
Я использую, как показано ниже. Он отлично работает с веткими. Ниже фрагменты, вдохновленные из комментариев и 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
Ответ 7
хорошее решение Могу ли я использовать аннотированные теги для представления релиза? лайк:
git tag -a "$NEW_TAG" -m "autogenerated"
Ответ 8
основан на ответе timhc22, но немного изменен для обработки начальных тегов и ошибок вывода тишины в случае отсутствия тега при фиксации
#!/bin/bash
#get highest tag number
VERSION='git describe --abbrev=0 --tags 2>/dev/null'
if [ -z $VERSION ];then
NEW_TAG="1.0.0"
echo "No tag present."
echo "Creating tag: $NEW_TAG"
git tag $NEW_TAG
git push --tags
echo "Tag created and pushed: $NEW_TAG"
exit 0;
fi
#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}"
#get current hash and see if it already has a tag
GIT_COMMIT='git rev-parse HEAD'
CURRENT_COMMIT_TAG='git describe --contains $GIT_COMMIT 2>/dev/null'
#only tag if no tag already (would be better if the git describe command above could have a silent option)
if [ -z "$CURRENT_COMMIT_TAG" ]; then
echo "Updating $VERSION to $NEW_TAG"
git tag $NEW_TAG
git push --tags
echo "Tag created and pushed: $NEW_TAG"
else
echo "This commit is already tagged as: $CURRENT_COMMIT_TAG"
fi