GitHub Actionsを使ってGASをデプロイしてみた

2021.07.07

はじめに

アノテーションの髙嶋です。

私は業務の中で社内ツールの作成なども行っていますが、Google Apps Script(以降、GASと記述)を使用することが多いです。

今回はGitHub Actionsを使ってGASのデプロイをやれないかな?と試してみたので、その手順を記載しています。
もっとこうした方がいい!というのもあると思うので、教えていただけると喜びます。

前提条件

".clasprc.json"というファイルの情報を使用するため、claspを使用したGASの開発環境を構築できるスキルがある前提となります。 その辺りがわからない場合は、別途調べていただければと思います。

デプロイ準備

Secrets設定

claspを使用してローカル端末でGASの開発を行う場合、Googleにログインすることで".clasprc.json"というファイルが端末内に作成されます。 このファイルは下記のような構成となっています。

~/.clasprc.json

{
	"token":{
		"access_token":"aaa",
		"scope":"bbb",
		"token_type":"Bearer",
		"id_token":"ccc",
		"expiry_date":9999999999999,
		"refresh_token":"ddd"
	},
	"oauth2ClientSettings":{
		"clientId":"eee",
		"clientSecret":"fff",
		"redirectUri":"http://localhost"
	},
	"isLocalCreds":false
}

※実際のファイルは1行で記述されています

このファイルから必要な情報を抜き出し、GitHubのSecretsへ登録します。
今回、Secretsへ登録している項目は下記になります。

  • access_tokenの値
  • id_tokenの値
  • refresh_tokenの値
  • clientIdの値
  • clientSecretの値

Secretsの登録イメージ

これらの情報をSecretsとして登録する理由はアカウントのセキュリティに関係するためです。今回はデプロイ処理の中で、Secretsの情報を使用して".clasprc.json"を生成して使用するようにしています。

".clasprc.json"をGitHubへコミットして公開するのはNGです

ファイル準備

今回使用するファイルの構成と内容は下記になります。

フォルダ構成

./
 ├ .github
 │ └ workflows
 │  └ cd.yml
 ├ src
 │ ├ appsscript.json
 │ └ sample.js
 └ .clasp.json

ファイル内容

cd.yml

name: CD (Build and deploy to production)

on:
  push:
    branches:
      - main
  workflow_dispatch:
jobs:
  deploy:
    runs-on: ubuntu-20.04
    timeout-minutes: 15
    steps:
      - name: Checkout
        uses: actions/checkout@v2
      - name: Setup Node.js 16.x
        uses: actions/setup-node@v2
        with:
          node-version: '16.x'
      - name: Install Clasp
        run: |
          npm init -y
          npm install clasp -g
      - name: Create clasprc.json
        run: |
          echo \{\"token\":\{\"access_token\":\"${{ secrets.ACCESS_TOKEN}}\",\"scope\":\"https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/drive.metadata.readonly https://www.googleapis.com/auth/script.projects https://www.googleapis.com/auth/script.webapp.deploy https://www.googleapis.com/auth/logging.read openid https://www.googleapis.com/auth/userinfo.profile https://www.googleapis.com/auth/drive.file https://www.googleapis.com/auth/script.deployments https://www.googleapis.com/auth/service.management https://www.googleapis.com/auth/cloud-platform\",\"token_type\":\"Bearer\",\"id_token\":\"${{ secrets.ID_TOKEN }}\",\"expiry_date\":1620870307822,\"refresh_token\":\"${{ secrets.REFRESH_TOKEN }}\"\},\"oauth2ClientSettings\":\{\"clientId\":\"${{ secrets.CLIENTID }}\",\"clientSecret\":\"${{ secrets.CLIENTSECRET }}\",\"redirectUri\":\"http://localhost\"\},\"isLocalCreds\":false\} > ~/.clasprc.json
      - name: Deploy
        run: |
          clasp push

GitHub Actionsで実行する内容を定義するファイルです。 Nodeやclaspをインストールして、実行環境に対してソースをpushしています。

".clasprc.json"は25行目のところで生成するようになっています。
また、ローカル端末では"package.json"が無くてもpushできたのですが、GitHub Actions上で実行する場合はファイルが無いとエラーになってしまうため、21行目で生成するようにしています。(原因までは調べていません)

.clasp.json

{
    "scriptId": "(GASのスクリプトID)",
    "rootDir": "./src"
}

claspを使用するとローカル端末に生成されるファイルです。 私はいつもこのファイルに"rootDir"の定義を追加しています。

appsscript.json

{
  "timeZone": "America/New_York",
  "dependencies": {
  },
  "exceptionLogging": "STACKDRIVER",
  "runtimeVersion": "V8"
}

このファイルもclaspを使用するとローカル端末に作成されます。 生成されたファイルをそのまま使用しています。

sample.js

function test() {
    Logger.log('Hello GitHub Actions Deploy!');
}

今回デプロイするソースファイルです。 デプロイを実施することで、このソースに更新されます。

GitHub Actionsの実行

デプロイを実施する前の実行環境側のソースはこんな感じです。

前述した準備が完了したら、GitHubへプッシュします。 今回はmainブランチに対して直接プッシュしています。

git push

プッシュすると、GitHub Actionsが実行されます。

処理完了後、実行環境側を確認すると、ソースが更新されました!

GASの処理を実行しても問題なく動作します。

無事、GitHub ActionsからGASのデプロイが成功しました。

最後に

今回はGitHub ActionsからGASのデプロイが実施できることを確認できました。
ただ、スクリプトのプロパティの設定などは行えないので、あくまでソースのみの更新用だと考えています。
(もしこうすればプロパティを更新できる!があれば教えてください)

GASでの開発を行う際の参考になれば幸いです。
(GASでの開発にそこまで求めるか?という気も個人的にはしますが)

最後までお読みいただきありがとうございました。
それでは、また次の記事でお会いしましょう。

アノテーション株式会社について

アノテーション株式会社は、クラスメソッド社のグループ企業として「オペレーション・エクセレンス」を担える企業を目指してチャレンジを続けています。「らしく働く、らしく生きる」のスローガンを掲げ、様々な背景をもつ多様なメンバーが自由度の高い働き方を通してお客様へサービスを提供し続けてきました。現在当社では一緒に会社を盛り上げていただけるメンバーを募集中です。少しでもご興味あれば、アノテーション株式会社WEBサイトをご覧ください。