Jenkins 1.463
Jenkins Github plugin 1.5
GitlabよりGithubのがやっぱ使いやすい
今までGitlabとJenkinsでCIやってたのですが、
Gitlabはあんまり使われていなかったw
一部プロジェクトをGithub Organizationの非公開リポジトリで管理して、今まで通りCIやりましょうというお話。
Gitlab時代
ForkやPRという概念がなかった。
リポジトリはひとつで、ブランチ間のマージにMerge Requestという機能はあったけれど。
GitlabのWeb hookからJenkinsのURLを指定して、Jenkins Git pluginが受け取りビルドするという流れだった。
さあ、Github
Organizationに非公開の親リポジトリがあり、そこにメンバーがForkしたリポジトリがぶら下がる形。
OSSの開発と似たような感じだけど、非公開リポジトリなので当然外からは見えない。
(非公開リポジトリをForkしたら、メンバーのGithubアカウントがFreeアカウントでも非公開になるんだね!)
上記の構成で下記を実現する。
- 親リポジトリのmasterにpushしたら、本番環境にデプロイされる。
- 親リポジトリの開発ブランチにpushしたら、ステージング環境にデプロイされる。
- 個々のリポジトリの開発ブランチにpushしたら、個々の専用のステージング環境にデプロイされる。
開発者毎にステージングがあるのがポイント。
開発者毎のステージングで問題がなければ、親リポジトリの開発ブランチへPRを投げる。
それを実現する過程で問題になった点/気になった点をいくつか。
セキュリティ対策
Githubにして問題になったのは、まず外部のネットワークということでセキュリティを気にしないといけなくなった。
ここでは割愛するけれど、Jenkinsの管理から権限をしっかり設定すべき。
Github plugin
これドキュメントがなさ過ぎるんだけど、要するに自分のgithubのid/passwordをJenkinsに入力すると自動でやってくれる。
これ楽だけど、気持ち悪い。。。
JenkinsからGithubへ繋ぐ時の鍵
鍵を作ってDeploy keysに貼っつけてもいいのだけど、そうすると複数リポジトリを持つときに困ったことになる。
今回、Github Organizationの親リポジトリだけでなく、個々のForkしたリポジトリからのデプロイもやるので、複数のリポジトリにJenkinsから繋げないといけない。
それを素直に実現しようとすると、以下のようになるんだけど、
Host production.github.com
HostName github.com
User git
IdentityFile pem_for_production
Host user1.github.com
HostName github.com
User git
IdentityFile pem_for_user1
こうすると、当然、Jenkinsの設定でもGitのリポジトリ名を
[email protected]:hogehoge/hogehoge
みたいに書かないといけない。
そうすると、Github pluginがGithubからのHookを違うものと認識してしまって動かない。。。
実装を考えると当然かと思うのだが。
なので、自分のSSH keysにJenkins用の鍵を追加してやらないといけない。。。
気持ち悪い。。。
デプロイ先からGithubに繋げるように
これは素直に
ssh-keygen -t rsa
していただいて、公開鍵をリポジトリ毎のDeploy keysに追加していただく。
分かりやすい。
ここらへんまでやると動く。
感想
個人のアカウントにJenkins用の鍵を追加するのは気持ち悪すぎるので、他の方法があれば採用したい。
(だって個人のリポジトリもJenkinsからgit cloneできちゃうわけだしね!!)
ただ、仕組みとしては最高に使いやすいです。