Bye, tachikoma gem #railsdm

tachikoma gemはdeprecatedです! tachikoma.ioはもうちょっとだけ続くんじゃ。さねまつです。

Rails Developers Meetup #4にご参加いただきありがとうございます。会場提供しました。そこで、Bye, tachikoma gemというLTをしました。

重要

  • tachikoma gemはdeprecatedです!
  • tachikoma.ioはもうちょっとだけ続くんじゃ

あとは思い出話です。

tachikoma gemが解決したかった問題

しょっちゅうbundle updateしていかないと、つらい。もうバージョン上げられない。あるある。
昔ならともかく、最近はみんなわかってる。いろんな脆弱性もでるし。わかってなかった人はわかって持って帰ってください。ただ、結構めんどくさい。

tachikoma gem

bundle updateしてpull requestを送ってくるライブラリ gem。これを定期的に実行。人はmergeボタンをポチるだけ。

jenkins and pull request

もとのアイデアは刺身ブーメランさんのrubykaigi 2013の発表です。

gemの依存をjenkinsとpull requestで定期的に「継続して」半自動bundle updateやっていくぞ。

いい言葉

継続して前進することが、重要です。
私たちにはそれが出来ます。
— ながえけんすけ

tachikoma next

このpainを解決するためにtachikoma gem を作ったけど、いろいろ課題が出てきてdeprecateだぞ!って、今回の資料を作ろうと自分の過去の資料を見直していたら、まさに今日話そうとしている内容のスライドが出てきた???

tachikoma next ?? しかも2015年12月??
どうもこの資料作り覚えがある気がしたんだよ!!

  • tachikoma gemはしにつつあるので、shell scriptかruby scriptでかけ
  • 必要なツールは用意した

気にせず続けます。もちろんそれだけだとアレなので、マネーフォワード社でどうしているかが、プラスアルファです。

tachikoma gem

思い出話に戻ると、半自動のbundle update、各プロジェクトで同じことやるんだから、共通コードはgemにして、差分の設定だけ持てばいいじゃん。この発想がtachikoma gemです。

刺身さんの発表の翌月にある程度動くv2.0.0をコミットしてます。刺身さんのスクリプトをv1とする、みたいなバージョニングでした。

上位のコントリビューター

虎の威を借る狐です。いろんな方が開発に参加してくれました。

それもあって、bundlerだけでなく、carton, composer, cocoapods, yarnなどの対応が進みました。あとオプションが増えたりとかテスト書きやすくクラス構造にしたりとかそういうの。

tachikoma.io

個別に設定書いて自前でホストするのめんどいわ。という声が多くて、2014年9月に
tachikoma gemのweb service版 tachikoma.ioをリリースしてます。

tachikoma gem なぜdeprecated

bundle updateしなくなったかというと、そうではありません。

マネーフォワードの場合

マネーフォワードでもこんなpull requestを(プロジェクトによっては)定期的に来るようにしています。

diffみて自動でチェックボックス出して、テストも走って、merge。

tachikoma って名前がついてるけど、tachikoma gemは使っていません。

tachikoma kun

こんなのが頑張って動いています。いろいろ変えたいときに限界があるので。

#!/bin/bash

if [[ ! $BUILD_FOR =~ ^[-_0-9a-zA-Z]+$ ]]; then
  echo 'Invalid $BUILD_FOR.'
fi

if [ ! $BASE_REMOTE_BRANCH ]; then
  BASE_REMOTE_BRANCH=origin/master
fi

if [ ! $PULL_REQUEST_BASE ]; then
  PULL_REQUEST_BASE=master
fi

if [ ! $TACHIKOMA_KUN_PATH ]; then
  TACHIKOMA_KUN_PATH=$PWD
fi

if [ ! $GITHUB_OWNER ]; then
  GITHUB_OWNER=moneyforward
fi

REPOSITORY_PREFIX=https://$GITHUB_ACCESS_TOKEN:x-oauth-basic@github.com/$GITHUB_OWNER
PULL_REQUEST_TITLE='Exec tachikoma kun update'

REPOSITORY_PATH=repos/$BUILD_FOR
REPOSITORY_URL=$REPOSITORY_PREFIX/$BUILD_FOR.git
FORKED_REPOSITORY_URL=${REPOSITORY_URL//$GITHUB_OWNER/$GITHUB_ACCOUNT}

cd $TACHIKOMA_KUN_PATH

if [ -d $REPOSITORY_PATH ];then
  rm -fr $REPOSITORY_PATH
fi

git clone $REPOSITORY_URL $REPOSITORY_PATH
cd $REPOSITORY_PATH

HEAD_DATE=$(date +%Y%m%d_%H-%M-%S)
HEAD=tachikoma/update-$HEAD_DATE

git config user.name $COMMITER_NAME
git config user.email $COMMITER_EMAIL
git checkout -b $HEAD $BASE_REMOTE_BRANCH

export BUNDLE_PATH=./vendor/bundle
export BUNDLE_BUILD__LIBV8=--with-system-v8
export BUNDLE_BUILD__THERUBYRACER=--with-v8-dir
bundle update $BUNDLE_UPDATE_GEMS

git add Gemfile.lock
git commit -m "Bundle update $HEAD_DATE"

export BUNDLE_GEMFILE=$TACHIKOMA_KUN_PATH/Gemfile

# 名前つけないとhttps with tokenでpushできなかったので一旦名前つけている
# 後続の処理で余計なremote urlがあるとoriginにPRしてくれないので、すぐに消す
git remote add forked $FORKED_REPOSITORY_URL
bundle exec git httpsable-push forked $HEAD
git remote remove forked

bundle exec pull-request-create \
  --title="$PULL_REQUEST_TITLE $HEAD_DATE" \
  --base=$PULL_REQUEST_BASE \
  --head=$GITHUB_ACCOUNT:$HEAD

# check Gemfile.lock diff
git diff --name-only $BASE_REMOTE_BRANCH \
 | grep ".*[gG]emfile.lock$" || RETURN_CODE=$?

case "$RETURN_CODE" in
  "" ) echo "found" ;;
  "1" )
    echo "not found"
    exit 0 ;;
  * )
    echo "Error"
    exit $RETURN_CODE ;;
