hero_picture
Cover Image for GitHub Actions使ってGitHubのライセンスシートの空席数をSlackに知らせる君を作った

GitHub Actions使ってGitHubのライセンスシートの空席数をSlackに知らせる君を作った

2023/09/28

はじめに

こんにちは、システム開発事業部の小國です。最近はめっきりハイボールにハマっており、晩酌を楽しみに生きています!

さて、今宵は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-roles

GitHubのライセンスシートの空席数を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!