kakakakakku blog

Weekly Tech Blog: Keep on Learning!

社内イベントで「ガジェット紹介と Infrastructure CI の話」という謎の LT をした

今日は社内イベントで LT をする機会があって「ガジェット紹介と Infrastructure CI の話」という謎のタイトルで話してきた.せっかくの LT 枠だからネタ要素多めにしようと思ってて,前半のガジェット紹介は全てネタで突っ走った.結構ウケてて良かったなと思うけど,想定以上に時間が余ってしまって,blink(1) で実装した LT タイマーと合わせて終わろうと予定していたところは失敗してしまった.LT だと全然時間が無くて話せなかったため,詳細をまとめておこうと思う.

LT 資料

前半戦 : ガジェット紹介

f:id:kakku22:20160629163444p:plain

腕に Myo を装着して,指に Ring ZERO を装着して,blink(1) を緑に光らせて登場した.予定通りの出落ち感でザワザワしてた.Myo を使って Keynote を操作する場合,親指と中指でダブルクリックをする必要があって,デモをしたら1回目は動かなくて笑った.結論として LT のようなスピード感が求められる場には Myo は適してなくて,途中からは愛用してる R800 を使う宣言もしたw

あと blink(1) を使って LT タイマーを動かすデモもした.最初は緑になって,ラスト1分で黄色く,ラスト10秒で赤く点滅する実装になっている.既に Gem として公開していて,前にも LT で使ったことがある.

github.com

後半戦 : Infrastructure CI の話

基本的には以前ブログに書いた以下の記事をベースに話をしたんだけど,現在は RuboCop と Foodcritic を実行するようになっていて,その点に関する工夫点をまとめておこうと思う.

kakakakakku.hatenablog.com

モチベーション

数ヶ月前から Chef リポジトリをメインで運用することになって,個人的に RuboCop や Foodcritic を使って日々改善しながらリファクタリングをしていたんだけど,せっかくなら CI を回して見える化しようと思い立って組み込んだ.あと同僚からプルリクが出たときに [nits] で指摘するのも心苦しく,静的解析はもう全て自動化してしまおうという気持ちもあった.

ちなみに RuboCop に関しては,エラーが 1000 件以上もあって,手動で直すレベルではなかったため -a/--auto-correct オプションを使って自動で修正した.さらに --only オプションを使うと指定した Cop だけを自動で修正できるため,影響を抑えながら進めることができる.

全体構成図

f:id:kakku22:20160628235933j:plain

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 は楽しすぎる!継続的にアウトプットしてこうという気持ち :)