Slack, 스프레드시트 및 Hubot에서 비엔지니어를 위한 운영 도구로 사용해 보기
14735 단어 HubotChatOpsGoogleAppsScriptgas슬랙
Slack + Google 스프레드 시트로 데이터를 업데이트하는 Hubot을 만들면 상당히 좋았습니다.
예를 들어, 이런 느낌의 순위 모듈이있었습니다.
시스템이나 운용의 사정으로 자동화하지 않고, 비엔지니어의 사람이 수동으로 매주 갱신한다고 하는 사양입니다.
업데이트 흐름
1. 데이터를 Google 스프레드시트에 기입합니다.
표시하려는 콘텐츠에 해당하는 ID를 입력하십시오.
2. Slack에서 Hubot으로 업데이트합니다.
Hubot에게 멘션을 보내면
3. 끝
오퍼레이터의 작업은 이것만
평소 사용하는 도구이므로 익숙해지기 쉽습니다.
메커니즘
Slack의 멘션을 Hubot에서 받아들이고, GAS에서 스프레드시트의 내용으로부터 JSON을 생성, 그 JSON을 Static 서버에 업로드해, 그 데이터를 서비스측의 서버로부터 취득하는 흐름이 됩니다.
문자로 설명하면 모르기 때문에 아래 그림
1. 슬랙의 멘션을 받다
hubot-slack 라이브러리 로드
package.json
{
"dependencies": {
"hubot-slack": "^3.4.2",
"hubot-slack-attachment": "^1.0.0",
}
}
Slack 토큰 설정
$ HUBOT_SLACK_TOKEN="xxxxxxxxxxx"
슬랙에서 멘션을 받으려면
update.coffee
module.exports = (robot) ->
robot.respond /ランキングデータ更新/i, (msg) ->
console.log "更新依頼受付"
이제
ランキングデータ更新
문자열이 포함될 때 실행됩니다.2. GAS에서 스프레드시트 데이터를 검색하는 API 만들기
이런 종류의 구성 시트가 있다고 가정합니다.
monthly
weekly
11111
66666
22222
77777
33333
88888
44444
99999
55555
12345
취득 생성 코드
getRanking.gas
function doGet(e) {
var url = "https://docs.google.com/spreadsheets/d/xxxxxx/edit#gid=0"; // 取得ファイルのURL
var sheetName = "sheet1"; // 取得するシート名
var book = SpreadsheetApp.openByUrl(url);
var sheet = book.getSheetByName(sheetName);
var json = getData(sheet);
var res = ContentService.createTextOutput(JSON.stringify(json));
return res.setMimeType(ContentService.MimeType.JSON);
}
function getData(sheet) {
var monthly = [];
var weekly = [];
var lastRow = sheet.getLastRow();
for(var rowIndex=2; rowIndex<=lastRow; rowIndex++) {
var month = sheet.getRange(rowIndex, 1);
var week = sheet.getRange(rowIndex, 2);
if (month.getValue()) {
monthly.push(month.getValue());
}
if (week.getValue()) {
weekly.push(week.getValue());
}
}
return {"monthy":monthly, "weekly":weekly};
}
공개 → 웹 애플리케이션으로 도입 에서 API화
Hubot으로부터의 액세스가 번거롭기 때문에 우선,
全員(匿名ユーザー含む)
로 합니다.완성 된 API를 두드리면 이러한 JSON이 반환되어야합니다.
{
"monthy": [
11111,
22222,
33333,
44444,
55555
],
"weekly": [
66666,
77777,
88888,
99999,
12345
]
}
3. Hubot에서 GAS API를 가져와 파일 저장
npm
request
, fs
불러오기update.coffee
request = require 'request'
fs = require('fs')
취득 저장 코드
update.coffee
sheetApi = "https://script.google.com/macros/s/xxxxx-/exec" # GASで生成したAPI
tmpFile = "/tmp/ranking_" + new Date().getTime() + ".json" # 仮保存用ファイルのパス
request {
url: sheetApi
}, (err, response, body) ->
if err
console.error err
return
# json形式が正しいかチェック
JSON.parse(body)
# ファイルとして保存
fs.writeFileSync(tmpFile, body)
4. Hubot에서 SCP로 정적 서버로 업로드
Nginx에서 Static 서버를 준비하고 만약 Google 측에서 무언가 있었다고 해도 흡수할 수 있는 구조로 합니다.
npm
scp2
로드update.coffee
client = require("scp2")
업로드하고 성공하면 Slack에 성공 알림
update.coffee
client.scp(
tmpFile,
{
host: "127.0.0.1",
username: "username",
password: "password",
path: "/var/www/nginx/public/ranking.json"
},
(err) ->
if err
console.error err
return
data = {
text: "ランキングデータを更新いたしました!"
channel: "test" #通知するチャンネル名
}
robot.emit "slack.attachment", data
)
이 부분은 Git+capistrano라든가 하면 더 좋은 느낌이 될까 생각합니다.
5. 서비스 측에서 Static 서버의 ranking.json 얻기
평소와 마찬가지로 API를 얻는 느낌으로 쓰고 클라이언트에 표시
끝
Slack을 인터페이스로 사용하면 사용법을 가르치기 쉽고 이해하기 쉽습니다.
오퍼레이터 업무가 Slack 위에 흐르기 때문에 갱신된 타이밍이 남는 것도 좋았습니다.
단지 포맷이 어긋나면 에러가 되거나 하기 때문에(위의 예라면 ID의 수치가 아니고, 캐릭터 라인이 들어 버린 등), 에러 체크등의 오퍼레이션 미스를 막는 구조는 무엇인가 필요합니다.
순서는 많습니다만, 로테크의 모임이므로 만드는 것은 상당히 간단합니다.
어느 쪽도 Hubot도 GAS도 ECMAScript 사양이므로 기억해야 할 것은 적습니다.
무엇보다, 이 기능을 위해서 관리 화면의 UI나 DB를 준비하지 않아도 좋은 것이 편하다.
Reference
이 문제에 관하여(Slack, 스프레드시트 및 Hubot에서 비엔지니어를 위한 운영 도구로 사용해 보기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/narikei/items/bcf260ef8e93c83b15a4텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)