GitHub ActionsとClaspでGASを自動デプロイする方法

仕事でGASに自動デプロイする方法を調べたので、備忘録として残して置く。

一応、経緯も書いておく。

GASにデプロイする時Claspかasideを使うと簡単にデプロイすることができるが、チームで開発している場合はGithub Actionsなどを使用して自動化する方が効率的。

なので、masterブランチにコミットされたら自動的にGASプロジェクトにデプロイしてくれる仕組みを作りたかった。

あと、Github Actionsとか使った自動デプロイとかいうのをやったことなかったので、挑戦してみたかった。

環境

  • macOS Sequoia15.2
  • Docker
  • nodejs12

ソースだけちゃっちゃとみたい人向けにgithubのリポジトリ貼っておく。

GitHub - aitea1/clasp-github-actions: claspをgithubで自動化

プロジェクト構成はこんな感じ。

.
├── Docker
│   └── dockerfile
├── clasp-github-actions
│   └── app
│       └── src
│           ├── appsscript.json
│           └── index.js
└── docker-compose.yml

前提

GoogleAppScriptAPIを有効にしていること。

していない場合は下記リンクからオンに変更。

Apps Script  |  Google for Developers

Dockerなどでコンテナの作成して、実行中のコンテナにアタッチしていること。

手順

1.clasp loginを実行し、Googleアカウント認証する。

clasp login

2.認証成功後、以下のファイルに記載されているtoken値を確認する。

cat ~/.clasprc.json
{
	"tokens": {
    "default": {
  		"access_token": "aaaaaaaa...",
  		"refresh_token": "bbbbbbbb...",
  		"type": "authorized_user",
  		"client_id": "ccccccccccc.googleusercontent.com",
      "client_secret": "dddddddddd",
	  }
	}
}

3.tokenをGithubリポジトリに設定する。

Name:CLASP_TOKEN

Secret:2で確認したtoken値

{
	"token": {
		"access_token": "aaaaaaaa...",
		"refresh_token": "bbbbbbbb...",
		"scope": "https://www.googleapis.com/auth/...",
		"token_type": "Bearer",
		"id_token": "ccccccccc...",
		"expiry_date": 1700000000000
	}
}

設定手順

対象リポジトリ⇨Settings⇨Secrets and variables内のActions⇨New repository secret

4.GASプロジェクトの作成をする。

mkdir src/
clasp create testApp --type standalone --rootDir ./src
mv src/.clasp.json .

5.設定ファイルの修正をする。

{
  "timeZone": "Asia/Tokyo",
  "dependencies": {},
  "exceptionLogging": "STACKDRIVER"
}

6.スクリプト作成をする。

src/index.jsを作成し、コードを記述する。

function helloWorld() {
  Logger.log("Hello, Google Apps Script!");
}

7.GASにPushする。

Manifest file has been updated. Do you want to push and overwrite?という質問がされる場合があるが、「y」を入力して続行でOK。

clasp push

正しくデプロイされているか確認。

Apps Script  |  Google for Developers

Apps Script の自分のプロジェクト一覧(プロジェクト Src、最終更新 18:02)

8.Github Actionsのyml作成をする。

mkdir -p .github/workflows/
touch .github/workflows/deploy.yml
name: test # workflow の名前

on:
  push:
    branches:
      - main # main ブランチにプッシュされたときに実行
  workflow_dispatch: # 手動実行も可能にする

jobs:
  clasp_push:
    runs-on: ubuntu-latest # 実行環境として Ubuntu を使用

    steps:
      - name: Checkout repository
        uses: actions/checkout@v4 # リポジトリの最新コードを取得

      - name: Set up Node.js
        uses: actions/setup-node@v4
        with:
          node-version: 20 # Node.js のバージョンを指定

      - name: Install dependencies

        # Clasp をグローバルインストール
        run: |
          npm install -g @google/clasp

      - name: Authorize Clasp
        env:
          CLASP_TOKEN: ${{ secrets.CLASP_TOKEN }} # GitHub Secrets からトークンを取得

        # 認証情報を保存
        run: |
          echo $CLASP_TOKEN > ~/.clasprc.json

      # 各ディレクトリをチェックし、`clasp push -f` を実行
      - name: Clasp push by directories

        # 以下の処理を実行
        # [sed 's:/$::] 二重で/が着くのを除去
        run: |
          for dir in $(ls -d */ | grep -v '^Docker/$' | sed 's:/$::'); do
            cd $dir/app/
              echo "Processing directory: $dir/app/"
            if clasp status; then  
              clasp push -f  
            else
              echo "Not a clasp project: $dir/app/"
            fi
            cd ../../
          done

9.正常性確認

masterにコミット後、Actionsタブでworkflowが動いているかを確認。

GitHub の Actions タブ(main ブランチのワークフロー実行が成功)

正常終了が確認できたらGASの対象プロジェクトに正常にデプロイされているか確認。

Apps Script の自分のプロジェクト一覧(プロジェクト Src、最終更新 18:40)

※初回にサンプルソースをデプロイしてからソースを書き換えていなかったので、時間で判断。

正しく反映できているのを確認できたら完了!

一応、多少汎用性を持たせているので、別のプロジェクトを作成して、app/srcの構成にすればその子達も自動でデプロイされるようにはなってる。

これで多少なりともみんなの負担を減らせたなら御の字。

参考サイトたち

【GAS×Github×Clasp】複数のGASプロジェクトを効率的に一元管理する方法

GitHub Actions のトラブルシューティング