blog.waterlow.work

Ruby, Rails, js, etc...

Ruby1.8.7の動く環境を探す&構築する

久しぶりにるびまRubyコード添削回を読んでいて、コードを手元で動かしたくなった。

magazine.rubyist.net

Ruby3.2で動かしてみたところエラーになったり明らかに想定していない挙動になったりという感じで挙動を確かめられなかったので、当時の環境を再現してコードを動かしたくなった。

Rubyバージョンの特定

記事の初稿は2005年とある。「ruby 2005」と調べるとruby-lang.orgのニュースのアーカイブページが出てきた。

2005年のアーカイブ

2005/12にRuby 1.8.4がリリースされたようだ。ひとまずパッチバージョンまではこだわらないことにして(この頃のRubyだとこだわったほうがいいかもと言うのが一瞬頭をよぎったが)Ruby 1.8.7が動く環境を得ることを目標にした。

rbenvを用いたmacosへのインストール

(エラー内容をコピーするのを忘れたが)よくわからないエラーがでた。もともとmacのローカル環境でシステムライブラリをいじりたくはなかったので早々にmacローカルへのインストールはあきらめた。

dockerイメージを探す

次に思いついたのはdockerによる環境構築だ。しかしながらdockerの公式のイメージにRuby2.6以前のものは置いていない。
ぐぐってみたところ以下のようなdocker imageやDockerfileがヒットしたので動作をみてみることにする。

github.com github.com

okyada/dockerhub-ruby

github.com

FROM centos:7

RUN yum update -y
RUN yum install -y mariadb-devel make gcc gcc-c++ openssl-devel readline-devel libcurl-devel libxml2-devel libxslt-devel

ENV INSTALL_PATH /app
RUN mkdir -p $INSTALL_PATH
WORKDIR $INSTALL_PATH

RUN yum install -y wget patchutils patch
RUN wget https://cache.ruby-lang.org/pub/ruby/1.8/ruby-1.8.7-p374.tar.gz
RUN tar zxvf ruby-1.8.7-p374.tar.gz

RUN cd ruby-1.8.7-p374 && \
  wget -O - "https://github.com/ruby/ruby/commit/0d58bb55985e787364b0235e5e69278d0f0ad4b0.patch" | sed -e '1,/Remove unused variable/d;/test_pkey_ec.rb /,$d'  | patch -p1 && \
  ./configure && make && make install

WORKDIR $INSTALL_PATH
RUN (echo 'gem: --no-document' ; echo 'install: --no-document --no-ri --no-rdoc' ; echo 'update: --no-document --no-ri --no-rdoc') > ~/.gemrc
RUN wget https://rubygems.org/rubygems/rubygems-2.6.12.tgz
RUN tar zxvf rubygems-2.6.12.tgz
RUN cd rubygems-2.6.12 && ruby setup.rb
RUN gem install bundler -v 1.8.7

RUN rm -rf $INSTALL_PATH

なんとbuildしてみたところ動いた!gem install bundlerのところでもともとはバージョン指定してなかったが、エラーになったのでバージョン指定する。
centos7というかそもそもdockerのベースイメージにcentosを使っているのが少し気になり、もう一方も試してみる。

silvioqdockers/ruby-1.8.7

github.com

FROM debian:jessie

RUN DEBIAN_FRONTEND=noninteractive apt-get update \
  && apt-get -y -q install \
  autoconf \
  bison \
  build-essential \
  curl \
  git-core \
  imagemagick \
  libsqlite3-dev \
  libcurl4-gnutls-dev \
  libmagickwand-dev \
  libmysqlclient-dev \
  libreadline6-dev \
  libssl-dev \
  libxml2 \
  libxslt1-dev \
  libyaml-dev \
  memcached \
  mysql-client \
  subversion \
  wget \
  zlib1g \
  zlib1g-dev \
  && rm -rf /var/lib/apt/lists/* \
  && wget -q -O ruby-1.8.7-p374.tar.gz http://cache.ruby-lang.org/pub/ruby/1.8/ruby-1.8.7-p374.tar.gz  \
  && tar xf ruby-1.8.7-p374.tar.gz   \
  && cd ruby-1.8.7-p374  \
  && ./configure \
  && make \
  && make install  \
  && ldconfig \
  && cd - \
  && rm -fr ruby-1.8.7-p374.tar.gz ruby-1.8.7-p374 \
  && ruby -v  \
  && git clone https://github.com/rubygems/rubygems.git \
  && cd rubygems \
  && git pull origin --tags \
  && git checkout v1.8.30 \
  && ruby setup.rb \
  && cd -  \
  && rm -fr rubygems

こちらも問題なくうごいてしまった。
ただこちらも、debianではあるもののjessieを使っていて古い。しかしながらstretchに上げてみたところエラーとなってしまった。ライブラリが存在しないエラーを一通り解消したらRubyコンパイルまではすすんだが、openssl系のエラーで落ちてしまった。おそらくokyada/dockerhub-rubyにあるようになんらかpatchを当てないといけないのだが、全く同じようにしてやってみてもだめだった。

成果

  • Ruby 1.8.7がなんとなく動く環境を手に入れた。
  • 最新のOSにRuby 1.8.7を入れるのは難しい事を知った。rbenvを入れたほうが近道だったかも。
  • 自分がDockerfileを雰囲気で書いていることを知れた。

おまけ

Ruby1.8のころはString#mapというのがあったことを知りました。