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
ファイルがあるとします。
「 ポーリングは停止する: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
を参照)HEAD
とgit notes
'build'(git show refs/notes/build
)によって参照されるコミットとの間のコミットのリストを取得します:git diff --name-only SHA_build HEAD
。git notes
'build
'をHEAD
に作成/移動します。アイテムにトリガー設定を設定すると、
curl --user USER:PWD http://JENKINS_SERVER/job/JOB_NAME/build?token=YOUR_TOKEN
を使用できます
特に、共通のディレクトリの下に多くのリポジトリがある場合は、少しのシェルスクリプトを使用して手動のURL設定を回避できることを追加したかったのです。
たとえば、これらのパラメーター展開を使用してレポ名を取得しましたrepository=${PWD%/hooks}; repository=${repository##*/}
そして次のように使用します:
curl $JENKINS_URL/git/notifyCommit?url=$GIT_URL/$repository
これが役立つことを願っています: 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はファイルで定義されたコミット後コマンドをトリガーします。
前の答えは、完全なフックがどのように見えるかの例を示したように、私の実際の受信後フックのコードです:
#!/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"])
この場合、他のブランチではなくマスターにプッシュするときにのみジェンキンスジョブをトリガーします。
上記の回答に加えて、ジェンキンス認証が有効になっている場合は少し難しくなることを付け加えたいと思います。
有効にした後、匿名ユーザーには読み取り権限が必要であるというエラーメッセージが表示されました。
私は2つの可能な解決策を見ました:
1:フックを次のように変更します:
curl --user name:passwd -s http://domain?token=whatevertokenuhave
2:プロジェクトベースの認証を設定します。
前者のソリューションには、フックファイルでパスワードを公開する必要があるという欠点があります。私の場合は受け入れられません。
2番目は私にとってはうまくいきます。グローバル認証設定で、[全体]> [匿名ユーザーの読み取り]を有効にする必要がありました。トリガーしたいプロジェクトで、Job> BuildおよびJob> Read for Anonymousを有効にする必要がありました。
ログインせずにJenkinsでプロジェクトを表示できるようになったため、これはまだ完璧なソリューションではありません。 HTTPログインで前者のアプローチを使用するより良いソリューションがあるかもしれませんが、私はそれを理解していません。