9

多くの類似のポストがあることを知っていますが、解決策が見つからず、他のポストに表示されているアドバイスと解決策は、 。ポスト・コミット・ポスト自動Jenkinsビルドをトリガーする

私はEclipseプロジェクトを持っています。そのプロジェクトからSubversionサーバー(VisualSVN Server 2.5.3)にチェックインすると、Jenkinsの継続的統合サーバーが必要になりますつまり、Jenkins 1.546)がこの変更を受け取り、新しいビルドを開始します。私はジェンキンスから投票したくない。

私はほとんどがthis articleの手順に従っています。

repos = WScript.Arguments.Item(0) 
rev  = WScript.Arguments.Item(1) 
svnlook = WScript.Arguments.Item(2) 
jenkins = WScript.Arguments.Item(3) 

Set objFSO = CreateObject("Scripting.FileSystemObject") 
Set objFile = objFSO.CreateTextFile("C:\Program Files (x86)\VisualSVN Server\log.txt") 

objFile.Writeline "repos=" & repos 
objFile.Writeline "rev=" & rev 
objFile.Writeline "svnlook=" & svnlook 
objFile.Writeline "jenkins=" & jenkins 

Set shell = WScript.CreateObject("WScript.Shell") 

Set uuidExec = shell.Exec(svnlook & " uuid " & repos) 
Do Until uuidExec.StdOut.AtEndOfStream 
    uuid = uuidExec.StdOut.ReadLine() 
Loop 

objFile.Writeline "uuid=" & uuid 

Set changedExec = shell.Exec(svnlook & " changed --revision " & rev & " " & repos) 
Do Until changedExec.StdOut.AtEndOfStream 
    changed = changed + changedExec.StdOut.ReadLine() + Chr(10) 
Loop 
objFile.Writeline "changed=" & changed 

url = jenkins + "crumbIssuer/api/xml?xpath=concat(//crumbRequestField,"":"",//crumb)" 
Set http = CreateObject("Microsoft.XMLHTTP") 
http.open "GET", url, False 
http.setRequestHeader "Content-Type", "text/plain;charset=UTF-8" 
http.send 
crumb = null 

objFile.Writeline "rev url=" & url 
objFile.Writeline "http.status=" & http.status 
objFile.Writeline "http.responseText=" & http.responseText 

if http.status = 200 then 
    crumb = split(http.responseText,":") 
end if 

url = jenkins + "subversion/" + uuid + "/notifyCommit?rev=" + rev + "&token=pinkfloyd65" 
objFile.Writeline "url=" & url 

if not isnull(crumb) then 
    objFile.Writeline "crumb(0)=" & crumb(0) 
    objFile.Writeline "crumb(1)=" & crumb(1) 
end if 

if isnull(crumb) then 
    objFile.Writeline "crumb=null" 
end if 

Set http = CreateObject("Microsoft.XMLHTTP") 
http.open "POST", url, False 
http.setRequestHeader "Content-Type", "text/plain;charset=UTF-8" 
if not isnull(crumb) then 
    http.setRequestHeader crumb(0),crumb(1) 
    http.send changed 
    if http.status <> 200 then 
    objFile.Writeline "Error. HTTP Status: " & http.status & ". Body: " & http.responseText 
    end if 

    if http.status = 200 then 
    objFile.Writeline "HTTP Status: " & http.status & ".\n Body: " & http.responseText 
    end if 
end if 

問題がPOSTコマンドは、上記のバック200応答を取得してしまいますが、ジョブはキックオフことはありません、ということです。ここに私のポストコミットフックスクリプトです。何も起こりません。さて、ジェンキンスの仕事の構成を見てみましょう。多分私は設定や何かを見逃しています。ビルドトリガーセクションの下では、「トリガービルド(スクリプトなどからのリモート)」のオプションを確認しました。認証トークンも提供しています。私が何をしてきた。しかし、そのセクションの下方向が異なって見える:

使用、次のURLをリモートで構築トリガする:JENKINS_URL/job/<job-name>/build?token=TOKEN_NAME/buildWithParameters?token=TOKEN_NAME 必要に応じて記録されたビルドに含まれるテキストを提供するために、&cause=Cause+Textを追加します原因。

