INNOBASE技術ブログ

技術的なことエンジニア的なこと制作的なこと全般

【chatops】 サーバー上で簡単なcommandを実行するbotのサンプル

chatops便利ですね!
多人数開発を行うにあたって、共通環境でのオペレーションを同時多重に行う事故を防いだり
デザイナーやアプリエンジニアなどサーバーサイドの専門知識をもたないメンバーによる
安全なサーバー上でのオペレーションを実現できたりと弊社ではchatopsを活用しています。

HUBOTによるchatops少しノウハウが溜まってきたので、
サーバー上でコマンドを実行するテンプレート的なsampleとtipsをこちらの記事で公開します。

サンプルコード on GitHub

https://github.com/mr51/hubot_servercommand_template
こちらのsampleはnodejsがインストールされている環境ですぐに動作させられます。

サンプルコード

# Description
#   hey yo! script.  
#   heyと呼びかけるとyoと返事します。
#   返事はechoでサーバー上で実行した結果です。
#   shellのコマンドを組み替えることでサーバー上で処理を行うbotのテンプレートです。
# Commands:
#   hey
child_process = require 'child_process'

module.exports = (robot) -> 
    robot.respond /^hey/i, (msg) ->
        command = "echo \"yo\";"
     
        msg.send "実行します。\n===================================\n"
        command += ";echo \"==================================\""
        command += ";echo \"実行しました\""
        child_process.exec command, (error, stdout, stderr) ->
            msg.send stderr
            msg.send stdout

Tips

child_process を使えばコマンド実行できる!

あとはshellが使えればやりたい放題ですね!

commandの自然さ重要
@deploybot deploy staging
deploy staging

上のコマンドを当初採用していましたが、多くのメンバーが@deploybotを忘れるので下のコマンドに変更しました。
bot名との組み合わせでコマンドが決まりますが、自然に思えるコマンドになるように意識するとストレスが無くなります。

msg.send は順番を保証しない

API開発全般に言えることですが、msg.send は順番を保証しません、短い時間でメッセージをpostした時postした順番にメッセージがチャット上に表示されないことが良く起こります。(※筆者hipchat環境)
順番を保証したい場合、一回のsendで改行を利用したり、sampleのようにサーバー上のコマンドにメッセージ出力を任せたりと工夫が必要になってきます。