yiskw note

機械学習やプログラミングについて気まぐれで書きます

GitHub Actionsを用いて,slackに定期的にメッセージを送信する


概要

以前Herokuとpythonを用いてslackに定期的にメッセージを送るbotを作成したのですが, 調べてみると定期的に実行するだけならGithub Actionsを用いることでできるようでした. そこでGitHub Actionsを用いたSlack botを作成してみたので,こちらにメモを残しておきます.

実行環境

今回はslackerというライブラリを用いてbotを作成します.

- MacOS Catalina
- python 3.8.2
- poetry
- slacker == 0.14.0

ディレクトリ構成

以下の構造のディレクトリを想定してます.

gh_actions_slack_bot
├── .github
│   └── workflows
│       └── send_message.yml
├── .gitignore
├── README.md
├── poetry.lock
├── pyproject.toml
└── send_message.py

開発手順

実際のコードは以下のレポジトリに載せておきます.

github.com

プロジェクトの作成

まずpoetryを用いて,プロジェクトを作成します. (poetry new slack-bot-gh-actionsで良いのですが,自分のGitHubの構成に合わせるために,このようにしています.)

$ mkdir slack-bot-gh-actions
$ cd slack-bot-gh-actions
$ poetry init

次に必要なパッケージを追加します.

$ poetry add slacker
$ poetry install

API Tokenの取得 & GitHub Secretsへの追加

https://my.slack.com/services/new/botから,slack botを作成します. botを作成したら,API tokenをコピーしておきます. また,作成したbotを発言させたいチャンネルに招待しておきます. 次に,適当な名前でGitHubのレポジトリを作成します. そのレポジトリのページから,Settings -> Secretsに進み,New repository secretを押して, SLACK_API_TOKENという名前で,先ほどのAPI TokenをValueにしたsecretを作成します.

メッセージを送信するスクリプトの作成

send_message.pyは以下のようになります.特に難しい事はしていなくて,slackerでメッセージを送信しているだけです. メッセージの内容messageや投稿先のチャンネルを表すCHANNELは,適宜変更してください. このスクリプトでは,環境変数SLACK_API_TOKEN,もしくはコマンドライン引数のslack_api_tokenをslack tokenとして使用しています.

import argparse
import os

from slacker import Slacker

CHANNEL = "#test"


def get_arguments() -> argparse.Namespace:
    parser = argparse.ArgumentParser(description="reminder bot")
    parser.add_argument(
        "--slack_api_token", type=str, help="slack api token.", default=None
    )

    return parser.parse_args()


if __name__ == "__main__":
    args = get_arguments()

    slack_api_token = os.getenv("SLACK_API_TOKEN") or args.slack_api_token

    message = "a message from slack bot."

    slack = Slacker(slack_api_token)
    slack.chat.post_message(CHANNEL, message, as_user=True)

GitHub Actions の設定

次に上のコードを定期手に実行するworkflowを設定します. .github/workflows/cron.ymlを以下のようにします.

name: Send a message to slack

on:
  schedule:
    - cron:  '0 4 * * 0'  # UTC times using POSIX cron syntax.
  workflow_dispatch:

jobs:
  ci:
    runs-on: ubuntu-18.04
    steps:
      - uses: actions/checkout@v2
      - uses: actions/setup-python@v2
        with:
          python-version: 3.8

      - name: Run image
        uses: abatilo/actions-poetry@v2.0.0
        with:
          poetry-version: 1.1.2

      - name: install dependencies
        run: poetry install

      - name: Send message
        run:
          poetry run python send_message.py --slack_api_token ${{ secrets.SLACK_API_TOKEN }}

GitHub Actionsでは,sheduleトリガーを設定する事で,workflowを定期的に実行することが可能です.
いつ実行するかはcronに記述します.書き方は分 時 日 月 曜日の順番で記述します. *とすることで任意の単位間隔で実行することは可能になります.
また,workflow_dispatchトリガーを指定することで,ワークフローを手動で実行できるようになります.
先ほど設定したSLACK_API_TOKENを参照するには,${{ secrets.SLACK_API_TOKEN }}と指定すれば良いです.

Workflowを実行してみる

ここまでの内容をGitにpushして,レポジトリのページからActionsに進みます. 左のSend a message to slackをクリックします.

f:id:yiskw713:20210224190931p:plain

次に右側のRun workflowをクリックして,workflowを実行してください.

f:id:yiskw713:20210224191140p:plain

しばらくすると,無事botが発言してくれました!

f:id:yiskw713:20210224191329p:plain

今は手動で実行しましたが,cronで設定した時刻にもbotが発言してくれるようになります.

まとめ

GitHub Actionsを用いて定期的に発言を行うslack botを作成しました. これを用いる事で,Herokuなどのサーバーでデプロイする必要がなく,かつ無料なので大変便利だと感じました.