おはようございます。この記事ははてなエンジニアアドベントカレンダー2017の25日目の記事です。昨日は id:alpicola さんによる 社内で機械学習ハッカソンを開催しました でした。
サービスのデプロイをはじめとして、チーム内の開発者が共通して担当すべき業務というのはさまざまに存在し、基本的に定型化されているものですが、開発者が手元で実行するなど自動化までは行えていないような場合、以下のような点が問題になります。
- 作業履歴が共有されない
- 同様に作業中に意図しない不具合が生じた場合、エラーログが実行した環境にしか残らない
それぞれ、デプロイのタイミングを Mackerel や Slack に投稿して共有する、Gist にエラー時のログを貼るなど、チームに合わせた方法が存在していることと思います。また作業環境を同一にするため、チームにデプロイサーバを用意して作業はそこで行う、という方法も考えられますね。
はてなでもいろいろな方法でこれらへの対処をおこなっているわけですが、シンプルかつ統一された方法でこの共有を行いたいと思い、手元の実行ログを Git 経由で共有するコマンドとして furoshiki というものを作りました。薄いラッパーってことで風呂敷です。いちど作り直したので名前が furo2 になってます……。
ちょっとした調査やスクリプトの実行ログも、このコマンドを経由すれば特に設定の必要もなく共有できるところがポイントになってます。
初期設定 & コマンドの実行
インストール は Homebrew か pip で行えます(いつもは Go で書いてますが、proxychains 下で動かしにくいのと、困ったときにデバッグ&ハックがやりやすいようにと思って Python を使ってみました)。
% brew install --HEAD motemen/furoshiki2/furoshiki2
% pip3 install git+https://github.com/motemen/furoshiki2
さて、最初に一度だけ行うべき設定として、ログリポジトリの指定を行います。組織内で共有する、ログ用のリポジトリを一つ作ったら、環境変数 FURO_LOGS_REPOSITORY
を push 可能な Git のリモートに設定してやります:
# .zshrc
FURO_LOGS_REPOSITORY=git@github.com:motemen/furo-logs-example.git
これで完了。あとは適当な Git リポジトリのワークツリー内で furo2 exec
コマンドを実行すれば:
% furo2 exec COMMAND ...
実行したコマンドと内容がログ用のリポジトリにコミット & push されます。例えば上記設定で、motemen/test-repository 内で furo2 exec whoami
を実行したコマンドのログが https://github.com/motemen/furo-logs-example/commit/db45e1992a787814564ba9d58b4df18e4f9691f3 になります。
ログの閲覧
ログの閲覧も furo2 history
コマンドでターミナル上から行えます。ここでは分かりませんが色もつく。
% furo2 history # 履歴一覧を表示 6d8eeba [2017-12-25 12:34:07 +0900] (motemen) git status -sb db45e19 [2017-12-25 12:05:40 +0900] (motemen) whoami
% furo2 history show # 最新の実行ログを表示 command: ["git", "status", "-sb"] user: motemen repoPath: github.com/motemen/test-repository projectPath: github.com/motemen/test-repository gitRevision: b7e19f710a1727dd49b0ae9673267fa5f3bc5ced furoVersion: 2.0.0-alpha exitCode: 0 --- ## master...origin/master [behind 2] M .git-pr-release
ログを残したり表示したりするのに Git を使ってるので、furo2 history show HEAD~1
などとすれば一つ前のログも見られるような感じになってます。
たぶんこんなふうにしたら手元で動きを確認できると思います。
% git clone https://github.com/motemen/test-repository.git % cd test-repository % # push 権限がないので exec は失敗するけど、履歴の閲覧はできる % export FURO_LOGS_REPOSITORY=https://github.com/motemen/furo-logs-example.git % # 手元にログがないので最初に pull します % furo2 history pull % furo2 history show
仕組み
大雑把な流れはこんな感じ:
- どこかのリポジトリ(たとえば https://github.com/motemen/test-repository)のワーキングツリー内で furo2 exec COMMAND [ARGS...] する
- と、~/.furo2/logs/github.com/motemen/test-repository/YYYYmmdd_HHMMSS にログが書かれる
- これがログリポジトリの github.com/motemen/test-repository ブランチに push される
furoshiki では作業ディレクトリが何らかの Git リポジトリのワークツリーになっていることを期待しますが、これをログリポジトリのブランチ名として利用します。
たとえば https://github.com/motemen/test-repository.git
リポジトリにおける作業ログであれば、ログリポジトリには対応するブランチとして github.com/motemen/test-repository
ブランチが作られ、そのコミットログが作業ログにそのまま対応する、というような形です。furo2 history
は、カスタマイズされた git log
を呼び出しているだけ。
ログリポジトリのクローンは ~/.furo2/logs/<repo_path>
に作られ、ここで作業ログのコミットや push、pull が行われています。なので履歴が何かしらおかしくなったらここを削除すればオッケー(furo2 history fix
でも行えます)。
作業ログの記録自体は、script
コマンドを使ってファイルに書き出しているだけです。それに実行者やコマンドなどのメタ情報を加えたいちファイルをコミットするような感じ。
以上
作業ログ共有のシンプルなインタフェースとしての furoshiki の紹介でした。
とくに多くのリポジトリを触る必要があるチームにあっては、(プロセスを整えていく必要があるのは当然として、)先人がどのような作業を行ってきたかを参照できるのは大変重宝します。
GitHub の webhook を使えば Slack 連携も容易で、おすすめです。
以上、はてなエンジニアアドベントカレンダーでした。これまでのエントリの一覧は Qiita でも確認できます ので、冬休みのおともにお楽しみください。それではよいお年を!