chef-soloでさくらVPSにJenkinsを立ててみる。(chef-solo準備編)

ちょっと前のエントリーが長くてだるいので、chefでインストールすることにする。
その前に、chef-soloの準備をする。

Gistをクローンすれば、chef-soloの環境が揃うーとウキウキしてたのだけど、

git clone https://gist.github.com/5204368.git
Initialized empty Git repository in /root/5204368/.git/
error: RPC failed; result=22, HTTP code = 400
できない・・・さくらVPSだとできないらしい。
プロトコルをgitにするとできるらしい。

さくらサーバからgistのリポジトリをcloneできない
https://github.com/willnet/misc/issues/1

あんまり気にせずに、言われた通りにやってみる。

git clone git://gist.github.com/5204368.git
cd 5204368/
bash prepare_chef_solo.sh
さて、chefでJenkins環境作るかーって思ったら時間切れ。

ということで、また次回。

=== 2013/04/10 追記 ===
いろいろやっていて、ruby1.8ではできないことが多かった。
yumで入れたrubyでは限界のため、ソースから入れることにした。

自分の時間が取れなくて、全く進んでいかない・・・涙

shellスクリプトでdateをダイナミックに取得する

ちょくちょくはまるのでメモ
曜日を取得するとか今週の○曜日がいつかとかshellでやりたいとき以下のようなプログラムを書く。

`date -d '1 days' +"%Y-%m-%d"`
こんな感じで普通書いていたのだけど、「1」の部分を変数にして、シングルクォーテーションでやると展開できない。
これはシングルクォーテーション内では変数が展開されないため。ダブルクォーテーションで行うこと。


それにしても、初めてGist使った。
これ便利。はてなでの使い方にさらにはまったので、そちらもメモ

「Embed this gist」にあるタグをコピーする。

ここから、GitHubのアカウント名(上記の場合、shiraji/)をURLから削除する。


GitHubのURLを文字列にするのはどうやるのか。。。
もうループにはいってるからとりあえず無視。

さくらVPSでJenkinsを立ててみる。

yumの更新

# yum update
日本語化
# vim /etc/sysconfig/i18n
LANG="ja_JP.UTF-8"に変更する。
ユーザ作成とパスワード設定(shirajiを作る場合)
# useradd shiraji
# passwd shiraji
権限の設定
# usermod -G wheel shiraji
# visudo
wheelグループにすべてを許可する。
%wheel ALL=(ALL) ALL
suの設定
# vim /etc/pam.d/su
suコマンドをグループ内のユーザーだけが使用できるように設定
auth required pam_wheel.so use_uid
ログイン関連
クライアントがwindowsだった場合、PuTTYなどのツールで公開鍵、秘密鍵を作成する。Linuxだった場合はssh-keygen
shirajiでSSHログインする。
# cd
# mkdir .ssh
# chmod 700 .ssh
# vi .ssh/authorized_keys
公開鍵を貼り付ける
# chmod 600 .ssh/authorized_keys

rootでのログインをできなくする
# vi /etc/ssh/sshd_config
sshの再起動
# service sshd restart
rootでログインできないこと、作成したユーザでログインできることを確認する。

公開鍵認証のみに設定する。
# vi /etc/ssh/sshd_config
以下になるように編集
PubkeyAuthentication yes
PasswordAuthentication no
sshの再起動をして、再度ログインができることを確認する。

ポートの変更
# vi /etc/ssh/sshd_config
Port番号を22から違う数字(0-1023以外)に変更する
Port 10022
iptablesの設定をする
iptablesのインストール
# yum install iptables
Loaded plugins: fastestmirror, security
Loading mirror speeds from cached hostfile
epel/metalink | 5.3 kB 00:00
* base: www.ftp.ne.jp
* epel: ftp.kddilabs.jp
* extras: www.ftp.ne.jp
* updates: www.ftp.ne.jp
base | 3.7 kB 00:00
extras | 3.5 kB 00:00
updates | 3.5 kB 00:00
Setting up Install Process
Package iptables-1.4.7-5.1.el6_2.x86_64 already installed and latest version
Nothing to do
さくらVPSの場合、インストールされている。

