ほげほげ見聞録

技術メモ、備忘録、使い方はそのうち覚える

BacklogのWebhookでJenkinsのビルドを走らせる

JenkinsのFTPプラグインでデプロイするまでの設定などメモ。
この方法だとブランチの判別ができない。
※2018/3/3 以下の記事に追記。 dwmemo.hatenablog.com

やりたいこと

  • BacklogのWebhook機能でJenkinsのジョブを実行
  • developブランチの内容をテスト環境へ自動デプロイ

作業時の状況

  • BacklogとJenkinsはインストール・その他設定済
  • Backlogのアカウントはプロジェクト管理者
  • Jenkinsのアカウントは一般ユーザ
  • JenkinsのあるサーバはWindows

BacklogのWebhook機能で出来ること

WebHookを実行するタイミングに「通知するイベント」を設定可能。
色々あるが、Gitに関係するイベントは以下。

  • Gitプッシュ
  • プルリクエストの追加
  • プルリクエストの更新

特定ブランチの設定などはできないらしい。

SSH鍵の登録

JenkinsからBacklogに接続する為、SSH鍵を作成してBacklogに登録する。

今回は権限がAdministratorではなかったので、設定などは他の人にお任せしている。
何やかんやで作った公開鍵id_rsa.pubと、対応するSSH用ユーザ「jenkins」を用意。
Backlogの個人設定でid_rsa.pubの中身をSSH公開鍵に設定して完了。

WebhookからURLアクセスでJenkinsのジョブ実行

ジョブは「フリースタイル・プロジェクト」で作成。
ジョブの設定はさておいて、Webhookからジョブを実行できるかテスト。
リモートからのアクセスは以下のURLで実行可能。

http://【Jenkinsアドレス】/job/【job名】/build?token=【jobのトークン】

https://wiki.jenkins.io/display/JA/Remote+access+APIwiki.jenkins.io

ブラウザでURLに直接アクセスするとビルドが成功する。
URLをWebhookに設定してテストすると送信は問題ないが、結果のステータスコードは403になる。ビルドは実行されていない。

原因は、JenkinsでCSRFの設定をしているかららしい。
CSRFのチェックを外してWebhookテストするとビルド成功、結果のステータスコードは201。
これで解決にするのは、あまりよろしくない…。

CSRFはチェックしたままでジョブを走らせたい

色々と調べてみた。
ログイン情報をURLに設定する「http://foo:pass@【Jenkinsアドレス】」でも403。
https」でアクセスしてもエラー。

そこで「Build Authorization Token Root Plugin(Build Token Root Plugin)」をインストールしてみる。
このプラグインは認証なしで外部からビルド可能らしい。
https://wiki.jenkins.io/display/JENKINS/Build+Token+Root+Pluginwiki.jenkins.io

リモートアクセスのURLは先程とちょっと変わる。

http://【Jenkinsアドレス】/buildByToken/build?job=【job名】&token=【jobのトークン】

ブラウザ直叩きでビルド成功。
Webhook実行で、結果のステータスコードは201になり、ビルド成功。

公開サーバでないし、今回はとりあえずこれで解決にして先へ進む。

ファイルを自動アップロード

肝心のファイルをアップロードするには「Publish over FTPプラグインを使う。
「ビルド」に「Send Files over FTP」があるので各種設定。
アップするファイル、アップしないファイルをそれぞれ設定可能。

qiita.com https://wiki.jenkins.io/display/JENKINS/Publish+Over+FTP+Pluginwiki.jenkins.io

ビルドを実行すると、ちゃんとdevelopからファイルをチェックアウトし、テスト環境にアップロードできた。

その他のデプロイ方法

FTPプラグイン以外にも、WinSCPを使う方法もあるらしい。
qiita.com

問題点

どのブランチをpushしても毎回developの内容をデプロイしている。
pushでビルドが走るのは良いとして、develop以外のブランチをいじるだけでデプロイするのは気分が悪い。

出来れば、pushされたブランチによって処理を変更したい。
パイプライン機能を使うとできそうなので、ぼちぼち調査中。


参考になりそうなURL