はじめに
船井総研デジタルのoswです。業務でjenkinsに触れることになったので学習記録を残します。参考になる方がいらっしゃれば幸いです。
学習環境
- jenkins 2.375.3(AWS EC2)
- Github
以前の学習内容
手動でジョブ実行、Githubからクローン/テスト実行までを学習しました。
Githubへpushと同時にジョブを実行する方法
調べてみるとほとんどの場合、jenkinsにプラグインを入れて実現しているようです。ところが同じプラグインを入れてるはずが、同じ項目が表示されなかったり、表示されているものの、同じことをしても403エラーが返ってきたりとかなりハマりました。
(プラグインが更新されて、などの影響もあるかもしれません)
色々試した中で実際にpushしてジョブ実行まで確認できた方法2つを記します。
- webhookを使う方法
- Gitフックを使う方法
webhookを使う方法
こちらの方がシンプルでgithub側も推奨しているようです。ここでは次を前提とします。
- pushしたことを検知してジョブを走らせる
- pushされたリポジトリをクローンする
ジョブ設定
pipeline {
agent any
stages {
stage('clone') {
steps {
// webhookの送信元リポジトリがここで指定したリポジトリ、ブランチと一致していたらジョブが実行される
// 指定するブランチを変えれば、ブランチ別にpushを検知できる
git branch: "main",
url: "https://github.com/ofsda/test"
}
}
}
}
webhookの登録
push対象のリポジトリにwebhookを登録する
- Payload URL: JENKINS_URL/github-webhook/
- JENKINS_URL: [jenkinsダッシュボード] - [Jenkinsの管理] - [システムの設定]で確認
- Which events would you like to trigger this webhook?
- プッシュした際にwebhookを飛ばしたいので、[Just the push event]を選択
webhook登録後、画像のように緑のチェックが付けば疎通確認できているので問題ありません。赤くなっている場合は登録したwebhookを選択し、[Recent Deliveries]でログをご覧になってみてください。
pushしてジョブを実行する
ここまででpushを検知してジョブを走らせる仕掛けは完了です。ただ、作ったジョブは事前に手動で1回実行する必要があります。実行しないとwebhookが飛んでもジョブが起動しません。
下記画像は1度手動でジョブを実行した後に差分をpushした直後の画像、また、その実行結果です。
Gitフックを使う方法
Gitフックとは
Gitフックを今回初めて触ったのでドキュメントを置いておきます。gitの各種コマンド(commit / pushなど)が実行される前、後など決められたタイミングで定義した処理を走らせることができるようです。
コマンド、タイミングの組み合わせは.git/hooks/に存在するファイル名で定められており、そのファイルに処理を定義します。
ジョブ設定
github側がgitフック実行時に外部アクセスを制限してるようで、クライアント側で実行するpre-pushで実現しました。ここでは単純にフリースタイルのジョブを作成し、それが起動できれば良しとします。処理の中身は問いません。
ビルド・トリガURLを取得する
Gitフックに設定するビルド・トリガURLを取得するには、ジョブ詳細画面の「ビルド実行」を右クリック、「リンクのアドレスをコピー(E)」を選択し、メモしておきます。
コピーされるURLは「ビルド実行」にマウスホバーした際、左下に現れるアドレスです。(Chromeの場合)
APIトークンを作成する
[jenkinsダッシュボード] - [jenkinsの管理] - [ユーザーの管理] - [既存ユーザーを選択] - [設定] - [APIトークン] - [トークン新規追加]で生成したトークンをメモしておきます。
Gitフック pre-pushを設定
まず、.git/hooks/pre-push.sampleをpre-pushに名前を変更します。
その上で下記コマンドを記載します。先程取得したビルド・トリガURL、トークンを使います。
#!/bin/sh
curl -X POST --user <トークンを生成したユーザ名>:<トークン> <ビルド・トリガURL>
# 例) curl -X POST --user develop:11b01ee068975c75b180a57d http://xxxxxxxxxxxxxxxxxxxxxxxxx:8080/job/githook-test-job/build?delay=0sec
このGitフックを使う場合は、作成したジョブを最初に手動で実行させる必要はないようです。pushすればそのままジョブが起動します。
おわりに
ジョブ実行するのにGitフックを使うことはなさそうですが、方法の1つとして覚えておこうと思います。
普段見ない.gitの中を触れたのはいい経験でした。