はじめに
こんにちは、システム開発事業部の小國です。最近はめっきりハイボールにハマっており、晩酌を楽しみに生きています!
さて、今宵はGitHub Actions使ってGitHubのライセンスシートの空席数をSlackに知らせる君を作ったのでご紹介しようと思います。
シーズはGitHubを利用しているのですが、ライセンスシートが稀によく空席のまま余っていました。
課金対象となってしまうので空席がないようにしたいのですが、請求日にGitHubの画面から確認するのも大変なので、Slackに通知して誰かが気づけるようにしましたという内容の記事になります。
コード
早速ですがやっていきましょう。ちなみにライセンスシートの取得には、取得先のOrganizationで権限が必要です。
https://docs.github.com/ja/organizations/managing-peoples-access-to-your-organization-with-roles/roles-in-an-organization#permissions-for-organization-rolesGitHubのライセンスシートの空席数をSlackに知らせるシェルスクリプト
下記がそのシェルスクリプトです。空席数をSlackの#randomチャンネルに通知します。実行権限の付与もお忘れなく。
notify.sh
1#!/bin/bash
2
3set -e
4
5usage() {
6 cat <<EOL
7USAGE: $(basename $0) --org ORG --token TOKEN --webhook_url WEBHOOK_URL
8EOL
9 exit 1
10}
11
12org=""
13token=""
14webhook_url=""
15args=""
16argc=0
17argv=()
18
19while [ $# -gt 0 ]; do
20 case $1 in
21 -h|--help)
22 usage
23 ;;
24 --org)
25 org=$2
26 shift
27 ;;
28 --token)
29 token=$2
30 shift
31 ;;
32 --webhook_url)
33 webhook_url=$2
34 shift
35 ;;
36 --)
37 shift
38 args=$*
39 ;;
40 *)
41 argc=`expr $argc + 1`
42 argv+=($1)
43 ;;
44 esac
45
46 shift
47done
48
49if [ ! -n "$org" ]; then
50 echo "org is required"
51 exit 1;
52fi
53
54if [ ! -n "$token" ]; then
55 echo "token is required"
56 exit 1;
57fi
58
59if [ ! -n "$webhook_url" ]; then
60 echo "webhook_url is required"
61 exit 1;
62fi
63
64response=`curl -s \
65 -H "Accept: application/vnd.github.v3+json" \
66 -H "Authorization: token $token" \
67 https://api.github.com/orgs/$org`
68
69plan_seats=`echo $response | jq '.plan.seats'`
70filled_seats=`echo $response | jq '.plan.filled_seats'`
71open_seats=$(($plan_seats - $filled_seats))
72
73text="https://github.com/"$org" 空席数(余っているとダメ!)="$open_seats
74
75# post to slack
76curl -X POST \
77 --data-urlencode "payload={\"channel\": \"#random\", \"text\": \"$text\"}" \
78 $webhook_url
使い方
使い方は以下の通りです。
1./notify.sh --org XXXXXX --token ghp_XXXXXXXXXXXXXXXXXXX --webhook_url https://hooks.slack.com/services/XXXXXXXXXXXXXXXXXXX/XXXXXXXXXXXXXXXXXXX
-h、—helpオプションで使い方も確認できます。
1./notify.sh --help
2USAGE: notify.sh --org ORG --token TOKEN --webhook_url WEBHOOK_URL
GitHub Actionsのワークフロー作成
GitHub Actionsのスケジューラーを使って、毎月26日の12:00にSlackへ通知する設定となっています。
シーズのGitHubの請求日は27日なので、余裕を持って前日の26日の12:00に通知しています。
また、workflow_dispatch:で手動でいつでも実行できるようにしています。
.github/workflows/slack_notify.yml
1name: slack_notify
2
3on:
4 schedule:
5 - cron: '0 3 26 * *'
6 workflow_dispatch:
7
8jobs:
9 build:
10 runs-on: ubuntu-latest
11
12 steps:
13 - uses: actions/checkout@v2
14
15 - name: Run a one-line script
16 env:
17 ORG: ${{ vars.ORG }}
18 TOKEN: ${{ secrets.TOKEN }}
19 WEBHOOK_URL: ${{ secrets.WEBHOOK_URL }}
20 run: ./notify.sh --org $ORG --token $TOKEN --webhook_url $WEBHOOK_URL
全体のファイルとフォルダの構成
全体のファイルとフォルダの構成は以下のようになります。
1$ tree -a
2.
3├── .github
4│ └── workflows
5│ └── slack_notify.yml
6└── notify.sh
7
82 directories, 2 files
GitHubにpush
できたら、commitしてGitHubにリポジトリを作成しpushします。
GitHubのトークンとSlackのWebhook URL取得
GitHubのトークン取得
GitHub REST APIを利用するため、アクセストークンを取得します。
アクセストークンの取得は、https://github.com/settings/apps のDeveloper Settings > Personal access tokens > Token (class) > Generate new tokenから行います。
Noteに内容と、admin:orgのread:org権限を付与してトークンを取得します。
取得したトークンは後ほど利用します。
- Note
- admin:orgのread:org権限
Webhook URL取得
Incoming WebHooksを利用してGitHub Actionsからの通知を受け取ります。Incoming WebHooksがまだインストールされてなければインストールしてください。
Incoming Webhooksの設定です。Webhook URLは後ほど利用します。
GitHubでVariablesとSecretsの設定
最後にGitHub Actionsの設定を行います。
作成したリポジトリのSettings > Secrets and variablesから、空席数を確認するOrganization、トークンとSlackのWebhook URLを登録します。
Variables > Repository variable > New repository variableから空席数を確認するOrganizationを登録します。
- ORG登録
Secrets > Repository secrets > New repository secretからトークンとSlackのWebhook URLを登録します。
- TOKENとWEBHOOK_URL登録
実際の動作イメージ
以上で設定は完了です。確認はリポジトリのActionsからslack_notifyを選択し、Run workflowで確認ができます。
Slackに下記のように通知が来ればOKです。
- 動作イメージ
まとめ
GitHub Actions使ってGitHubのライセンスシートの空席数をSlackに知らせることができました。GitHubでは常に満席の密状態が気持ちいいですね。
ということで、Enjoy Your GitHub Hosting!