2015-09-17 46 views
0

如果剛剛創建了標記(https://github.com/tschulte/gradle-semantic-release-plugin/issues/3),那麼上傳現有標記的發行註記時會出現問題。我的代碼首先創建一個帶註釋的標籤並推送它。緊接着,它使用GitHub API來設置剛創建的版本的主體。這確實經常失敗 - 對於提交較少的新存儲庫的情況較少,更經常的情況是,如果存儲庫包含更多提交。使用GitHub API將發佈註釋文本上傳到GitHub有時會失敗

我用下面的bash腳本重現此問題

#!/bin/bash 

set -e 

user=tschulte 
repo=github-releasetest 

version="$1" 
tag="v$version" 

git tag $tag -m "Release of $version" 
git push origin "$tag" 

curl -i -X POST -H "Accept: application/vnd.github.v3+json" -H "Authorization: token $GH_TOKEN" \ 
    "https://api.github.com/repos/$user/$repo/releases" \ 
    -d "{\"tag_name\": \"$tag\", \"body\": \"# Changelog of $version\"}" 

我跑的腳本在一個循環

export GH_TOKEN=... 
for v in {61..100}; do ./issue3 $v; done 

其結果是,不是所有的版本中的問題上傳。不能被上傳過繼GitHub的API返回(HTTP狀態代碼422)中的那些:

{ 
    "message":"Validation Failed", 
    "errors":[ 
     { 
      "resource":"Release", 
      "code":"custom", 
      "message":"Published releases must have a valid tag" 
     } 
    ], 
    "documentation_url":"https://developer.github.com/v3/repos/releases/#create-a-release" 
} 

我知道我可以通過不使用git taggit push,而是使用GitHub的API也解決我的代碼創建標籤,而不僅僅是設置發佈註釋文本。但是發佈註釋的上傳是現有行爲的附加,我不想改變。

還有什麼我可以做的嗎?或者這是API中的錯誤?

回答

1

的API來創建一個版本不支持多個用例:

  • 創建一個標籤,併發布(使用當前主或給定committish),並設置它的正文
  • 使用創建發佈現有的標籤

但是,切換使用的版本只是標籤是否已經存在。如果標籤剛剛創建,那麼API可能還沒有意識到這一點。可以肯定的是,在推送標籤之後和創建發行版之前,檢查標籤是否存在。下面的腳本不工作

#!/bin/bash 

set -e 

user=tschulte 
repo=github-releasetest 

version="$1" 
tag="v$version" 

git tag $tag -m "Release of $version" 
git push origin "$tag" 

echo "checking existence of tag $tag using API" 
while [ "$(curl -s -w "%{http_code}" -H "Authorization: token $GH_TOKEN" "https://api.github.com/repos/$user/$repo/git/refs/tags/$tag" -o /dev/null)" -ne "200" ] 
do 
    echo "API does not know tag -- retrying" 
done 
echo "API knows tag" 

if [ "$(curl -s -w "%{http_code}" -X POST -H "Accept: application/vnd.github.v3+json" -H "Authorization: token $GH_TOKEN" \ 
    "https://api.github.com/repos/$user/$repo/releases" \ 
    -d "{\"tag_name\": \"$tag\", \"body\": \"# Changelog of $version\"}" -o /dev/null)" == "201" ] 
then 
    echo "Release uploaded successfully" 
else 
    echo "Release could not be uploaded" 
    exit 1 
fi 

有趣的是,有時似乎API它知道的標記之前還需要一段時間:

Counting objects: 1, done. 
Writing objects: 100% (1/1), 171 bytes | 0 bytes/s, done. 
Total 1 (delta 0), reused 0 (delta 0) 
To [email protected]:tschulte/github-releasetest.git 
* [new tag]   v238 -> v238 
checking existence of tag v238 using API 
API does not know tag -- retrying 
API does not know tag -- retrying 
API does not know tag -- retrying 
API does not know tag -- retrying 
API does not know tag -- retrying 
API knows tag 
Release uploaded successfully