マスターへのプッシュでGitトリガーを使用してJenkins CIを作成するにはどうすればよいですか?


205

GitHubを使用してプロジェクトのJenkins-ciを設定しようとしています。私はすでに適切なプラグインでJenkinsを設定しました。Jenkinsがプロジェクトの誰かがマスターするようにプッシュしたときにのみビルドスクリプトを実行してほしい。これまでのところ、誰かがどこにでもプッシュしたときにビルドがトリガーされるように設定することができましたが、それは広すぎます。これは、Gitの受信後サービスフックで行いました。

Jenkins wikiといくつかのチュートリアルを読みましたが、この特定の詳細が欠けています...ポーリングと関係があるのでしょうか?または、Git側で作業を行って、master変更されたときにGitがJenkinsのみをトリガーするようにする必要がありますか?


3
Jenkinsの原作者である河口浩介氏は、GitプラグインGitプラグイン1.1.14を使用してリポジトリからプッシュ通知を行う方法について説明しています。kohsuke.org/2011/12/01/を
GeraldScott

回答:


190

彼のコメントでgezzedですでに述べたように、その間に良い解決策があります(ポーリングで死ぬ必要があります:GitフックからJenkinsビルドをトリガーする):

  • JenkinsジョブのビルドトリガーをPoll SCMに設定しますが、スケジュール指定しないでください。

  • GitHub受信後トリガーを作成してURLに通知する

    http://yourserver/jenkins/git/notifyCommit?url=<URL of the Git repository>?token=<get token from git to build remotely>
    
  • これにより、指定したGitリポジトリをポーリングするすべてのビルドがトリガーされます。

  • ただし、ポーリングでは実際に、usedブランチに何かがプッシュされているかどうかを確認します。

それは完全に動作します。


1
これは私にとってもうまくいきました。ローカルの便利なインストールで同じアプローチを使用できます:cweiske.de/tagebuch/gitorious-post-receive-hook-2.htm
Justin Smith

4
BitbucketのPOSTフック(Jenkinsではない)でも動作します。認証資格情報を指定するには、URLとしてuser:password@my.ci.server/git/notifyCommit?url = ...を使用できます。
loevborg 2014年

jenkinsがリポジトリへの最新のプッシュによって影響を受けるlibs / projectsのみをビルドするように構成できますか?ブランチ全体を再び構築しないのですか?
Croolman 2017年

この部分を明確にできますか?「github post-receiveトリガーを作成してURLに通知する」
dewwwald

私はgithubがJenkinsインスタンスに到達できる必要があると思います。つまり、それは一般にアクセス可能でなければなりませんでした。非公開のJenkinsサーバーでこれを機能させることは可能ですか?
A.マレー

33

バージョン0.5以降、JenkinsのGitHubプラグインは、変更がGitHubにプッシュされたときにビルドトリガーできます


23
@asveikau-元の質問はgithubに関するものでした。
docwhat 14

プッシュされたブランチに関係なくビルドをトリガーするため、これは良いソリューションではありません。
シャノン

実際、「ポーリングSCM」を有効にすると(スケジュールは不要)、gitプラグイン設定のブランチ指定子に従っているように見えます。
シャノン

1
それは本当かもしれませんが、ワークスペースが存在しない場合でも、ビルドが正しくトリガーされません(「ワークスペースがオフラインです。新しいビルドをスケジュールしてワークスペースを取得します。(nonexisting_workspace)完了。0ミリ秒の変更が見つかりました」)。また、issues.jenkins-ci.org / browse / JENKINS
シャノン

GitHubには依存関係としてリストにGitのプラグインをプラグインWikiは Githubのプロジェクト「ジョブを作成するときに、下のURLを指定して『』とGitは下のURLを指定して選択し、 『ソースコード管理言います』。それは言う、 『このトリガーのみマッチしたレポに対するすべての着信イベントのためのアルゴ内部ポーリングプラグインGitリポジトリを蹴る。』 Iそれはかなり受け入れ答えのように投票SCMを行いますが、それは自動的にウェブフックを設定するためのオプションやカップルの他の機能を有することを意味すると思います。
dosentmatter

9

