約束の地

キャロの想い出

GitLab と Jenkins を組み合わせてオートデプロイしようと思ったらドハマりした(解決済み)

前提条件

以下の中でいくつかは特定条件の下での事象になります。今回の私の場合は「Jenkins とデプロイ先が同じサーバ」という条件でのことになります。

GitLab と Jenkins

今さら説明をするまでもない、有名な OSS です。

GitLab にコミット(プッシュ)したら Jenkins によってデプロイしたい

この組み合わせならやることはほぼ一つでしょう。

「GitLab にプッシュ」→「Webhook 発動」→「Jenkins 動作」→「オートデプロイ」

ハマりどころ

何点かハマりどころがありますので、一つ一つ解決策とともに挙げていきます。基本的なところは末尾の「参考ページ」をご覧ください。

1. リポジトリを指定する URI からユーザ名は削除する

GitLab 特有の性質として、リポジトリの URI がhttp://foobar:localhost/foo/bar.gitのようになっていることが挙げられます。すなわち、ユーザ名のfoobarの部分が、ウェブページ上からの URIコピペ だと付与されてきてしまいます*1

これを削除しましょう。具体的にはhttp://localhost/foo/bar.gitのような URI にすれば OK です。

2. デプロイ先の書き込み権限による sudo の使用

デプロイ先のディレクトリの書き込み権限が、自動で作成されるユーザであるjenkinsにない場合は、sudoを使う必要があります。ただもちろんパスワードが普通は求められます。「対話」ができないため、これを回避しなければいけません。

パスワードの入力を回避するために、sudoersの末尾に以下のように追記します*2

Defaults:jenkins !requiretty
jenkins ALL=(ALL) NOPASSWD:ALL

ちなみにこれはRundeckなどでも使える方法ですね。

3. 初期の git clone 時のユーザは jenkins で

例えば/opt/softwareにおいて、foobar_softというリポジトリをcloneするとします。以下のような感じです。

$ pwd
/opt/software
$ git clone http://localhost/fugafuga/foobar_soft.git

これだと、git cloneする主体は、いまログインしているユーザになってしまいます。Jenkins で動くユーザはjenkinsなので、jenkinscloneしないといけません。 以下のようになるでしょう。

$ pwd
/opt/software
$ git clone http://jenkins:password_of_jenkins_at_gitlab@localhost/fugafuga/foobar_soft.git

こうしておけば、今後はユーザjenkinssudoの主体になってくれます*3

参考ページ(感謝)

その他、細かいところは以下のページが非常に参考になりました。ありがとうございます。

補足

まあ、生シェルでデプロイするんじゃなくて、Capistrano使えよ、って話ですが……。

*1:foobarの部分は、今ログインしているユーザ名になる

*2:くれぐれも編集にあたっては注意して下さい

*3:「ソースコード管理」の「認証情報」のところが上手く働いていないような気もしますが……

Powered by はてなブログ