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
開発手順
実際のコードは以下のレポジトリに載せておきます.
プロジェクトの作成
まず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
をクリックします.
次に右側のRun workflow
をクリックして,workflowを実行してください.
しばらくすると,無事botが発言してくれました!
今は手動で実行しましたが,cron
で設定した時刻にもbotが発言してくれるようになります.
まとめ
GitHub Actionsを用いて定期的に発言を行うslack botを作成しました. これを用いる事で,Herokuなどのサーバーでデプロイする必要がなく,かつ無料なので大変便利だと感じました.