Git post commitフックを構成する方法


126

ジェンキンスからリモートでビルドをトリガーするにはどうすればよいですか?
Gitポストコミットフックを構成する方法

私の要件は、特定のプロジェクトのGitリポジトリが変更されるたびに、そのプロジェクトのJenkinsビルドが自動的に開始されることです。

Jenkinsトリガービルドセクションで、トリガービルドをリモートで選択しました。
では.git、ディレクトリ、ディレクトリをフックし、我々はのconfigureポストにファイルをコミットしていることにあります。
そこからビルドをトリガーする方法を混乱させています(curlコマンドを使用する必要がある部分は知っています)。


curl cmbuild.aln.com/jenkins/view/project name/job/myproject/buildwithparameters?Branch=feat-con

このコマンドをgitサーバーのフックディレクトリに配置しました(コミット後フック)。
リポジトリで変更が発生するたびに、自動ビルドが実行されます。

変更セットをチェックインして、少なくとも1つのJavaファイルが存在するかどうかを確認し、ビルドを開始する必要があります。
開発者がxmlファイルまたはビルドを開始しないプロパティファイルのみを変更したとします。
とともにxml.javaファイルがそこにあり、ビルドを開始する必要があるとします。


私はあなたの質問の2番目の部分に対処するために私の回答を編集しました。
VonC、2012年

回答:


164

ポーリングは死ぬ必要があります:GitフックからのJenkinsビルドのトリガー」で述べたように、Jenkinsに新しいコミットを通知できます。

(今リリースしたばかりの)最新のGitプラグイン1.1.14を使用すると、次のコマンドを実行するだけで、より簡単にこれを実行できます。

curl http://yourserver/jenkins/git/notifyCommit?url=<URL of the Git repository>

これにより、指定されたURLをチェックアウトするように構成されているすべてのジョブがスキャンされます。また、それらがポーリングで構成されている場合は、すぐにポーリングがトリガーされます(ビルドに相当する変更が見つかった場合は、ビルドが順番にトリガーされます。 )

これにより、Jenkinsでジョブが出入りするときにスクリプトを同じままにすることができます。
または、単一のリポジトリー・ホスト・アプリケーション(Gitosisなど)の下に複数のリポジトリーがある場合、単一のポスト受信フック・スクリプトをすべてのリポジトリーと共有できます。最後に、サーバーはクライアントが送信するものを直接使用しないため、このURLは安全なJenkinsであっても認証を必要としません。実際にビルドを開始する前に、ポーリングを実行して変更があることを確認します。

ここで述べた、あなたのジェンキンスサーバのための右のアドレスを使用してください:

JenkinsをスタンドアロンのWebサーバーとしてポート8080で実行しているので/jenkins、次のようにURLにはがないはずです。

http://jenkins:8080/git/notifyCommit?url=git@gitserver:tools/common.git

最後のポイントを強調するためpthaコメントに追加します

それは明白かもしれませんが、私は次の問題を抱えていました:

curl http://yourserver/jenkins/git/notifyCommit?url=<URL of the Git repository>. 

URLのパラメータは、あなたが持っているものを正確に一致する必要がありますリポジトリのURLあなたのジェンキンスジョブの。
例をコピーするときに、私たちの場合ssh://、プロトコルを省略しましたが、機能しませんでした。


JenkinsとGITを使用したプッシュベースのビルド」のような単純なポスト受信フックを使用することもできます。

#!/bin/bash
/usr/bin/curl --user USERNAME:PASS -s \

http://jenkinsci/job/PROJECTNAME/build?token=1qaz2wsx

「トリガービルドをリモートで」実行できるようにJenkinsジョブを構成し、認証トークンを使用します(1qaz2wsxこの例では)。

ただし、これはプロジェクト固有のスクリプトであり、著者はそれを一般化する方法について言及しています。
最初の解決策は、認証や特定のプロジェクトに依存しないため、より簡単です。


変更セットをチェックインして、ビルドを開始するために少なくとも1つのJavaファイルが存在するかどうかを確認します。
開発者がXMLファイルまたはプロパティファイルのみを変更したとすると、ビルドは開始されません。

基本的に、ビルドスクリプトは次のことができます。

  • 「ビルド」ノートを置く( git notes最初の呼び出しに)を
  • 後続の呼び出しで、HEADビルドのブランチ候補とgit notes'build'(git show refs/notes/build)によって参照されるコミットの間のコミットのリストを取得します。git diff --name-only SHA_build HEAD
  • スクリプトはそのリストを解析して、ビルドを続行する必要があるかどうかを判断できます。
  • いずれの場合も、git notesbuild」をに作成/移動しますHEAD

2016年5月:cwhsu はコメントで次の可能なURLを指摘しています

あなたはcurl --user USER:PWD http://JENKINS_SERVER/job/JOB_NAME/build?token=YOUR_TOKENあなたのアイテムにトリガー設定を設定した場合に使用できます

http://i.imgur.com/IolrOOj.png


2016年6月、ポラレットはコメントで指摘しています

シェルスクリプトを少し追加するだけで、手動でのURL設定を回避できることを追加したいと思います。特に、共通のディレクトリの下に多数のリポジトリがある場合はそうです。
たとえば、これらのパラメーター展開を使用してレポ名を取得しました