リモートでビルドをトリガーする代わりに、ポーリングによってビルドをトリガーするようにJenkinsプロジェクト構成を変更します。

Jenkinsは、固定内部またはURLに基​​づいてポーリングできます。後者は、そのブランチに変更がない場合にビルドをスキップしたいものです。正確な詳細はドキュメントあります。基本的には、「ポーリングSCM」オプションを確認し、スケジュールセクションを空白のままにして、JENKINS_URL / job / name / pollingにヒットするようにリモートURLを設定するだけです。

安全なJenkins環境を使用している場合の1つの落とし穴はとは異なり/build/pollingURLには認証が必要です。ここの説明は詳細があります。たとえば、GitHub Post-Receiveフックをに持っていますusername:apiToken@JENKIS_URL/job/name/polling


8

GitLab、これらの手順を使用します。

  1. プロジェクトの設定に移動→Webフック
  2. Jenkinsプロジェクトの「今すぐビルド」URLをプッシュイベントURLとして入力します。

    http://server.com/jenkins/job/project_name/build?delay=0sec 例えば

  3. クリックしAdd Web Hookてからtest hook

その後、リポジトリにコミットするたびに、Webフックがトリガーされ、ビルドが作成されます。delete workspace before each build新しいコードの新しいコピーを取得できるように、Jenkinsワークスペースを設定してください。


2
マスターブランチをプッシュするときにビルドすることに関する質問の問題をどのように解決していますか?
Custodio 2015

4

Gitとは関係ありませんが、以下では、Mercurialを使用したJenkinsジョブの設定について詳しく説明します。同様の問題を持つ他の人を助けるかもしれません。

  1. URLトリガープラグインをインストールする
  2. ジョブ設定ページに移動し、Poll SCMオプションを選択します。値を* * * * *
  3. オプションを確認してください:[URLTrigger] - Poll with a URL。これで、変更日の変更、URLコンテンツなどのオプションを選択できます。
  4. オプションで、URLコンテンツの変更を選択し、最初のオプションを選択します– Monitor change of content
  5. 変更を保存します。

ここで、いくつかのテストチェックインによってMercurialリポジトリへの変更をトリガーします。

JCMの変更を検出することにより、Jenkinsジョブが実行されることを確認してください。Mercurialの変更によりビルドが実行されると、テキストが表示されますStarted by an SCM change。それ以外の場合は、手動で開始したユーザー。


3

これが役立つことを願っています:Git commitでJenkinsビルドをトリガーする方法

カールを使用して、Gitが提供するGitフックを使用してJenkinsジョブをトリガーするだけです。

コマンドcurl http://localhost:8080/job/someJob/build?delay=0secはJenkinsジョブを実行できます。はJenkinsジョブsomeJobの名前です。

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

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


上記のURLの「ジョブ」をジョブ名に変更する必要があると思ったので、最初はコメントで混乱しました。また、Jenkinsで「New Item」を押したときに、ジョブではなく「Project」を設定したため、上記の「someJob」を参照したときに、それが自分のプロジェクトの名前であることがわかりませんでした。最終的に必要なURLを見つけました:localhost:8078 / job / codecept%20tests / build 「codecept%20tests」は私のプロジェクトの名前です。解決策をありがとう
Paul Preibisch 2017

1
ポールに感謝します。私はあなたの解決策に言及する追加のメモでブログの投稿を更新しました。「%20」は他のユーザーに特に役立ちます。
ナビゲーション

3

