1. ホーム
  2. git

[解決済み] Gitのポストコミット・フックの設定方法

2022-07-01 05:20:35

質問

Jenkinsからリモートでビルドを起動する方法は?

Gitのポストコミットフックを設定する方法は?

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

Jenkins trigger build セクションで、trigger build remotely を選択しました。

.git ディレクトリにある hooks ディレクトリで、ポストコミットファイルを設定する必要があります。

私はそこからビルドをトリガする方法を混乱させています(私たちはcurlコマンドを使用すべき部分があることを知っています)。


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

このコマンドは、git server hooks ディレクトリに置いています(post commit hook)。

リポジトリに変更があるたびに、automate buildが実行されます。

少なくとも1つのjavaファイルがあるかどうかを変更セットでチェックしたいのですが、ビルドが開始されるはずです。

もし開発者が xml ファイルやプロパティファイルだけを変更したとしたら、ビルドは開始されないはずです。

と共に xml は、仮に .java ファイルがあればビルドが開始されるはずです。

どのように解決するのですか?

で述べたように、" ポーリングは死ななければならない: 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のスタンドアロンウェブサーバーとして実行しているので、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 を使用します)。

しかし、これはプロジェクト固有のスクリプトであり、著者はこれを一般化する方法について言及しています。

最初の解決策は、認証や特定のプロジェクトに依存しないので、より簡単です。


ビルドを開始するために、少なくとも1つのjavaファイルがあるかどうかを変更セットでチェックしたいです。

例えば、開発者がXMLファイルやプロパティファイルだけを変更したとすると、ビルドは開始されないはずです。

基本的にはビルドスクリプトで可能です。

  • build' ノートを置く ( git notes を参照) を最初の呼び出しに追加します。
  • の間のコミット一覧を取得します。 HEAD で参照されるコミットと、ビルド候補のブランチの git notes 'build' ( git show refs/notes/build ): git diff --name-only SHA_build HEAD .
  • のスクリプトはそのリストを解析し、ビルドを続行する必要があるかどうかを決定することができます。
  • いずれにせよ git notes ' build ' から HEAD .

2016年5月 cwhsu ポイント コメントで を指摘し、次のような可能性のあるURLを指定します。

<ブロッククオート

を使用することができます。 curl --user USER:PWD http://JENKINS_SERVER/job/JOB_NAME/build?token=YOUR_TOKEN で済むのですが、トリガーを設定すると


2016年6月 ポラレット 指摘 コメントで :

シェルスクリプトを少し使うだけで、特に共通のディレクトリの下に多くのリポジトリがある場合、手動での URL 設定を回避できることを付け加えたいと思います。

たとえば、私は以下のパラメータ拡張を使用して、リポジトリ名を取得しました。

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

といった感じで使います。

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