web-dev-qa-db-ja.com

Gitのコミット後フックを構成する方法

Jenkinsからリモートでビルドをトリガーする方法
Gitのコミット後フックの設定方法は?

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

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


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

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

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

117
phanikumar Raja

ポーリングは停止する: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サーバーに正しいアドレスを使用するようにしてください:

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

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)を使用します。

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


ビルドを開始する必要があるJavaファイルが少なくとも1つあるかどうか、変更セットを確認します。
開発者がXMLファイルまたはプロパティファイルのみを変更した場合、ビルドは開始されません。

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

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

2016年5月: cwhs 指摘 コメント内 次の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
150
VonC

これが役立つことを願っています: http://nrecursions.blogspot.in/2014/02/how-to-trigger-jenkins-build-on-git.html

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

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

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

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

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

16
Nav

前の答えは、完全なフックがどのように見えるかの例を示したように、私の実際の受信後フックのコードです:

#!/usr/bin/python

import sys
from subprocess import call

if __== '__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"])

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

3
Zitrax

上記の回答に加えて、ジェンキンス認証が有効になっている場合は少し難しくなることを付け加えたいと思います。

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

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

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

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

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

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

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

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

3
anhoppe