2010-09-21 29 views
18

Làm cách nào để gắn thẻ các phiên bản phát hành của bạn trong git?git: Tự động gắn thẻ các bản phát hành

Bây giờ tôi có mỗi bản phát hành được xác định theo số bản dựng, nhưng chúng tăng ngay cả khi không có thay đổi trong repo. Ý tưởng của tôi là để nó được tạo tự động khi triển khai thành công trên máy chủ dàn dựng. Ví dụ.

  • chạy Hudson xây dựng
  • khi thành công, thêm thẻ mới, tức là 1.0-1
  • trên tiếp theo thành công xây dựng thêm thẻ tiếp theo, 1.0-2
  • phiên bản thẻ sẽ được hiển thị sau đó vào trang web của chân

này sẽ yêu cầu:

  • Hudson để quản lý số phiên bản tiếp theo
  • hoặc kịch bản để lưu trữ thẻ cuối cùng trong một số tập tin
  • hoặc phân tích thẻ git để xác định cuối cùng

Bất cứ lời khuyên?

Trả lời

1

Hudson tự động gắn thẻ bản dựng, nếu bạn sử dụng plugin git và để Hudson trích xuất mã. Tôi không chắc chắn nếu điều này được đẩy tự động; trong thiết lập của chúng tôi, chúng tôi thêm gắn thẻ và bao gồm 'git push --tags' trong tập lệnh xây dựng của chúng tôi, vì vậy chúng tôi chắc chắn thấy các thẻ Hudson trong kho lưu trữ trung tâm của chúng tôi.

16

Tôi đã viết điều này để giúp cập nhật thẻ tăng dần, ví dụ: 1.0.1 đến 1.0.2 vv

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

Điều này có được kích hoạt bởi móc git (nếu có, cái nào?), hay bạn chạy thủ công này thay vì 'git push'? – Gady

+1

Nó chỉ nằm trong tệp .sh mà tôi chạy thủ công (nhưng tệp .sh cũng được chạy tự động như là một phần của bản dựng Jenkins trong đó dự án luôn cần bản cập nhật cho số phiên bản). Nó có thể có thể được thêm vào một cái móc bằng cách nào đó (tôi không thực sự biết nhiều về git móc phải trung thực vì vậy không thể giúp tôi có!) – timhc22

+1

Thêm '2>/dev/null' vào cuối' git description --contains $ GIT_COMMIT' để xóa cảnh báo "gây tử vong". Cảm ơn kịch bản – koxon

2

giải pháp thực sự tốt timhc22 Điều duy nhất là nó mất thẻ cuối cùng (bất kể các chi nhánh) Nếu bạn làm việc trên một dự án với nhiều chi nhánh bạn có thể có một vấn đề . Tôi đề xuất chỉ là một cải tiến với cơ sở của bạn.

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

này hoạt động ví dụ nếu bạn có:

  • một chi nhánh tổng thể: sẽ tạo thạc sĩ-XYZ
  • một thông cáo/XY: sẽ tạo ra XYZ

Trong mọi trường hợp cảm ơn rất nhiều nó đã giúp tôi rất nhiều.

1

Tôi đang sử dụng như dưới đây. Nó hoạt động hoàn hảo với các nhánh cây. Đoạn mã dưới đây lấy cảm hứng từ các nhận xét ở trên và 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 
Các vấn đề liên quan