私は見ている指示のセットの間にデルタがあるようだし、そのギャップを埋める方法がわからない。 Jenkinsのジョブ設定ページの指示に従うのはかなり明らかです。ただし、UUIDではなくジョブ名を取得する方法がわかりません。

もう1つ注目すべきは、私のリポジトリ設定です。 CIサーバは多くのグループや部門で使用されているので、私はすべてスマートで、私の部署のプロジェクトだけを収容するトップレベルのリポジトリを作成すると思いました。リポジトリの構造は、ここに私の問題のために追加されますが、私はすべての変更がどこから来たどの特定のリポジトリを見つけることができるはずのように私は感じた場合、私は思ったんだけど

VisualSVN Server 
    -- Repositories 
    -- Project_A 
    -- Project_B 
    -- <my-department> 
     -- DepartmentProject_A 
     -- DepartmentProject_B 

:だから、私のような設定に何かを持っています。それが本当であれば、スクリプトを調整してUUIDではなくジョブ名を使用してから、CIサーバーの設定ページに表示される明示的な指示に従うことができます。入力したrepos変数を自分のvbsスクリプトに記録すると、プロジェクトの子リポジトリではなくトップレベルの部門リポジトリ(D:\<visual-svn-repos>\<my-department>\DepartmentProject_BではなくD:\<visual-svn-repos>\<my-department>)を指しています。

ご協力いただければ幸いです。ありがとうございます。

答えて

9

リンクされた記事は、ジェンキンスさんの

ジョブを言い、この動作から 利益のためにSCMポーリングオプションで設定する必要があります。これは、 が、リリース関連タスクなどのコミット後フック( $ REPOSITORY/hooksディレクトリ内)によって決して起動されず、 によってSCMポーリングオプションが省略されていることがあります。設定されたポーリングは、 のスケジュールを持つことができます(おそらく毎月または毎年のように頻度は低い)。ネット効果 は、通常のサイクルからポーリングが発生したようです。このため

仕事に、あなたのジェンキンスは、匿名を許可するように持っているシステムに(具体的には、アクセスを「仕事>読む」)アクセス をお読みください。 Jenkinsへのアクセス制御 がより制限的な場合は、 の認証方法に応じて、 のユーザー名とパスワードを指定する必要があります。

サーバーがこの制限を満たしていますか?

+0

最初のものは次のとおりです。i confにも必要ですscmをポーリングしてスケジュールを提供しないようにジョブをigureしてください。私はどのように私はその宣伝を見逃したかわからない、私は思ったよりも徹底的だったと思う。とにかく、ありがとう、scaytrase! – liltitus27

1

私はsvnプラグインの例を動作させようとしましたが、運はありませんでした。代わりに、ビルドトークンルートプラグインを使用しました。これはポーリングすることなく動作します。

https://wiki.jenkins-ci.org/display/JENKINS/Build+Token+Root+Plugin

ビルドトリガ>トリガーは、リモートでオプションを構築>ポストcommitフックにこれを追加しVisualSVNサーバーでそれにトークン

を与える:ポストコミットフック用

SET CSCRIPT=%windir%\system32\cscript.exe 
SET VBSCRIPT=C:\Repositories\post-commit-hook-jenkins.vbs 
"%CSCRIPT%" "%VBSCRIPT%" "MyJobName" "MyTokenFromBuildTrigger" 

を-jenkins.vbs:

Set args = WScript.Arguments 
JobName = args.Item(0) 
Token = args.Item(1) 

'URL to open.... 
sUrl = "http://MyJenkinsServer.MyCompany.com/buildByToken/build?job=" + JobName + "&token=" + Token 
'POST Request to send. 
sRequest = "" 

HTTPPost sUrl, sRequest 

Function HTTPPost(sUrl, sRequest) 
    set oHTTP = CreateObject("Microsoft.XMLHTTP") 
    oHTTP.open "POST", sUrl,false 
    oHTTP.setRequestHeader "Content-Type", "application/x-www-form-urlencoded" 
    oHTTP.setRequestHeader "Content-Length", Len(sRequest) 
    oHTTP.send sRequest 
    HTTPPost = oHTTP.responseText 
End Function