☁️

アクセストークンをパラメーターに使用するスクリプトをgithubのworkflow経由で実行するようにしてみた

2024/04/29に公開

何isこの記事

「アクセストークンをパラメーターに使用するスクリプトをgithubのworkflowを使用して実行することで、ローカル環境でアクセストークンを持たなくても実行できるようになるよ!」
という記事です。他にいい方法はあるかもしれませんが、5秒ほど調べて同じこと書いてる記事が見つからなかったので記事にしてます。

背景

LINEのMessaging APIを使用してLINEのアプリを作成するときはローカルでngrokやcloudflaredなどを使用してローカルとネットを繋いでそれをWebhook URLに登録する必要があるのですが、トンネルサービスを使用したときにURLが毎回変わる場合、Webhook URLを毎回更新する必要があり、それを管理画面に行って更新するのがめんどくさかったのでWebhook URLを更新するためのシェルスクリプトを作りました。

https://ngrok.com/

https://github.com/cloudflare/cloudflared

シェルスクリプトを作成

このシェルスクリプトでは.envから環境変数を取得して、それを使用してcurlでLINEのWebhookのURLを更新してます。(これは完成系ではないです)

#!/bin/bash

# .env ファイルから環境変数を読み込む
if [ -f .env ]; then
    export $(grep 'LINE_CHANNEL_ACCESS_TOKEN' .env | sed 's/#.*//g' | xargs)
fi

# ユーザーにエンドポイントURLの入力を促す
echo "Enter the webhook endpoint URL:"
read endpoint

curl -X PUT \
-H "Authorization: Bearer $LINE_CHANNEL_ACCESS_TOKEN" \
-H "Content-Type:application/json" \
-d "{\"endpoint\":\"$endpoint\"}" \
https://api.line.me/v2/bot/channel/webhook/endpoint

シークレットを登録

リポジトリのSettings > Secrets and variables > Actions > Secrets > Repository secretsLINE_CHANNEL_ACCESS_TOKENを登録します。

workflowを作成

先ほど登録したLINE_CHANNEL_ACCESS_TOKENsecretsから取得するようにしてます。
urlは実行時に渡すようにします。

name: Update Line Webhook URL
on:
  workflow_dispatch:
    inputs:
      url:
        description: 'URL'
        required: true

jobs:
  update:
    runs-on: ubuntu-latest
    steps:
      - name: Update Webhook URL
        run: |
          curl -X PUT \
          -H 'Authorization: Bearer ${{ secrets.LINE_CHANNEL_ACCESS_TOKEN }}' \
          -H 'Content-Type:application/json' \
          -d '{"endpoint":"${{ github.event.inputs.url }}"}' \
          https://api.line.me/v2/bot/channel/webhook/endpoint

シェルスクリプトを更新

ghを使用してworkflowを実行するように更新します。
https://github.com/cli/cli

openでgithub actionsのページを開いている箇所は、cliでworkflowの実行結果を取得することもできますが、ページに飛ばす方が楽なのでそうしてます。

#!/bin/bash

# ユーザーにエンドポイントURLの入力を促す
echo "Enter the webhook endpoint URL:"
read endpoint

gh workflow run update-line-webhook-url.yml -F url="$endpoint"

# ワークフローの実行結果を確認するためにブラウザを開く
SLEEP_SEC=5
echo "$SLEEP_SEC"秒後にブラウザでGitHub Actionsのページを開きます
sleep $SLEEP_SEC
open https://github.com/shinaps/run-sh-in-github-workflow/actions

実行

IDEのボタンで実行してるので変な感じになってますが、普通に

sh update-line-webhook-url.sh

で動きます。

(base) ~/dev/run-sh-in-github-workflow git:[main]
/bin/bash /Users/shinaps/dev/run-sh-in-github-workflow/update-line-webhook-url.sh
Enter the webhook endpoint URL:
https://example.com/
✓ Created workflow_dispatch event for update-line-webhook-url.yml at main

To see runs for this workflow, try: gh run list --workflow=update-line-webhook-url.yml
5秒後にブラウザでGitHub Actionsのページを開きます

実行結果

リポジトリ

https://github.com/shinaps/run-sh-in-github-workflow

あとがき

cloudflareのZero TrustのTunnelsを使用したらこの方法で毎回Webhook URLを更新する必要がなくなったのでこの仕組みは消す予定なのですが、せっかくなので記事にしておこうという気持ちで書きました。
同じことをやろうとしてる方はcloudflareのZero TrustのTunnelsを使用してURL固定した方が良い場合もあるので↓も試してみてください。
https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/get-started/create-remote-tunnel/

shinaps テックブログ

Discussion