hubot-matteruserを使ってRSSリーダーを動作させる

## はじめに

本記事は[laofoe/hubot-matteruser](https://github.com/loafoe/hubot-matteruser)を用いてRSSフィードをmattermostに投稿するhubotを作成する手順を示したものです．

## ハマったところ

hubot rssで検索するとはじめに出てくる[hubot-rss-reader](https://github.com/shokai/hubot-rss-reader)ですが，[このIssue](https://github.com/shokai/hubot-rss-reader/issues/53)にハマって動作させることができません．

```
ERROR TypeError: Cannot read property 'then' of undefined
  at run (/usr/src/hubot-matteruser/node_modules/hubot-rss-reader/scripts/hubot-rss-reader.coffee:74:7, <js>:94:35)
  at Brain.<anonymous> (/usr/src/hubot-matteruser/node_modules/hubot-rss-reader/scripts/hubot-rss-reader.coffee:83:5, <js>:103:14)
  at Object.onceWrapper (events.js:286:20)
  at Brain.emit (events.js:203:15)
  at Brain.mergeData (/usr/src/hubot-matteruser/node_modules/hubot/src/brain.js:157:10)
  at Command.callback (/usr/src/hubot-matteruser/node_modules/hubot-redis-brain/src/redis-brain.js:54:21)
  at normal_reply (/usr/src/hubot-matteruser/node_modules/redis/index.js:726:21)
  at RedisClient.return_reply (/usr/src/hubot-matteruser/node_modules/redis/index.js:824:9)
  at JavascriptRedisParser.returnReply (/usr/src/hubot-matteruser/node_modules/redis/index.js:192:18)
  at JavascriptRedisParser.execute (/usr/src/hubot-matteruser/node_modules/redis-parser/lib/parser.js:574:12)
  at Socket.<anonymous> (/usr/src/hubot-matteruser/node_modules/redis/index.js:274:27)
  at Socket.emit (events.js:198:13)
  at addChunk (_stream_readable.js:288:12)
  at readableAddChunk (_stream_readable.js:269:11)
  at Socket.Readable.push (_stream_readable.js:224:10)
  at TCP.onStreamRead [as onread] (internal/stream_base_commons.js:94:17)
```

## Dockerfileの修正

[laofoe/hubot-matteruser](https://github.com/loafoe/hubot-matteruser)の一部を修正します.
hubot-rss-readerではなく，派生版の[hubot-rss-rolf](https://www.npmjs.com/package/hubot-rss-rolf)モジュールを使います．
これによりハマりポイントを回避できます．

```dockerfile
FROM node:10

ARG hubot_owner
ARG hubot_description
ARG hubot_name

RUN useradd -m -s /bin/bash hubot-matteruser

RUN mkdir -p /usr/src/hubot-matteruser
RUN chown hubot-matteruser:hubot-matteruser /usr/src/hubot-matteruser
RUN chown hubot-matteruser:hubot-matteruser /usr/local/lib/node_modules/
RUN chown hubot-matteruser:hubot-matteruser /usr/local/bin/

WORKDIR /usr/src/hubot-matteruser
USER hubot-matteruser
RUN npm install -g yo
RUN npm install -g generator-hubot
RUN npm install -g hubot-redis-brain　#追加

RUN echo "No" | yo hubot --adapter matteruser --owner="${hubot_owner}" --name="${hubot_name}" --description="${hubot_desciption}" --defaults \
&& sed -i '/heroku/d' external-scripts.json

RUN npm install hubot-rss-rolf --save　#追加
RUN npm install coffee-script@">=1.10.0" --save　#追加

RUN rm hubot-scripts.json

CMD ["-a", "matteruser"]
ENTRYPOINT ["./bin/hubot"]

EXPOSE 8080
```
## external-scripts.jsonの作成

docker-compose.ymlと同じディレクトリにexternal-scripts.jsonを作成して以下を記述してください．
デフォルトの全てのモジュールが含まれているので不要な物を削除してください．

```json
[   
　　 "hubot-diagnostics",
    "hubot-help",
    "hubot-google-images",
    "hubot-google-translate",
    "hubot-pugme",
    "hubot-maps",
    "hubot-redis-brain",
    "hubot-rules",
    "hubot-shipit",
    "hubot-rss-rolf"
]

```
## docker-compose.ymlの修正

hubot-brainを使用する必要があるので

```yaml
version: "3.7" #変更

services:
  hubot-matteruser:
    build:
     context: .
     args:
       hubot_owner: <CHANGEME>
       hubot_name: <CHANGEME>
       hubot_description: <CHANGEME>
    restart: always
    user: hubot-matteruser
    ports:
      - "8080:8080"
    environment:
      - MATTERMOST_HOST=<CHANGEME>
      - MATTERMOST_GROUP=<CHANGEME>
      - MATTERMOST_USER=<CHANGEME>
      - MATTERMOST_PASSWORD=<CHANGEME>
      - MATTERMOST_LOG_LEVEL=info
      - MATTERMOST_USE_TLS=false
      - MATTERMOST_TLS_VERIFY=false
      - MATTERMOST_WSS_PORT=80
      #以降追記
      - REDIS_URL=redis://mm-hubot-brain:6379
      - HUBOT_RSS_INTERVAL=3600
      - HUBOT_RSS_USERAGENT=Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:83.0) Gecko/20100101 Firefox/83.0
      - HUBOT_RSS_LIMIT_ON_ADD=10
      - HUBOT_RSS_HEADER=:dango:
      - HUBOT_RSS_PRINTSUMMARY=true
      - HUBOT_RSS_PRINTIMAGE=true
      - HUBOT_RSS_PRINTERROR=true
      - HUBOT_RSS_IRCCOLORS=false
    volumes:
      - ./external-scripts.json:/usr/src/matteruser/external-scripts.json
  mm-hubot-brain:
    image: redis:6.0.9-alpine
    container_name: mm-hubot-brain
    volumes: 
      - hubot-brain-data:/data
    command: redis-server --appendonly yes 

volumes:
  hubot-brain-data:
    driver: local
```

## 起動と動作確認

以下のコマンドhubotを起動する．

```bash
docker-compose up -d 
```

起動後正常に動作していればhubotのbotへのダイレクトメッセージで以下を実行してnothingと出ていれば成功です．
以下のコマンド内のhubotはbuild argのhubot_nameを指定した場合，その名前に置換してください．

```
hubot rss list
// hubot nothing
```

## おわりに

RSSは最近の記事が少なくなっていて動く構成を探すのに苦労しました． 
この記事が他の方の少しでも助けになれば幸いです．