今日は社内イベントで LT をする機会があって「ガジェット紹介と Infrastructure CI の話」という謎のタイトルで話してきた.せっかくの LT 枠だからネタ要素多めにしようと思ってて,前半のガジェット紹介は全てネタで突っ走った.結構ウケてて良かったなと思うけど,想定以上に時間が余ってしまって,blink(1) で実装した LT タイマーと合わせて終わろうと予定していたところは失敗してしまった.LT だと全然時間が無くて話せなかったため,詳細をまとめておこうと思う.
LT 資料
前半戦 : ガジェット紹介
腕に Myo を装着して,指に Ring ZERO を装着して,blink(1) を緑に光らせて登場した.予定通りの出落ち感でザワザワしてた.Myo を使って Keynote を操作する場合,親指と中指でダブルクリックをする必要があって,デモをしたら1回目は動かなくて笑った.結論として LT のようなスピード感が求められる場には Myo は適してなくて,途中からは愛用してる R800 を使う宣言もしたw
- Myo Gesture Control Armband | Wearable Technology by Thalmic Labs
- Ring ZERO by Logbar
- blink(1) – the USB RGB LED notification light
あと blink(1) を使って LT タイマーを動かすデモもした.最初は緑になって,ラスト1分で黄色く,ラスト10秒で赤く点滅する実装になっている.既に Gem として公開していて,前にも LT で使ったことがある.
後半戦 : Infrastructure CI の話
基本的には以前ブログに書いた以下の記事をベースに話をしたんだけど,現在は RuboCop と Foodcritic を実行するようになっていて,その点に関する工夫点をまとめておこうと思う.
モチベーション
数ヶ月前から Chef リポジトリをメインで運用することになって,個人的に RuboCop や Foodcritic を使って日々改善しながらリファクタリングをしていたんだけど,せっかくなら CI を回して見える化しようと思い立って組み込んだ.あと同僚からプルリクが出たときに [nits] で指摘するのも心苦しく,静的解析はもう全て自動化してしまおうという気持ちもあった.
ちなみに RuboCop に関しては,エラーが 1000 件以上もあって,手動で直すレベルではなかったため -a/--auto-correct
オプションを使って自動で修正した.さらに --only
オプションを使うと指定した Cop だけを自動で修正できるため,影響を抑えながら進めることができる.
全体構成図
circle.yml
前回とあまり変わってなく,Ruby バージョンを指定したり,RuboCop と Foodcritic を実行する点が変わっている.
machine: services: - docker ruby: version: 2.3.1 timezone: Asia/Tokyo dependencies: override: - docker info - docker build -t xxxxx . test: override: - sh /home/ubuntu/xxxxx/spec_scripts/rubocop.sh - sh /home/ubuntu/xxxxx/spec_scripts/foodcritic.sh - docker run -it xxxxx sh /chef/spec_scripts/spec.sh
spec_scripts/rubocop.sh
もう circle.yml
に直接書いても良いレベルだけど,Foodcritic と合わせる意味でシェルにした.
#!/bin/sh cd /home/ubuntu/makuake-chef bundle install rubocop cookbooks
spec_scripts/foodcritic.sh
Foodcritic の場合は少し複雑になってしまっている.何故かと言うと Foodcritic は実行時に常に 0 を返すために CircleCI の結果が Success になってしまう.よって,ある意味ワークアラウンド的に結果をログに吐いて,ログのファイルサイズから Foodcritic の指摘が出ているかを判定している.
#!/bin/sh cd /home/ubuntu/makuake-chef bundle install foodcritic cookbooks -t ~FC007 -t ~FC008 -t ~FC031 -t ~FC045 -t ~FC048 -t ~FC064 -t ~FC065 | tee /tmp/foodcritic.log # 標準出力の結果が2バイト以上の場合、エラーが存在する # foodcritic はエラーが存在する場合も 0 を返すため CircleCI で正常終了と判定されてしまう if [ $(cat /tmp/foodcritic.log | wc -c | awk '{print $1}') -gt 1 ]; then exit 1
まとめ
やっぱり LT は楽しすぎる!継続的にアウトプットしてこうという気持ち :)