ローファイ日記

出てくるコード片、ぼくが書いたものは断りがない場合 MIT License としています http://udzura.mit-license.org/

carrierモジュールで雑にHubotからコマンドを打つ

これは Hubot Advent Calendar 2014 - Adventar の 8 日目の記事です!!!111前日は id:bouzuya さんの 簡単な Hubot スクリプトをもっとつくろう (おみくじ系) - Qiita でした。



早速本題だが、チャットオップスで最初に思いつくのがコマンドをラップする!とかだろうけど、これが意外と考えることが多くて、

  • 実行時間が長いといつまでも帰ってこなくて不安では?
  • ログの扱いをどうする?

みたいな当たり悩ましい。

ここで、npmにcarrierと言うモジュールがある。


これは標準出力、標準エラー出力のストリームをつなげば、一行ずつイベントを発火してくれると言う代物。この一行ずつと言うのが大変便利で、使い方としてはこれだけで良い。

# Description:
#   例えば、 aws-cli のコマンドをhubotから叩く。
# 
# Configuration
#   AWS_ACCESS_KEY_ID - AWS アクセスキー
#   AWS_SECRET_ACCESS_KEY - AWS シークレットキー
#
# Commands:
#   hubot aws version - バージョン出す
#   hubot aws s3-ls   - aws s3 ls を叩く

carrier = require('carrier')
{spawn} = require('child_process')

runAwsCommand = (msg, args) ->
  env =
    AWS_ACCESS_KEY_ID: process.env.AWS_ACCESS_KEY_ID
    AWS_SECRET_ACCESS_KEY: process.env.AWS_SECRET_ACCESS_KEY
  cli = spawn '/usr/local/bin/aws', args, {env: env}
  cOut = carrier.carry(cli.stdout)
  cErr = carrier.carry(cli.stderr)
  cOut.on 'line', (l) ->
    msg.send l
  cErr.on 'line', (l) ->
    msg.send "error: #{l}"

module.exports = (robot) ->
  robot.respond /aws version/i, (msg) ->
    runAwsCommand msg, ['--version']

  robot.respond /aws s3-ls/i, (msg) ->
    runAwsCommand msg, ['s3', 'ls']

というかぶっちゃけ別にストリームは何でも良い。ログも、一行ずつ msg.send でフィードバックしているだけだが、適当なファイルやDBに突っ込んでもかまわないと思う。

まあこれで、とりあえずコマンド実行ログはチャッツでシャエーできる。チャッツオプスだ!

コマンドを雑に実行するにあたり、このcarrierレベルで使いやすいモジュールを、Rubyその他においてぼくは知らないのであった...。

蛇足: ChatOpsとぼくについて

続きを読む