esac

# Post comment with CompareLinker
git diff --name-only $BASE_REMOTE_BRANCH \
 | grep ".*[gG]emfile.lock$" \
 | xargs bundle exec compare-linker-wrapper --base $BASE_REMOTE_BRANCH \
    --formatter CompareLinker::Formatter::Markdown \
 | bundle exec text-to-checkstyle \
 | bundle exec saddler report \
    --require saddler/reporter/github \
    --reporter Saddler::Reporter::Github::PullRequestComment

ヒエー

パーツは作った

個別事情にいろいろ対応していくのが無理ゲー。必要なパーツパーツは作ったから、そっち使ってくれ! というのがtachikoma gem deprecatedの理由です。

定期的にライブラリの依存関係をアップデートしてPull Requestする – Saddler – checkstyle to anywhere

パーツは作ったから、そっち使ってくれ!

重要

  • tachikoma gemはdeprecatedです!
  • サービスは自分で使っても便利なので、tachikoma.ioはもうちょっとだけ続くんじゃ

appendix

saddler gem 流行らなかった話

みんな haya14busa/reviewdog: A code review dog who keeps your codebase healthy つかえ!
golang製で便利です。

問題意識

いろんなツールが成果物をgithubのpull requestにコメントしたがる。
みんなバラバラ。めんどくせ。

saddler gemはjavaのcheckstyle形式が読めて、それでpost出来ます。簡単。ツールによって、formatterをcheckstyleで、ってだいたいある。

reviewdogはvimのdiff形式?とgolintの形式と、checkstyle形式などが読める。便利ですね。

使い方の教え方

なんで負けたんだろ、って考えると、一つには使い方の教え方がありました。

saddler gem -> パイプで便利やで
reviewdog -> design docs

reviewdogにはdesign docsがあって、reviewdogがなんであってなんでないか、何に注力するか、何をしないか、が書いてあります。コレイイナー。

saddler gem -> reviewdogはcheckstyle formatでそのままいけるので、何も変えずに乗り換えられそう(乗り換えたことはまだない)。移行してみたエントリ reviewdogを使ってtextlintの結果をPull Requestに書き込む方法 – Qiita もあります。

jenkinsの
GitHub pull request builder pluginというのがあって、中でごちゃごちゃやっていてそれの対応めんどかったので、そのplugin使ってる人は、saddler使うとマダいいのかもしれない。reviewdogも動くかもしれないけど。

ツールの言語選定

rubyで作って辛かったこと。
fluentdみたいにplugin出来る環境に作ったつもりだけど、だれもpluginなんてつくらなかった!
とくにrubyプロダクト以外で使う場合がつらい。
bundle installでどっかでコケる 。
travis-ciはrubyプロダクト以外の場合ruby1.9。

golangで書いたら良かったんじゃないか。
そっちだったらヒットしてたんじゃないか妄想。
2017にrubyで書いててもmastodonみたいに爆発するケースもある。

要はプロダクトの魅力やんけ!

nodejsも自分でツール作りおわるまでは最高便利けど、色んな人のところで使ってもらうにはうんざりじゃ、という個人の感想です。

Evolution of the Heroku CLI

そんななか!

Evolution of the Heroku CLI: 2008-2017

HerokuがCLIツールをGo実装からPure Node.js実装に変更した話。GoはOS更新の影響でネットワーク周りの問題が起きがちだったりクロスコンパイルが辛かったとのこと b.hatena/teppeis

な、なんだってー

tachikoma gem はもう使わないほうがいいのか

Q. 何か不具合があるとか、もう動かないとか、ありますか。
A. まだまだ使えます! が特に積極的にメンテナンスしていく気がないです。緩やかに移行していってほしい

たとえば、bundle updateするときに、bundlerの仕様が変わって、Gemfile.lockBUNDLED_WITHを書くようになったケース。
packsaddle/ruby-restore_bundled_with: Restore BUNDLED WITH section in Gemfile.lock from git repository. こんなの書いてtachikoma gemから呼ぶようにしているが、こんなの次々書いてられないっす…

bundler v2.0対応のコードは大昔に入れたからそれは動くはず(タブン)。

以上デース

最後に

マネーフォワードでは、エンジニアを募集しています。
ご応募お待ちしています。

【採用サイト】
マネーフォワード採用サイト
Wantedly | マネーフォワード

【プロダクト一覧】
自動家計簿・資産管理サービス『マネーフォワード』
Web
iPhone,iPad
Android

ビジネス向けクラウドサービス『MFクラウドシリーズ』
会計ソフト『MFクラウド会計』
確定申告ソフト『MFクラウド確定申告』
請求書管理ソフト『MFクラウド請求書』
給与計算ソフト『MFクラウド給与』
経費精算ソフト『MFクラウド経費』
入金消込ソフト『MFクラウド消込』
マイナンバー管理ソフト『MFクラウドマイナンバー』
資金調達サービス『MFクラウドファイナンス』

メディア
くらしの経済メディア『MONEY PLUS』

Pocket