こんにちは、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(詳しくはこちら)で実施したのですが、継続して色々と改善していけたらと思っています!