repository=${PWD%/hooks}; 
repository=${repository##*/} 

そしてそれを次のように使用します:

curl $JENKINS_URL/git/notifyCommit?url=$GIT_URL/$repository

こんにちはvonは最初の呼び出しで言ったように、ビルドnotes.myの最初の呼び出しは、開発者がgit repoに変更をプッシュするたびに.javaファイルを読み取ることです。私はこれらすべての事柄に慣れていないので、すべてのステップを求めています。気にしないで、私はこのタスクを完了する必要があります。
phanikumar Raja

これは私にとってとても役に立ちます。このトピックの助けを借りて、Gitフックを作成しました。Tnx guys!
Kirill Bazarov

curl呼び出しを受信後ファイルに追加する必要がありましたが、これはこの回答からは完全に明確ではありません。とにかくとても役に立ちました!
Magnilex 2013年

1
コミットを受け取り、jenkinsを呼び出す必要のあるベアリポジトリのフックフォルダーにある@IgorGanapolsky:yourRepo.git/hooks/post-receive
VonC

2
当たり前かもしれませんが、次の問題がありましたcurl http://yourserver/jenkins/git/notifyCommit?url=<URL of the Git repository>URLのパラメータは、あなたが持っているものを正確に一致する必要がありますリポジトリのURLあなたのジェンキンスジョブの。例をコピーするとき、私はプロトコルを省略しました。私たちの場合、ssh://ですが、機能しませんでした。
ptha 2015

17

これが役に立てば幸いhttp : //nrecursions.blogspot.in/2014/02/how-to-trigger-jenkins-build-on-git.html

curlgitが提供するgitフックを使用してJenkinsジョブをトリガーするのは、を使用するだけです。
コマンド

curl http://localhost:8080/job/someJob/build?delay=0sec

Jenkinsジョブを実行できます。 someJobの名前です。

hooks非表示の.gitフォルダーでフォルダーを検索します。post-commit.sampleファイルの名前をに変更しますpost-commit。メモ帳で開き、削除します: Nothing行を、上記のコマンドを貼り付けます。

それでおしまい。コミットを行うと、Gitはファイルに定義されているコミット後のコマンドをトリガーします。


開発マシンからコミットした後、ポストコミットではなくポスト受信が呼び出されます。両方のフックにログステートメントを置くことで検証されます。私はドキュメントを間違って読んでいますか?それは呼び出されるポストコミットではないのですか?
Shirish Hirekodi、2015

@Shirish:それは奇妙です。多分あなたは何か別のことをしているでしょう
Nav

これは、最後の変更のコミットをプッシュしたときに正常にビルドされますが、変更をコミットしたときにビルドされません... ???

3

前の回答が示したように、完全なフックが次のようになる例は、私の動作する受信後フックのコードです。

#!/usr/bin/python

import sys
from subprocess import call

if __name__ == '__main__':
    for line in sys.stdin.xreadlines():
        old, new, ref = line.strip().split(' ')
        if ref == 'refs/heads/master':
            print "=============================================="
            print "Pushing to master. Triggering jenkins.        "
            print "=============================================="
            sys.stdout.flush()
            call(["curl", "-sS", "http://jenkinsserver/git/notifyCommit?url=ssh://user@gitserver/var/git/repo.git"])

この場合、他のブランチではなくマスターにプッシュするときにのみ、Jenkinsジョブをトリガーします。


1
このPythonスクリプトをJenkinsにどのように結び付けますか?それとも一度だけ実行しますか?
IgorGanapolsky 2014年

Jenkinsはこのフックを認識していません。主要な部分は、jenkinsサーバーにnotifyCommitのURLをロードして、ポーリングをトリガーします。ポーリングは有効になっていると思いますが、ジェンキンス側のスケジュールはありません。
Zitrax 2014年

では、このpythonスクリプトはどこにあるのでしょうか。私はあなたがそれをあなたのgitインストールと
結び付けて

1
遅い答え-しかし、スクリプトの場所はgitサーバーのhooks / post-receiveになります。詳細については、gitフックを参照してください。
Zitrax 2014年

3

上記の回答に加えて、Jenkins認証が有効になっている場合は少し難しくなることを付け加えておきます。

有効にした後、匿名ユーザーに読み取り権限が必要であるというエラーメッセージが表示されました。

私は2つの可能な解決策を見ました:

1:フックを次のように変更します。

curl --user name:passwd -s http://domain?token=whatevertokenuhave

2:プロジェクトベースの承認を設定します。

前者のソリューションには、フックファイルで自分のパスワードを公開しなければならないという欠点があります。私の場合は受け入れられません。

2番目は私のために働きます。グローバル認証設定で、匿名ユーザーに対して全体>読み取りを有効にする必要がありました。トリガーしたかったプロジェクトで、Job> BuildとJob> Read for Anonymousを有効にする必要がありました。

ログインせずにプロジェクトをJenkinsで表示できるようになったため、これはまだ完全なソリューションではありません。以前の方法でhttpログインを使用するより良い解決策があるかもしれませんが、私はそれを理解していません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.