前提条件
以下の中でいくつかは特定条件の下での事象になります。今回の私の場合は「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
なので、jenkins
がclone
しないといけません。 以下のようになるでしょう。
$ pwd /opt/software $ git clone http://jenkins:password_of_jenkins_at_gitlab@localhost/fugafuga/foobar_soft.git
こうしておけば、今後はユーザjenkins
がsudo
の主体になってくれます*3。
※これも何か変なのでスルーで……
参考ページ(感謝)
その他、細かいところは以下のページが非常に参考になりました。ありがとうございます。
補足
まあ、生シェルでデプロイするんじゃなくて、Capistrano
使えよ、って話ですが……。