iptablesの設定
# vi /etc/sysconfig/iptables
以下をコピペ(内容はよくわからん。エ・・・)
===スタート===
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:RH-Firewall-1-INPUT - [0:0]
-A INPUT -j RH-Firewall-1-INPUT
-A FORWARD -j RH-Firewall-1-INPUT
-A RH-Firewall-1-INPUT -i lo -j ACCEPT
-A RH-Firewall-1-INPUT -p icmp --icmp-type any -j ACCEPT
-A RH-Firewall-1-INPUT -p 50 -j ACCEPT
-A RH-Firewall-1-INPUT -p 51 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp --dport 5353 -d 224.0.0.251 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 20 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 21 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 25 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 10022 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 8080 -j ACCEPT
-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited
COMMIT
===エンド===
以下のラインは必ず入れる。10022は上記のSSHのポート設定のポート。入れないとログインできなくなる。8080はJenkins用にあけておく。
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 10022 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 8080 -j ACCEPT
iptableの再起動
# /etc/rc.d/init.d/iptables restart

もう一度、SSHで入れるかどうか確認する。(ちょくちょく確認したほうが身のため。)

logwatchの設定
logwatchのインストール
# yum install logwatch
インストールできたかどうか確認
# /usr/sbin/logwatch --print
ログ的なものが出ていればOK
logwatchのメール送信先の設定
# vim /etc/logwatch/conf/logwatch.conf
MailTo=shiraji@example.comと記載。
フォルダの作成
# mkdir -p /usr/local/log/logwatch
Javaのインストール
# wget http://javadl.sun.com/webapps/download/AutoDL?BundleId=49018
# mv jre-6u26-linux-x64-rpm.bin\?AuthParam\=1361545167_db8e32ac10dd7744bf2875dd0f3ef4f5\&GroupName\=JSC\&FilePath\=%2FESD6%2FJSCDL%2Fjdk%2F6u26-b03%2Fjre-6u26-linux-x64-rpm.bin\&File\=jre-6u26-linux-x64-rpm.bin\&BHost\=javadl.sun.com jre.bin
# ./jre.bin

インストールできたか確認
# java -version
JAVA_HOMEを追加する。以下を.bashrcとかに追記
export JAVA_HOME=/usr/java/default/

Jenkinsのインストール
Jenkinsをインストールするためのレポジトリーの設定
# wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.repo
# rpm --import http://pkg.jenkins-ci.org/redhat/jenkins-ci.org.key

インストール
# yum -y install jenkins

Jenkinsの起動
# /sbin/service jenkins start

起動の確認
http://ipaddress:8080/

Serviceに登録する
# chkconfig --list jenkins
jenkins 0:off 1:off 2:off 3:on 4:off 5:on 6:off
# chkconfig jenkins on
# chkconfig --list jenkins
jenkins 0:off 1:off 2:on 3:on 4:on 5:on 6:off

終わり。長い・・・。
chefでできるようにしよかな。

EGitでGitHubのプライベートレポジトリーからクローンする方法

2回連続ではまったので、メモ書き。

EGitでGitHubのプライベートレポジトリーからクローンする場合、まずはSSH公開鍵の登録が必要。
さらにその登録の前に、SSH鍵の作成が必要。

Eclipseからそれを行う。

詳細は以下
https://github.com/hybitz/AndroidInfo/wiki/Egit%E3%81%A7GitHub%E3%81%AB%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%81%99%E3%82%8B

そのプライベートレポジトリーを保持している、またはアクセス可能なアカウントに登録する必要がある。

GitHubからインポートする際、ユーザ、パスワードを求められるが、
SSH鍵を登録しておけば、そこは無視して問題ない。



