こんにちは、小野寺です。
私が所属しているグループでは、開発用のチャットツールにSlackを使っています。
Slackは多くのサービスとの連携が提供されている魅力的なツールです。
そこで前から気になっていた、ChatOpsをはじめてみました。
ChatOpsは簡単に言うとチャット上にbotを用意して、そのbotにチャットで呼びかけるとbotがいろいろやってくれるというものです。
今回は、SlackとHubot、そしてGitLabを使ってChatOpsしてみたいと思います。
※SlackとHubotの連携については割愛します。(ほとんど設定いらないです)
実装するのは次の2つの機能です。
- ブランチの作成
- マージリクエストの作成
GitLabはAPIを提供しているので、HubotでGitLabAPIを使って実現したいと思います。
HubotはNode.jsで作られているので、npmのモジュールが使えます。
今回は、GitLabAPIをNode.jsで使えるgitlabモジュールを利用します。
1 2 3 4 5 6 7 8 9 10 11 |
# Connection gitlab = (require 'gitlab') url: 'http://example.com' token: 'abcdefghij123456' module.exports = (robot) -> # Listing users robot.respond /gitlab users all/i, (msg) -> gitlab.users.all (users) -> msg.send "##{user.id}: #{user.email}, #{user.name}, #{user.created_at}" for user in users |
この時は、HubotでGitLabAPI使うのなんて楽勝だなとか思っていました。。。
よし、ブランチ作成とマージリクエストも同じように実装しよう!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
# Branchの作成 robot.respond /gitlab create branch (.*) from (.*) on (.*)$/i, (msg) -> branch_name = msg.match[1].trim() ref = msg.match[2].trim() project_id = msg.match[3].trim() params = {projectId: project_id, branch_name: branch_name, ref: ref} msg.send "branch 「#{branch_name}」 を作っています。" gitlab.projects.repository.createBranch params, (branch) -> if branch? msg.send "「#{branch.name}」 が作れられました。" else msg.send "「#{branch_name}」 を作れませんでした。" # MergeRequestの作成 robot.respond /gitlab merge_request (.*) to (.*) on (.*) who (.*) title (.*)$/i, (msg) -> source_branch = msg.match[1].trim() target_branch = msg.match[2].trim() project_id = msg.match[3].trim() assignee_id = msg.match[4].trim() title = msg.match[5].trim() msg.send "merge request 「#{title}」を作っています。" gitlab.projects.merge_requests.add project_id, source_branch, target_branch, assignee_id, title, (merge_request) -> if merge_request? msg.send "「#{merge_request.title}」 が作れられました。" else msg.send "「#{title}」 を作れませんでした。" |
実装してみて気づきました。あれ、コマンドがめっちゃ長くなってる?
1 2 3 4 5 6 7 |
#ブランチ作成 mybot gitlab create branch issue-12345 from develop on 1 mybot gitlab merge_request [新しいブランチ] from [元ブランチ] on [プロジェクトID] #マージリクエスト mybot gitlab merge_request issue-12345 to develop on 3 who 1 title バグの修正 mybot gitlab merge_request [ソースブランチ] to [ターゲットブランチ] on [プロジェクトID] who [アサインID] title [タイトル] |
な、長い。。。GitLab上で操作したほうが(ry
しかも、プロジェクトIDとかアサインIDとか混ざっちゃってます。。。
このままでは誰も使ってくれないので、次のような方針を決めました。
- ブランチ作成時の 元ブランチ を デフォルトブランチ に限定(自動)
- マージ先の ターゲットブランチ を デフォルトブランチ に限定(自動)
- GitLabのプロジェクトをSlackのChannelとヒモ付(別途登録)
- アサインユーザーを Slackのユーザーで選択可能に (別途登録)
- コマンド自体も短く!
これらをふまえた結果、使ってもいいかなくらいのレベルに短くなりました。
1 2 3 4 5 6 7 8 |
#ブランチ作成 mybot git BR issue-12345 mybot git BR [ソースブランチ] #マージリクエスト mybot git MR issue-12345 @onodera.shunya バグの修正 mybot git MR [ソースブランチ] @[Slackユーザー名] [タイトル] ※Slackでは@を入力するとユーザー選択補助が使えます! |
Slackの情報とGitLabの情報の登録には、expressというNode.jsのWebアプリケーションフレームワークでWebフォームを作り、Redisに保存という方法で実装しました。ここで登録する情報にはGitLabのプライベートトークンも含まれるので、チャット上からの登録を避ける意味もあります。
今回は、GitLabの操作をChatOpsでやってみました。
引き続きbotを育てていきたいと思います!