毎日新鮮なRubyを使う
rbenv global trunk
していても気が向いた時にしかRubyをビルドしていなかったので、trunkと言いつつ結構古いRubyが動いていることが多かった。
そのため毎日Rubyをビルドして、trunkとしてインストールするようにした。
環境
- Arch Linux
- systemdが動いているLinuxディストリビューションであれば、だいたい同じ様に実現できると思う
やったこと
systemdのtimerを使い、毎日Rubyがビルドされるようにした。 また、itamaeを使いプロビジョニングを自動化した。
コード
itamae/
ディレクトリ下に必要なファイルを置いている。
itamae/cookbooks/ruby-trunk-build/default.rb
必要なファイル群を置いて、serviceをenable, startする。
remote_file '/etc/systemd/system/ruby-trunk-build.service' do user 'root' owner 'root' group 'root' end remote_file '/etc/systemd/system/ruby-trunk-build.timer' do user 'root' owner 'root' group 'root' end directory '/opt/ruby-trunk-build' do user 'root' end remote_file '/opt/ruby-trunk-build/ruby-trunk-build.sh' do user 'root' owner 'root' group 'root' mode '755' end execute 'reload daemon' do command "systemctl daemon-reload" user 'root' end service 'ruby-trunk-build.timer' do user 'root' action :enable end service 'ruby-trunk-build.timer' do user 'root' action :start end
itamae/roles/main.rb
itamaeを実行する上でのエントリポイント。
include_recipe '../cookbooks/ruby-trunk-build'
itamae/cookbooks/ruby-trunk-build/files/etc/systemd/system/ruby-trunk-build.timer
毎日御膳4時に起動するタイマー。 時間に深い意味はないが、自分が作業していない時間にビルドするのが一番副作用が抑えられそうなのでそうしている。 なおPCを使っていないときはスリープしているので、実際は朝起きてPCを起動した時にこのタイマーが起動することになる。
[Unit] Description=Build Ruby trunk daily [Timer] OnCalendar=*-*-* 04:13 Persistent=true [Install] WantedBy=timers.target
itamae/cookbooks/ruby-trunk-build/files/etc/systemd/system/ruby-trunk-build.service
サービスの定義。一般ユーザーとして動かすように指定している。
[Unit] Description=Build Ruby trunk [Service] Type=oneshot User=pocke Group=users ExecStart=/opt/ruby-trunk-build/ruby-trunk-build.sh
itamae/cookbooks/ruby-trunk-build/files/opt/ruby-trunk-build/ruby-trunk-build.sh
ビルドスクリプト。
prefixを~/.rbenv/versions/trunk
にしている。これによってrbenvからtrunkというバージョンとしてこのRubyを見ることができるようになる。
#!/bin/bash set -xe SRC='/tmp/ruby-trunk-build-src' if [ ! -d $SRC ]; then git clone --depth 1 https://github.com/ruby/ruby $SRC cd $SRC else cd $SRC git fetch git checkout origin/trunk fi autoreconf ./configure --prefix=$HOME/.rbenv/versions/trunk --enable-shared make -j make install $HOME/.rbenv/versions/trunk/bin/ruby -v echo "Installing Ruby trunk successfully finished."
実行
$ itamae local itamae/roles/main.rb --dry-run $ itamae local itamae/roles/main.rb
備考
このコードを実行するにはitamae v1.10.3以上が必要である。1