※注意点※
クローンをクーロンと間違えないこと(ドウデモイイ

ruby-mysqlとMySQL5.5を入れたときにsocketファイルが見当たらない

Railsの前にまずはRubyMySQLを接続してみよう!と

require 'mysql'
client= Mysql.connect('host', 'user', 'password', 'database')
...
こんな感じで実行すると2行目で以下のようなエラーが出る。
No such file or directory - /tmp/mysql.sock

調べてもrailsの情報ばかりで、おおはまり。

エラーメッセージから/tmp/mysql.sockがないとのことなので、socketファイルをそこに置くか、ruby-mysqlをそこに見るかが簡単な方法のはず。
MySQLを変更するのはちょっと怖かったので、ruby-mysqlの変更をすることにする。

ruby-mysqlをソースから引っ張ってくる。
libフォルダにmysql.rbというファイルがある。

【修正前】
MYSQL_UNIX_PORT = "/tmp/mysql.sock"

【修正後】
MYSQL_UNIX_PORT = "/var/run/mysqld/mysqld.sock"

これで再インストール(書く必要ないと思うけど、一応・・・)
ruby setup.rb

ということで、SQLを叩いたら動いた。
環境構築は苦手です。。。

Jenkinsでログの一部分からメールを作成する方法

Jenkinsのログの一部分からメールを送信する方法がよくわからなかったので、メモ。

最初の目標として、実行された一時ファイルの名前を抽出し、メール送信する。

まずはEmail-ext pluginをインストール。
BUILD_LOG_REGEXを利用する。


BUILD_LOG_REGEXはログを正規表現を利用して抽出できる関数。
${BUILD_LOG_REGEX, regex, linesBefore, linesAfter, maxMatches, showTruncatedLines, substText, escapeHtml, matchedLineHtmlStyle}

使うのは
regex: 正規表現
showTruncatedLines: truncateされた列を表示するかどうか。デフォルトOFFにしてほしい・・・
substText: regexで抽出した文字列だけを表示したいときに利用する。

以下をメールのコンテンツに書く。

以下のテンプファイルを実行しました。

${BUILD_LOG_REGEX, regex=".*/tmp/\(.*\).sh.*", showTruncatedLines=false, substText="$1"}

結果

以下のテンプファイルを実行しました。

hudson3558248437816319717
hudson3558248437816319717

注意点:substTextを使うときはダブルクオテーションで括ること。


=== 2013/05/15 追記 ===

addNewLineなんてオプションができてた。(見落としてた?バージョンアップしたから?よくわからん)

addNewline - If true, adds a newline after subsText.
Defaults to true.

上記の例のように、複数マッチする時は必要ですが、確実に1つマッチするだけということであれば、addNewline=falseを忘れずに。

AntとJUnitインストール方法+Jenkinsの環境変数について

なんかここ数日antをインストールしなおしたりしていたら、
何度も同じところでひっかかったのでメモ

antにjunitを入れる方法

@blog.justoneplanet.infoさん参照
http://blog.justoneplanet.info/2010/12/03/centos%E3%81%ABant%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B/

antのインストール

wget http://ftp.riken.jp/net/apache//ant/binaries/apache-ant-1.8.4-bin.tar.gz
tar -xvf apache-ant-1.8.4-bin.tar.gz
cp -prf apache-ant-1.8.4/ /usr/lib/
ln -s /usr/lib/apache-ant-1.8.4/bin/ant /etc/alternatives/ant
ln -s /usr/lib/apache-ant-1.8.4/ /etc/alternatives/anthome
ln -s /etc/alternatives/ant /usr/bin/ant
ANT_HOMEを設定する。
vim /etc/profile
以下を追加
export ANT_HOME=/etc/alternatives/anthome
反映
source /etc/profile

JUnitの設定

wget https://github.com/downloads/KentBeck/junit/junit-4.10.jar
cp junit-4.10.jar /usr/lib/apache-ant-1.8.4/lib/

しかし、Jenkinsでantを動かしているのだが、上記手順でインストールしていなかったスレーブのほうでビルドしようとするとエラーが出まくる。。。
JAVA_HOMEやANT_HOMEを設定しているので、そっちを見るのかと思っていたのだけど、違った。
確認方法
build.xmlに以下を追加


...

...


...

上の結果がスレーブにログインして行うと

     [echo] /usr/lib/jvm/jre-1.6.0-openjdk
[echo] /etc/alternatives/anthome
JenkinsでSSH経由で実行すると
     [echo] ${env.JAVA_HOME}
[echo] ${env.ANT_HOME}

調べてみると、日々是精進。さんのところにこんな記事が
http://daily-postit.blogspot.jp/2011/12/ssh.html

環境変数が引き継がれないのは/etc/profileではなく、/etc/bashrcに書き込めば良いらしい。