こんにちは、 @sue445 です。
今期の推しアニメは HUGっと!プリキュア と キラッとプリ☆チャン と サザエさん です。
ピクシブでは今までは業務に直接関係ないチャンネル(いわゆる雑談など)は作成しないルールが採用されていました。しかし、ドメイン知識を高めるために業務に直接関係ないこと(たとえばアニメ、ゲーム、ラノベなど)でも情報共有したいという意見があり今年の10月頃にそのルールが緩和されました。
その一環でアニメについて語るチャンネルができたのですが、前職のチャットにあったとあるボットがほしくて作りました。
下のスクショがボット作成直後の同僚の喜びの声です。
見ての通り、これから放映されるアニメの一覧を教えてくれるボットです。 上記は初期バージョンなので色々古いですが、最新だとこんな感じです。
しょぼいカレンダーのAPI では新番組や再放送などの情報も取れるので、新聞の番組欄のように【新】【再】などの文字が出るようにしています。
特にクローズドソースである必要性もなかったのでこの機会にOSSにしました。 OSS化に当たってドキュメントを直したりgitの履歴を全部吹き飛ばしたりしましたが、基本的にピクシブ社内で利用しているのとほぼ同じものです。
ソースコード
- GitHub : https://github.com/sue445/today_anime
- GitLab : https://gitlab.com/sue445/today_anime
GitHubとGitLab、全く同じものを公開していますので好きな方をご利用ください。
利用方法
諸々設定済の .circleci/config.yml
と .gitlab-ci.yml
を用意しているので最低限の設定で利用できます。
GitHub + CircleCIでの利用方法
CircleCIを利用してボットの定期実行を行います。
https://github.com/sue445/today_anime のリポジトリをcloneして適当なリポジトリにpushしてください。(publicリポジトリをforkするとprivateにできないため)
.circleci/config.yml
に全て設定済なので特別な設定は不要ですが、拙作のorb(CircleCIで使えるモジュール)を利用しているので下記を参考に3rd party製orbを有効化してください。
CircleCI 2.1のorbを作って最速で実アプリに投入した - くりにっき
リポジトリの「BUILD SETTINGS -> Environment Variables」で SLACK_WEBHOOK_URL
という名前でSlackの Incoming Webhook を登録してください 。
また、.circleci/config.yml
内にテスト用の通知先チャンネルが書かれているのでお使いのワークスペースによって適宜編集してください。
build:
jobs:
- today_anime:
slack_channel: "test"
GitLab + GitLab CIでの利用方法
GitLab CIのschedulerの仕組みを利用してボットを定期実行します。
https://gitlab.com/sue445/today_anime をcloneして適当なリポジトリにpushしてください。GitLabだとpublicリポジトリをfork後にprivateにできるので、GitLab.comで運用したい場合にはforkでも構いません。
リポジトリの「Settings -> CI / CD」でVariablesで SLACK_WEBHOOK_URL
という名前でSlackの Incoming Webhook を登録してください 。
次に、リポジトリの「CI / CD -> Schedules」からschedulerの設定を登録してください。
ピクシブ用の場合「平日は定時終了の19時に通知したいけど土日は見たいアニメが17時くらいから始まるので17時に通知したい」という個人的な要望があったので2つ登録していますが、好みの問題なので1つでもいいと思います。
.gitlab-ci.yml
内にテスト用の通知先チャンネルが書かれているのでお使いのワークスペースによって適宜編集してください。
# 開発時は #test に流す
develop:
stage: build
script:
- bundle exec ruby today_anime.rb
variables:
SLACK_CHANNEL: "test"
except:
- schedules
GitHubとGitLab共通の設定
開発用の通知先はCIの設定ファイル内に記載していますが、本番用(schedulerで定期実行される時の通知先)はIncoming Webhookの設定画面にあるチャンネルを参照しています。
これ系のボットはノーメンテで運用できちゃってチャンネル名変更の時に動かなくなってあたふたすることが多いので、こうしておくことでチャンネル名のリネームに強くなっておすすめです。
細かい設定や仕様など
- 実行時の時間(分以下は切り捨て)〜翌4:00までのアニメを取得して通知します
- 例) 19:19に実行されたら19:00〜翌4:00で取得する
- 現在は東京の放送局を取得していますが、他の地域を取得したい場合には
config.yml
をよしなに修正してください
余談:CIサービスでボットを運用するメリットについて
ピクシブ社内ではGitLab CIで「今日のアニメボット」を運用していますが、下記のメリットがあると思っています。
動かすサーバが不要
雑なボットを動かす手段としてどこかのサーバにsshで入ってcrontabを設定するというのがありますが、それだとそのサーバを管理するコストやどこで動いているか知っておく必要があります。
しかしCircleCIやGitLab CI(以下、「CIサービス」と呼称)で運用しているとリポジトリに密結合しているため実行用のサーバは不要ですし、どこで動いているか探す必要がありせん。
ある意味サーバレスですw
デプロイが不要
ボットのスクリプトを更新したらデプロイしたり実行サーバにsshで入ってgit pullというのがよくあると思いますが、CIサービスでボットを動かしていれば実行時に自動で最新のソースが利用されるので「ソースを修正してサーバに反映する」という概念がありません。
好きな環境で動かせる
サーバレスでボットを動かす対抗馬としてAWSのLambdaやGoogle Apps Script (GAS) がありますが、これらは利用言語が限られています。
日常的にnodejsやpythonを利用しているのであればいいのですが、そうでない場合はボットのために書き慣れない言語を使う必要があり少しハードルが高いです。
しかしCircleCIやGitLab CIでは実行環境に任意のDockerイメージが使えるため、自分の好きな言語や環境でボットを動かすことが容易です。
まとめ
GitHubといえばソースコードを共有・配布するためのサイトですが、CIサービスやDocker Hubの普及によりアプリケーションの実行環境も配布することも容易になりました。
皆さんの会社でも是非「今日のアニメボット」を導入してみてください!