コードがGitコマンド/ GUIからリポジトリにプッシュされた後の、Jenkinsとの継続的な統合:

  1. Jenkinsでジョブ名のみを使用してジョブを作成し、プロジェクトのフリースタイルのタイプを選択します。をクリックしOKます。次のページでは何も追加されません-をクリックするだけSaveです。
  2. ソースコードがあるローカルGitリポジトリに移動し、.git/hooksフォルダーに移動します。
  3. hooksフォルダには、いくつかのファイルが含まれています。「コミット後」を確認します。存在しない場合は、ファイル拡張子なしの「post-commit」ファイルを作成します。

    C:\work\test\\.git\hooks\post-commit
    
  4. 以下のコマンドを使用して「post-commit」ファイルを編集します。ローカルのソースコードフックフォルダーにあることを確認してください。

    curl -u userName:apiToken -X POST http://localhost:8080/jenkins/job/jobName/build?token=apiToken
    

    例:

    curl -u admin:f1c55b3a07bb2b69b9dd549e96898384 -X POST http://localhost:8080/jenkins/job/Gitcommittest/build?token=f1c55b3a07bb2b69b9dd549e96898384
    

    5。

    userName:Jenkinsユーザー名

    jobName:ビルドのジョブ名

    apiToken:APIトークンを取得するには、Jenkinsユーザーページ(インターフェースの右上)に移動します。これは、ページの左側にある「構成」メニューから利用できます:「APIトークンを表示」

  5. ソースコードを変更し、コードをリポジトリにコミットします。

  6. あなたの仕事はhttp://localhost:8080/jenkins/job/Gitcommittest/、構築する必要があります。


3

ブランチを指定する必要があります。デフォルトでは、何でもリッスンします。ブログ投稿Hudson:GitおよびMavenプラグインを参照してください。


私は最近、指定されたブランチでgitから変更をプルするようにJenkinsを設定しました。正常に動作します。+1
グレッグK

私もその設定をしました。私が気づいているのは、Jenkinsがgithubへのすべてのプッシュについて通知され、それに反応しますが、ブランチマスターが変更された場合にのみビルドステップを実行することです。したがって、「変更なし」という大量の偽のビルドレポートが表示されます。この動作も観察していますか?
ジギー

元の質問は、回答で構成された広く不要なトリガー(誰かが任意のブランチをプッシュしたときにトリガーされる)を解決する方法に関するものです。同じ構成の5つのjenkinジョブがあり、最初のジョブがマスターブランチ、2番目が開発ブランチ、3番目がFeatureXブランチなどの場合、FeatureXブランチにのみプッシュすると、すべてのjenkinsジョブがトリガーされ、非常に遅いビルドで過負荷を処理します。
geoom 2015年

2

汎用Webhook Triggerプラグインは、これを実現するためにフィルターを使用して構成できます。

で構成されている場合

  • refandという名前の変数$.ref
  • $refようなテキストとフィルター式を含むフィルター^refs/heads/master$

その後、そのジョブはへのすべてのプッシュに対してトリガーされmasterます。ポーリングなし。

おそらく、実際にビルドを実行するために、Webhookからより多くの値が必要です。JSONPathを使用して変数を追加するだけで、必要なものを選択できます。

ここにいくつかのユースケースがあります。https://github.com/jenkinsci/generic-webhook-trigger-plugin/tree/master/src/test/resources/org/jenkinsci/plugins/gwt/bdd


「あち」とは?
Peter Mortensen、

スペルミスです。
Tomas Bjerre

Jenkinsで$ GITCOMMITをどのように取得しますか。Webhookでは常にnullのようです。その後、ステータスを送信して成功または失敗を返すことはできません。
user3520245

1

私の現在の組織では、これをマスターで行うのではなく、スナップショットビルドを生成するために、開発ブランチとリリース/ブランチ(Git Flowを使用)の両方で行います。

マルチブランチパイプラインを使用しているので、Jenkinsfileでwhen {}構文を使用してこれを行います...

stage {
    when { 
        expression { 
            branch 'develop'
        }
    }
}

これはこのブログ投稿で詳しく説明されていますhttps : //jenkins.io/blog/2017/01/19/converting-conditional-to-pipeline/#longer-pipeline


1

上記の答えは正しいですが、私はここで初心者であるそれらの単純さのためにそれらに対処しています

特にパイプラインのビルドトリガーを設定する場合:

1.master、2.dev、およびJenkinsfile(パイプラインスクリプトが記述されている)の2つのGithubブランチがあり、他のファイルが各ブランチで利用可能であると想定します。

新しいパイプラインプロジェクトを構成する(開発ブランチ用)

