ようへいの日々精進XP

よかろうもん

お客様の中に Ruby がソースコードからインストールされた Amazon Linux コンテナはいらっしゃいませんか?

tl;dr

Amazon LinuxRubyソースコードからインストールされているコンテナが欲しくなって, https://www.ruby-lang.org/ja/downloads/ でダウンロード出来る Ruby がインストールされているコンテナイメージを夜な夜な自動的に作ってくれる仕組みを作っていたのを思い出したので振り返りを兼ねて書きます.

YAMAP エンジニア Advent Calendar 2019 の 11 日目の記事になる予定です.

qiita.com

俺のギョームツール

oreno-amazonlinux-ruby

github.com

$ tree .
.
├── Dockerfile
├── Gemfile
├── Gemfile.lock
├── README.md
├── lib
│   ├── build.rb
│   └── delivery.rb
└── rubuild.rb

1 directory, 7 files

ちょっと手元で Ruby 入り Amazon Linux が入ったコンテナで検証したいなーって時に役立っています. 試しに, 以下の記事を参考にさせて頂き, Ruby 2.7 から導入予定とされているパターンマッチを試してみた様子となります.

developer.feedforce.jp

$ 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 に用意しております.

f:id:inokara:20191210234510p:plain

こだわり

以下の点にこだわって作りました.

  • 自分なりに 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 には対応していません.

以上

俺のギョームツールを紹介させて頂きました. 忘年会等お酒を飲む機会が増えますが, お体ご自愛くださいませ.