web-dev-qa-db-ja.com

自動Jenkinsビルドをトリガーするコミット後のフック

同様の投稿がたくさんあることは知っていますが、解決策が見つかりませんでした。他の投稿で提示されたアドバイスや解決策は、私が見ているものとはまったく相容れません。

シナリオは非常に単純です。Eclipseにプロジェクトがあり、そのプロジェクトからSubversionサーバー(つまり、VisualSVNサーバー2.5.3)に変更をチェックインするときに、Jenkins継続的インテグレーションサーバー(つまり、Jenkins 1.546)が必要です。 )この変更を取得し、新しいビルドを開始します。 Jenkinsから投票したくありません。

私は主に この記事 の手順に従っています。これが私のコミット後のフックスクリプトです:

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応答が返され、ジョブが開始されることはありません。何も起こらない。では、Jenkinsのジョブ構成を確認しましょう。多分私は設定か何かが欠けています。さて、[ビルドトリガー]セクションで、[リモートでビルドをトリガーする(スクリプトなどから)]オプションをオンにし、認証トークンも提供しました。しかし、そのセクションの下の方向は、私がやってきたこととは異なって見えます:

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

ですから、私が見ている一連の命令の間にはデルタがあるようで、そのギャップを埋める方法がわかりません。 UUIDではなくジョブ名を取得する方法がわからないことを除いて、Jenkinsジョブ構成ページの指示に従うことは非常に明白なようです。

注意すべきもう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> のではなく D:\<visual-svn-repos>\<my-department>\DepartmentProject_B)。

助けていただければ幸いです、みんなありがとう。

11
liltitus27

あなたがリンクした記事は言う

この動作を利用するには、JenkinsのジョブをSCMポーリングオプションで構成する必要があります。これは、SCMポーリングオプションを省略することで、リリース関連のタスクなど、コミット後のフック($ REPOSITORY/hooksディレクトリ内)によってトリガーされないジョブを作成できるようにするためです。構成されたポーリングには、任意のスケジュールを設定できます(おそらく、月次または年次のようにまれです)。正味の効果は、ポーリングが通常のサイクルから外れて発生するかのようです。

そして

これが機能するためには、Jenkinsがシステムへの匿名の読み取りアクセス(具体的には「ジョブ>読み取り」アクセス)を許可する必要があります。 Jenkinsへのアクセス制御がより制限されている場合は、認証の構成方法に応じて、ユーザー名とパスワードを指定する必要があります。

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

10
ScayTrase

Svnプラグインの例を機能させようとしましたが、うまくいきませんでした。代わりに、ビルドトークンルートプラグインを使用しました。これは、ポーリングしなくても機能します。

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

ビルドトリガー>リモートでビルドをトリガーするオプション>トークンを与える

VisualSVNサーバーで、これをコミット後フックに追加します。

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

Post-commit-hook-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 
1
Sean