Chatbotを入れてちょっと改善した話

こんにちは、naoです(YOUTRUSTアカウントTwitterアカウント)!

最近新たな趣味として、バイクを始めました。

道の駅おばあちゃん市・山岡にツーリング

色々な場所へツーリングしたいと思っています😃


今回は、Chatbotを使ったちょっとした社内の改善について書きたいと思います。

何に困っていたのか

YOUTRUSTにも本番環境と同じ構成の、ステージング環境があります。(YOUTRUSTではSandbox環境という名前)

AWSのCodePipelineでデプロイする仕組みになっていて、ステージング環境にデプロイするには、特定のブランチに各メンバーが直接pushする形になっていました。 そのため 誰が使っているのか何がデプロイされているか がすぐに分からない状態でした。

開発メンバーが増えてきた為、 現在ステージング環境は使われているのか?何がデプロイされているのか? 等の情報を知りたいケースが増えてきて、都度Slackで全員にそのことを聞いたりする事が、ちょっと面倒だなぁという感じになっていました。

また、別ブランチへ間違えてpushしてしまうなどのケースも避けたかったので、変わりにpushしてデプロイしてくれるChatbotを作ることにしました。

作ったもの

主に欲しかったものとして、 誰がデプロイしたのか現在使用中なのかどうかだったので、これを満たすために以下の機能を作りました。

  • 最後にデプロイした人を保持しておく
  • 使用終了状態にできる
  • 使用状況を確認できる

今回は

あたりを使ってChatbotを作りました。

最後にデプロイした人を保持しておく

デプロイ時

yu-tora sandbox deploy [ブランチ名] でデプロイできるようにして、その時にユーザ名やブランチ名等を取得してDynamoDBに保存するようにします。

const { updateBranch, fetchCommit } = require('./github');

app.message(/^yu-tora sandbox deploy (.+)/ , async ({ context, say , message}) => {
  const branch = context.matches[1];

  const sha = await deploySandbox(branch);

  if (sha === null) {
    await say(`\`${branch}\` ブランチは存在しません`)
  } else {
    await say(`Sandbox環境に \`${displayBranchName(branch, sha)}\` ブランチをデプロイするトラ😼`);

    // SlackのユーザID、ブランチ名、SHAの値を保持する
    const params = {
      TableName: 'yu-tora',
      Key: {
        id: dynamoId
      },
      ExpressionAttributeNames: {
        '#s': 'slackUser',
        '#b': 'branch',
        '#h': 'sha'
      },
      ExpressionAttributeValues: {
        ':slackUser': message.user,
        ':branch': branch,
        ':sha': sha
      },
      UpdateExpression: 'SET #s = :slackUser, #b = :branch, #h = :sha'
    };
    await docClient.update(params).promise();
  }
});

const deploySandbox = async (branch) => {
  const commit = await fetchCommit(owner, repo, branch);

  if (commit === null) {
    return null;
  }
  const sha = commit.data.object.sha

  await updateBranch(owner, repo, sandboxDeployBranchName, sha, true);

  return sha;
};

使用終了状態にできる

使い終わった場合

yu-tora sandbox out でデプロイ時に保持しておいたユーザ名を消すようにしました。

app.message(/^yu-tora sandbox out/ , async ({ say, message , context}) => {
  const params = {
    TableName: 'yu-tora',
    Key: {
      id: dynamoId
    },
    ExpressionAttributeNames: {
      '#s': 'slackUser'
    },
    ExpressionAttributeValues: {
      ':slackUser': null
    },
    UpdateExpression: 'SET #s = :slackUser'
  };
  await docClient.update(params).promise();

  await say('Sandboxを開放したトラ😽');
});

使用状況を確認できる

使用状況の確認(使用中の場合)
使用状況の確認(空いている場合)

yu-tora sandbox info で現在のステージング環境の使用状況を確認できるようにしました。

app.message(/^yu-tora sandbox info/ , async ({ say, context }) => {
  const data = await docClient.get({ TableName: dynamoTableName, Key: { id: dynamoId } }).promise();
  const item = await data.Item
  if (!item) {
    await say('Sandbox環境は空いてるトラ😽');
    return;
  }

  const user = item.slackUser;
  const branch = item.branch || '';
  const sha = item.sha || '';

  if (user) {
    await say(`<@${user}> が使用中トラ😸 \`${displayBranchName(branch, sha)}\``);
  } else {
    await say(`Sandbox環境は空いてるトラ😸\n適用中のブランチは \`${displayBranchName(branch, sha)}\` だトラ😾`);
  }
});

まとめ

Slack上でデプロイすることができるので、だいぶ楽になりました😄 また、使用中であるかどうかと、使用中の場合は誰が使っているか分かるので、ステージング環境を使うまでの手間が削減できたと思います😊

今回の改善は、YOUTRUSTで月1日実施しているKAIZEN Day(詳しくはこちら)で実施したのですが、継続して色々と改善していけたらと思っています!