tokushima.rb 32 に参加して、CodeBuild 触ってみた

tokushimarb.connpass.com

娘っ子が金曜の夜に発熱し、土曜は夫婦揃ってグロッキー & 予定取り潰しだったのだけど、日曜には娘も元気になり、勉強会開場の近くでやっている「徳島マルシェ」にも行きたいねとなったので、一家で下山し少しマルシェでお昼を一緒に食べ、午後から 3 時間だけ勉強会の方に参加させてもらった。(その間娘と妻は実家に遊びに行かせてもらっていた。実家ありがたや。)

なんというかこの時期は山に住んでると花粉で生活に変調をきたす、、下山すると明らかにそれが和らぐので花粉飛散量が全然違うんだなと体感できる。。後少しの辛抱だ、、、でもこの時期は北海道か沖縄行きたい。。

そういえば、先月はプログラミング教室に参加していて、先々月はなんか用事でいけてなかったので、今年初参加なのであった。(というか年末も出張でいけてなかったから、結構久しぶり。。)

AWS CodeBuild 入門

今回はもくもく会だったので、さて何をやろうかぁとなったところで、ココ一ヶ月ぐらいインフラの人に「暇ができたらやります><」と恒例のなかなかできない事案になっていた CodeBuild を触ってみることにした。ちょうど Tokyo region に来たということもあり良いタイミング。

とりあえず成果

ちょろちょろ調べていたことを思い出しつつ、AWS Management Console をぽちぽちやったり、サンプル用の Rails app を作ったりで、なんとなく動くぐらいでタイムアップ。

でも、とりあえず以下のような感じで動作するところまではいけた。

  • MySQL を使ったテストを実行できる
  • poltergeist/capybara を使った feature spec が実行できる

まあ、日常的に業務で使う構成である。プラスで Redis とかもやりたかったがまあここまで。

内容

github.com

上記は基本的にただの Rails アプリなので、今回の本題である CodeBuild 用の設定ファイルだけ抜粋。

version: 0.1

environment_variables:
  plaintext:
    PHANTOM_JS: phantomjs-1.9.8-linux-x86_64
    DB_ROOT_PASSWORD: password
    DB_HOST: localhost
    DB_USER: mysql
    DB_PASSWORD: password
phases:
  install:
    commands:
      - wget https://bitbucket.org/ariya/phantomjs/downloads/$PHANTOM_JS.tar.bz2
      - tar xvjf $PHANTOM_JS.tar.bz2
      - mv $PHANTOM_JS /usr/local/share
      - ln -sf /usr/local/share/$PHANTOM_JS/bin/phantomjs /usr/local/bin
      - echo `phantomjs --version`
      - echo "mysql-server mysql-server/root_password password ${DB_ROOT_PASSWORD}" |debconf-set-selections
      - echo "mysql-server mysql-server/root_password_again password ${DB_ROOT_PASSWORD}" |debconf-set-selections
      - apt-get update -y
      - apt-get install -y nodejs
      - apt-get install -y mysql-server-5.6
      - service mysql start
      - mysql -p${DB_ROOT_PASSWORD} -e "create database project;"
      - mysql -p${DB_ROOT_PASSWORD} -e "GRANT ALL ON *.* TO '${DB_USER}'@'%' IDENTIFIED BY '${DB_PASSWORD}';"
  pre_build:
    commands:
      - echo "Starting prebuild"
      - bundle install --path vendor/bundler
      - echo "Finish bundle install"
      - RAILS_ENV=test bin/rails db:create db:migrate
      - echo "Finish db:migrate"
  build:
    commands:
      - echo "Starting build"
      - bin/rspec ./spec | tee output.log
artifacts:
  files:
    - output.log

基本的な部分と MySQL の部分はクラスメソッドさんのブログでほぼ完了。

Docker イメージとか使わずに、CodeBuild の Ubuntu のランタイム Ruby (2.3 系) を選択して使いました。bundler とかから全部入れないといけないかなぁと思ったけど、そんなことはなく、普通に bundle install は実行できた。

追加で行ったのは以下。

  • nodejs のインストール (therubyracer とか入れてないので実行環境として)
  • phantomjs (poltergeist の実行用)
    • 2 系じゃないのは、お恥ずかしながら某弊プロジェクトが未だに 1.9 系だから。。

artifacts に RSpec のログを置いているのは、CloudWatch のログがなんかどこで落ちてるのか微妙にわかりにくかったので入れました。

実際、チームで使ってる Jenkins と連携させるときに、結果参照するのにもまあ都合いいんじゃないかなと思ったりしてます。

一応 CloudWatch でどんな風に見えるか。これだとそんなですけど、たまに文字が辺に切れたりしてた。

f:id:dany1468:20170326225634p:plain

ここから進めたいこと

いろいろあるけど以下をやっていって実際のプロジェクトで使ってみることかなぁと。

  • 今回は buildspec.yml にパッケージのインストールから全部書いたが、最初から揃っている Docker イメージを用意しておいて、ビルド時間を短縮させたい
  • Pull Request Builder と組み合わせて、Pull Request 単位で CodeBuild のビルド開始をできるように
  • S3 オブジェクトのバージョン使って並列にビルドができる
    • 今だと build.zip という決め打ちのファイルに対してしかビルドが実行できないので、並列に Pull Request のビルドをさばきたいに対応できない。
    • S3 のバージョン情報をビルド実行時に指定できるのでそれでいけるらしい
  • その辺りを Jenkins Plugin でやってくれるようなので試したい
    • 実行結果とかをどうできるのかとかも調べていかないと

github.com

CircleCI とかでよくない?

そんな気もします。実際開発現場で使おうとなると、コストが安くなったところで今のエクスペリエンスより下がるときっと皆使ってくれない。。

現在は比較検討中ということでいろいろ触ってみてる感じ。

調査時に見たリンクなどなど

感想

「Serverless どうなの?」とか「 Android/iOS の CI どうしてるの?」という話しがアプリ開発もやっている参加者中心にされていて fmfm という感じでした。

アプリ開発の CI (特に iOS の方だけなのかもですが)は独特の難しさがあるんだなぁと思ったり、アプリ本業だとサーバー側をガリガリ開発ってのはそもそもやりたくない的な感じはやっぱあるんだなぁというのを思ったり。

自分はアプリ開発は全然やってきてないので、そういう全然知らない話しを聞いていると、やってみたいなぁと思うのでした。

今回は 3 時間とうい全体の半分ぐらいの時間だけの参加だったのですが、日常だと「娘っ子とご飯食べて、お風呂一緒に入って、妻がお風呂の間に洗濯物かたしたりしつつ、娘っ子と遊んで・・・」とやっていると、寝る前にちょっと時間を確保できるぐらいなので、3 時間がすごくまとまった時間に思えて良かった。

というか、仕事を毎日 8 時間ぐらいやってるんだから、きっと捻出できるはずなんだ。。なぜできないのかと振り返ってみたとき、チームのメンバー増加とコードレビュー時間の増加が比例してきている気がして、「どうしてこうなった!」感があるなと改めて感じたのでした。

あ、SideCI 様からステッカーいただきました!(先月協賛してくださっていたそうです 😇 )

仕事でもめっちゃ使ってます!

f:id:dany1468:20170326233044j:plain