Jenkinsで「githubを監視して、変更があったらrakeを走らせる」というジョブを作成した。
そのとき躓いたところや、ポイントだと思ったところをメモしておく。
おおまかな環境構築の流れはCentOSにyumでjenkinsをインストールする - 文系プログラマによるTIPSブログを参考にした。
jenkinsユーザへの変更
jenkinsユーザへ切り替えると、諸々の作業が楽になる。
しかし、yumでインストールしたjenkinsでは、デフォルトで切り替えられないように設定されている。
/etc/passwd
のjenkinsの行を次のように変更すると、切り替えられるようになる。
jenkins:x:496:497:Jenkins Continuous Build server:/var/lib/jenkins:/bin/bash
(参考:RSpecをrvm×Jenkinsで実行するまでの試行錯誤をメモ)
wget実行時にプロキシに引っかかる
インストールのため、下記を実行。
$ sudo wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.repo
$ sudo rpm --import http://pkg.jenkins-ci.org/redhat/jenkins-ci.org.key
$ sudo yum install jenkins
1行目を実行したときに、
proxy URL ftp://ID/PW@proxy.yourdomain.com:port に間違いがあります: HTTPでなければなりません。
と表示されるエラーが発生した。
How to Use WGET with a Proxy Serverを参考にして、/etc/wgetrc
に
http_proxy=http://proxy.yourdomain.com:port/
proxy_user=userID
proxy_password=password
のようにプロキシ情報を追加したところ、エラーが出なくなった。
使用するポートを変更する
ポート番号を変えたい場合は、/etc/sysconfig/jenkins
を次のように書き換える。
JENKINS_PORT="変更後ポート番号"
ちなみに、そのポート番号が使われているかどうかを調べたいときには
$ netstat -tanp
というコマンドを使う。
(参考:管理者必見! ネットワーク・コマンド集 - netstatコマンドでポートを利用しているプロセスを調べる:ITpro)
githubとの連携
jenkinsインストール時に~jenkins/.ssh
が自動生成されると書いてあるサイトもあったが
見つからなかったので、自分でssh鍵を生成。
$ cd /var/lib/jenkins
$ mkdir .ssh
$ sudo chown jenkins .ssh
$ sudo -u jenkins -H ssh-keygen -t rsa -C jenkins@hoge.com
$ chmod 744 ../.ssh
ssh鍵が生成できたら、githubで使用しているユーザのsshに追加する。
(リポジトリに追加すると、複数のリポジトリを扱えなくなってしまう。)
sshで外のサーバへログインするためには、SOCKSプロキシを経由する必要があったので
connect.c
を拾ってきて~jenkins/.ssh/config
に下記を加えた。
(connect.cの所在はググるのがいちばん手っ取り早いらしい。)
Host github.com
User git
HostName ssh.github.com
Port 443
ProxyCommand /usr/bin/connect -S socks.yourdomain.com:port %h %p
IdentityFile ~jenkins/.ssh/id_rsa
環境変数にIDとパスワードを設定すればOK。
(Jenkinsの管理>システムの設定>グローバルプロパティ>環境変数)
キー | 値 |
---|---|
SOCKS5_USER | ID |
SOCKS5_PASSWD | パスワード |
~jenkins/.ssh/config
もchownで所有者をjenkinsに変更しておく。
下のコマンドで、githubにアクセスして設定ができたか確認できる。
$ sudo -u jenkins ssh git@github.com
(参考:Jenkins+GitHubのプライベートリポジトリ - Qiita
GitHubとJenkins連動 自動デプロイ 開発環境設定編 at ITエンジニアmegadreamsの開発日記)
githubから取得した最新ファイルを置くディレクトリを指定
デフォルトでは全てworkspace直下に置かれてしまう。
1つのジョブで複数のリポジトリにアクセスしたときなどに困るので、
ディレクトリを指定して取得してくるようにする。
- ジョブの設定画面>ソースコード管理>Gitを選択
-
Additional Behaviours
という項目でCheck out to a sub-directory
を選択 -
Local subdirectory for repo
という設定項目が現れるので、ファイルを置きたいディレクトリ名を書く
(参考:Jenkinsで1つのジョブで複数のGitリポジトリをビルドする方法 - wadahiroの日記
[#JENKINS-13086] Clone to directory named for repository - Jenkins JIRA)
ERROR: Repository not found
上記のエラーが出て、ビルドが失敗していた。
結局はリポジトリ名のタイポが原因だったが、上記のエラーが出た場合には次のことをチェックしてみると良いらしい。
スペルミス
githubからコピーしてくるとミスがない。
権限
リポジトリにアクセスする権限があるのかどうか。
ssh接続
ssh -T git@github.com
で確認してみる。
本当に存在するのか
削除されていたり、とか。
(参考:Error: Repository not found)
rakeを実行するジョブ
~jenkins/.bashrc
に下記を加えて、rvmのPATHを追加しておくだけでOK。
[[ -s "(rvmの場所)/scripts/rvm" ]] && source "(rvmの場所)/scripts/rvm"
PATH=$PATH:(rvmの場所)/bin
RakeプラグインやRVMプラグインなど様々なプラグインがあるみたいだが、
今回はどちらも使わずに実行できた。
# !/bin/bash -xe
cd $WORKSPACE/directory_name
source ~/.bashrc
bundle install --path vendor/bundle --without production development
rake db:drop db:migrate RAILS_ENV=test
rake
(参考:【jenkins】 RVMが正常に動作しない bundle: command not found)
pushされたブランチに対してビルドを実行する
Gitプラグインの$GIT_BRANCH
変数と、Parameterized Trigger plugin
を使う。
JenkinsがGithubにpushされたbranchをテストする - Perl日記を参考に、
監視するジョブと処理を行うジョブを分けるとわかりやすくなった。
詳細な設定は上記リンクを参考にすると良い。
要約すると、
- 監視ジョブの後処理>Predefined parametersを選択し
branch=${GIT_BRANCH}
を設定して、ブランチ名を下流ジョブ(処理用)に渡す。 - 下流ジョブではビルドのパラメータ化にチェックを入れて、branchパラメータを受け取る。
そして、ソースコード管理>Git>Branches to buildを$branch
に設定すると
変更があったブランチに対してビルドを実行できる。
シェルの途中で失敗したときにジョブを停止する
# !/bin/bash -xe
または
# !/bin/sh -xe
のどちらかを書くだけ。
シェルの途中で失敗した場合に、ジョブが停止される。
(参考:Jenkinsで使うシェルスクリプトは-xeつけた方がよかった - くりにっき)
(おまけ)プラグインいろいろ
Jenkinsに入れているプラグインまとめ(Rails中心) - くりにっきに、
ジョブ内容に関わらず役立ちそうなプラグインが紹介されている。
Dependency Graph View Plugin - Jenkins - Jenkins Wikiも入れておくと便利そう。