pockestrap

Programmer's memo

毎日新鮮なRubyを使う

rbenv global trunkしていても気が向いた時にしかRubyをビルドしていなかったので、trunkと言いつつ結構古いRubyが動いていることが多かった。 そのため毎日Rubyをビルドして、trunkとしてインストールするようにした。

環境

やったこと

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

参考


  1. より具体的には、https://github.com/itamae-kitchen/itamae/pull/277 が必要