TOKOROM BLOG

iOSとかVimとかその他日々の雑多な技術情報

JenkinsにBitbucketからビルド命令を出す際にIDとPasswordを埋め込まないようにする はてなブックマーク - JenkinsにBitbucketからビルド命令を出す際にIDとPasswordを埋め込まないようにする

Permalink

前の記事でBitbucketにpushしたのをトリガーにJenkinsでOctopressをデプロイするというのをやったのだが、このときは認証なしでJobの実行できるようになってしまっていた。
つまりこのままだと自分のJenkinsは認証なしで全てのJobが実行できてしまうという状態でよろしくない。
ひとつの解決索としてビルド命令用のユーザを作り、そのIDとPasswordをURLに直接埋め込んでしまうという方法も考えられるが、今回はそれを極力しない方向でがんばりたいと思う。

JenkinsにBitbucketからアクセスするためのユーザを追加

まずはBitbucketからJenkinsにアクセスする専用のユーザを作る。

※ ユーザの追加方法については このあたり を参照

今回は、bitbucket というユーザを追加した。

また、 Manage Jenkins -> Configure System で、

  • Access Control
    • Authorization
      • Matrix-based security
        • bitbucketユーザに JobRead だけチェック

としておいて、bitbucketユーザが最低限のことのみ可能なように設定しておく。

このとき、Anonymousユーザの JobRead にチェックがついていれば外しておく。

Jenkinsへのビルド命令専用のドメインを追加

これまでは jenkins.yourdomain というドメインでJenkinsにアクセスさせていたとして、ビルド命令専用の push-to-jenkins.yourdomain を追加した。
これはnginxが外部からのビルド命令だと分かるようにするための目印としての意味合いなので、ドメインを追加する以外の方法でも良い。

nginxに設定追加

nginxのconfに、以下のようにpush-to-jenkins.yourdomainへのアクセスをBasic認証つきでローカルのJenkinsのURLに委譲するよう設定を追加する。

1
2
3
4
5
6
7
8
server {
    listen 80;
    server_name push-to-jenkins.yourdomain;
    location / {
        proxy_pass http://localhost:8080;
        proxy_set_header Authorization "Basic XXXXXX";
    }
}

XXXXXX の部分には実際には bitbucket:yourpassword というBasic認証のIDとPasswordの文字列をBase64エンコードした文字列を入れる必要がある。
Base64エンコードの方法が分からない場合は このあたり のサイトでエンコードした文字列をGETするのが手っ取り早い。

設定後にnginxを再起動しておくこと。

Bitbucketのほうの設定

該当リポジトリの Admin タブの Services を選択。

POSTの設定項目を

1
http://push-to-jenkins.yourdomain/job/deploy-octopress/build?token=a-word-you-like

に変更しておく。

おしまい

以上の設定がうまく言っていれば、Bitbucketへのgit push origin sourceでOctopressのデプロイが自動的にできるはず。
また、このときベーシック認証のIDとPasswordがインターネット上にさらされることもない。

2012/08/19 追記

なお、Twitterで@croquette0212さんから

と教えていただきました。
この方法だと外部(ここではBitbucket)から叩くURLになんとジョブ名さえ指定する必要がありません。このNotifyを受けたJenkinsのほうで自動でジョブをさらってスケジューリングしてくれるとのことです。
また、このNotifyそのものがジョブを実行するわけではなくあくまでもJenkinsに対する通知だけなので、ジョブの実行権限のあるユーザでURLを叩くにはどうしたらよいだろう?とかセキュリティのことをごたごた考えずに済みます。Jenkinsを運用しているサーバが該当のGitリポジトリをcloneできる状態ならOKなようでとても楽そうです。
詳しくは GitHubとJenkinsの連携 をご参照ください。

Comments