## 1。git-pluginおよびcronベースのアプローチとのコード統合 前提条件のgitプラグインをインストールし、名前と電子メールで構成する必要があります

  1. 一般セクション。チェックボックスをチェック-「このプロジェクトはパラメーター化されています」と名前-SBRANCHデフォルト値-「refs / remotes / origin / dev」を追加
  2. ビルドトリガーセクション」チェックボックス-「SCMのポーリング」およびコミットをチェックする必要性に応じてスケジュールします。たとえば、毎分チェックする「* / 1 * * * *」
  3. パイプライン定義セクション。選択-SCMからのパイプラインスクリプト-> gitを選択-> addRepository URL-> git認証情報を追加->詳細を選択->名前を追加-原点、RefSpec- '+ refs / heads / dev:refs / remotes / origin / dev '(devはgithubブランチ)—>ビルドするブランチ-$ {SBRANCH}(参照の最初のポイントからのパラメーター名)—>スクリプトパス—> Jenkinsfile —> Lightweightcheckoutのチェックを外します
  4. 適用->保存

## 2。コードの統合:github-pluginとwebhookのアプローチ 前提条件のGithubプラグインをインストールし、Githubサーバーを構成する必要があります。以下の構成を考慮しない場合は、接続をテストする必要があります

JenkinsのアカウントでGithubプラグインを構成する

GitHubセクション存在しない場合はGithubサーバーを追加しますAPI URL:https : //api.github.com資格情報:秘密のテキストを追加します([追加]ボタンをクリックして、タイプの秘密のテキストを選択します)値Personal Access Token(Githubアカウントから生成->設定) —>開発者設定—>個人用アクセストークン—>トークンの追加—>スコープの確認—>トークンのコピー)接続のテスト—> Githubアカウントに接続されているかどうかの確認フックの管理のチェックボックスをオンにします。 「共有シークレット」の以前の資格

リポジトリに追加されていない場合は、Webhookを追加します

  1. Githubリポジトリ設定に移動します—> webhookを追加—> URLを追加
    http:// Public_IP:Jenkins_PORT / github-webhook /
  2. または、Public_IPがない場合はngrokを使用します。インストール、認証、コマンド./ngrok http 80からのパブリックIPの取得(jenkins_portを使用)、次にwebhookを追加—> URL http:// Ngrok_IP / github-webhook /を追加
  3. Webhookページからペイロードを配信してテストし、ステータスが200になるかどうかを確認します。

Githubプルリクエストプラグインがある場合は、公開されているJenkins URLを使用してプラグインを設定します。

  1. 一般セクション。チェックボックスをチェック-'Githubプロジェクト'プロジェクトURLを追加-( '.git /'で終わるgithubリンク)
  2. 一般セクション。チェックボックスをチェック-「このプロジェクトはパラメーター化されています」と名前-SBRANCHデフォルト値-「refs / remotes / origin / dev」を追加
  3. triggers.section.Checkチェックボックスを構築する-「GITScmポーリング用のGitHubフックトリガー」
  4. Pipeline def'n section:Select-Pipeline script from SCM—> select git—> addRepository URL—> add git credentials—> choose advanced —> add Name- origin、RefSpec- '+ refs / heads / dev:refs / remotes / origin / dev '(devはgithubブランチです)—>ビルドするブランチ-$ {SBRANCH}(参照1.stポイントからのパラメーター名)—>スクリプトパス—> Jenkinsfile—>ライトウェイトチェックアウトのチェックを外します
  5. 適用->保存


0

ローカルgitサーバーの私の解決策:ローカルgitサーバーのフックディレクトリに移動し、既存のupdate.sampleを無視して、次のように文字どおり「update」という名前の新しいファイルを作成します。

gituser@me:~/project.git/hooks$ pwd
/home/gituser/project.git/hooks
gituser@me:~/project.git/hooks$ cat update
#!/bin/sh
echo "XXX from  update file"
curl -u admin:11f778f9f2c4d1e237d60f479974e3dae9 -X POST http://localhost:8080/job/job4_pullsrc_buildcontainer/build?token=11f778f9f2c4d1e237d60f479974e3dae9

exit 0
gituser@me:~/project.git/hooks$ 

echoステートメントはgit push結果の下に表示されます。トークンはjenkinsジョブ構成から取得でき、参照して見つけることができます。「更新」ファイルが呼び出されない場合は、拡張子「サンプル」なしで同じ名前の他のファイルを試してください。

それで十分です

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