Github Actions&Claspを使ったGASプロジェクト自動デプロイ

備忘録
この記事は約7分で読めます。

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

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

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

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

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

環境

  • macOS Sequoia15.2
  • Docker
  • nodejs12

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

Build software better, together
GitHub is where people build software. More than 150 million people use GitHub to discover, fork, and contribute to over...

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

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

前提

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

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

Apps Script  |  Google for Developers
Develop high-quality, cloud-based solutions with ease.

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

手順

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

Bash
clasp login

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

Bash
cat ~/.clasprc.json
.clasprc.jsoの内容
{
	"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プロジェクトの作成をする。

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

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

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

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

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

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。

Bash
clasp push

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

Apps Script  |  Google for Developers
Develop high-quality, cloud-based solutions with ease.

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

Bash
mkdir -p .github/workflows/
touch .github/workflows/deploy.yml
JavaScript
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が動いているかを確認。

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

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

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

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

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

参考サイトたち

【GAS×Github×Clasp】複数のGASプロジェクトを効率的に一元管理する方法
GitHub Actions のトラブルシューティング

コメント

タイトルとURLをコピーしました