tl;dr
Amazon Linux に Ruby がソースコードからインストールされているコンテナが欲しくなって, https://www.ruby-lang.org/ja/downloads/ でダウンロード出来る Ruby がインストールされているコンテナイメージを夜な夜な自動的に作ってくれる仕組みを作っていたのを思い出したので振り返りを兼ねて書きます.
YAMAP エンジニア Advent Calendar 2019 の 11 日目の記事になる予定です.
俺のギョームツール
oreno-amazonlinux-ruby
$ tree . . ├── Dockerfile ├── Gemfile ├── Gemfile.lock ├── README.md ├── lib │ ├── build.rb │ └── delivery.rb └── rubuild.rb 1 directory, 7 files
ちょっと手元で Ruby 入り Amazon Linux が入ったコンテナで検証したいなーって時に役立っています. 試しに, 以下の記事を参考にさせて頂き, Ruby 2.7 から導入予定とされているパターンマッチを試してみた様子となります.
$ docker pull xxxxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/oreno-amazonlinux-ruby:2.7.0-preview3 $ docker run -t -i --rm xxxxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/oreno-amazonlinux-ruby:2.7.0-preview3 bash bash-4.2# ruby -v ruby 2.7.0preview3 (2019-11-23 master b563439274) [x86_64-linux] bash-4.2# irb This version of IRB is drastically different from the previous version. If you hit any issues, you can use "irb --legacy" to run the old version. If you want to just erase this message, please use "irb --multiline". irb(main):001:1* case [0, [1, 2, 3]] irb(main):002:1* in [a, [b, *c]] irb(main):003:1* p a irb(main):004:1* p b irb(main):005:1* p c irb(main):006:0> end (irb):1: warning: Pattern matching is experimental, and the behavior may change in future versions of Ruby! 0 1 [2, 3] => [2, 3] irb(main):007:0>
なんで作ったのか
冒頭の繰り返しになって恐縮ですが, Amazon Linux に最新の Ruby がソースコードからインストールされている Docker コンテナが欲しくたまらなくって作ろうと思ったら, せっかくなので, https://www.ruby-lang.org/ja/downloads/ からダウンロード可能な Ruby バージョンがそれぞれインストールされているコンテナも作っちゃおうという流れになりました.
現在, 以下のように各バージョン毎にコンテナイメージを ECR に用意しております.
こだわり
以下の点にこだわって作りました.
- 自分なりに Ruby にこだわり, Ruby から Docker API を操作して Ruby 入りのコンテナを作るようにしました
- ということで, コンテナイメージを作るに際して docker コマンドは一切使っていません
- https://www.ruby-lang.org/ja/downloads/ の変更 (新バージョンの登録) をチェックして, 新しいバージョンがリリースされたらイメージを生成するようになっています
- CircleCI の
triggers
を使って夜間に実行させています
あと, aws ecr get-login --no-include-email --region ap-northeast-1
相当を Ruby の Docker API で実装することに骨が折れました.
def self.execute(build_image, params) # aws ecr get-login --no-include-email --region ap-northeast-1 相当 res = Aws::ECR::Client.new.get_authorization_token # username, password, server を取得 u = Base64.decode64(res.authorization_data[-1].authorization_token).split(':')[0] pw = Base64.decode64(res.authorization_data[-1].authorization_token).split(':')[-1] sv = res.authorization_data[-1].proxy_endpoint login!(u, pw, sv) params['sv'] = sv build_image = attach_tag(build_image, params) # Docker Push build_image.push do |v| begin log = JSON.parse(v) rescue log = v.to_s end $stdout.puts log end end
出来ること出来ないこと
出来ること
- Ruby がソースコードからインストールされた Amazon Linux コンテナがシュッと手に入ります
- 新しい Ruby バージョンがリリースされると, 一晩寝ている間にその Ruby バージョンがインストールされたコンテナが手に入ります
出来ないこと
自分がやりたかったことは網羅されているので, 出来ないことという言い方はあれですが, https://www.ruby-lang.org/ja/downloads/ で提供されているソースコードパッケージの URL 等が変わってしまったら都度対応が必要になるかもしれません...あと, Amazon Linux2 には対応していません.
以上
俺のギョームツールを紹介させて頂きました. 忘年会等お酒を飲む機会が増えますが, お体ご自愛くださいませ.