🥰

clasp×githubActionsで複数のgasプロジェクトを一つのリポジトリで管理し、自動デプロイまでできるようにした

2022/07/07に公開4

やりたいこと

  • GASはプロジェクトがかなり増えるので、一つのプロジェクトに一つのリポジトリを使わずに複数のプロジェクトを一つのリポジトリで管理したい
  • さらにプロジェクトごとにそれぞれのgasプロジェクトにデプロイしたい
  • リポジトリごとに自動デプロイする記事はあるけどディレクトリごとにデプロイを説明している記事がない(簡単だから?)

つまりこういうこと

リポジトリ
├─ プロジェクト1/
│  └─ src/
│  │  ├─ appsscript.json
│  │  └─ コード.gs
│  └─ .clasp.json
├─ プロジェクト2/
│  └─ src/
│  │  ├─ appsscript.json
│  │  └─ コード.gs
│  └─ .clasp.json
├─ プロジェクト3/
│  └─ src/
│  │  ├─ appsscript.json
│  │  └─ コード.gs
│  └─ .clasp.json

↑こういうふうにしたい😋

結論

githubActionsのpath指定とworking-directoryを指定すると各プロジェクトで自動デプロイが可能です。
そしてプロジェクトごとにActionsを設定すればおけです!
(ymlの中でパスを切り分けることができるならコメントで教えていただけると🙇‍♂️)
↓こんなふうに

on:
  push:
    branches:
      - main
    paths:
    - 'プロジェクト1/src/**'
      
defaults:
  run:
    working-directory: プロジェクト1

各プロジェクトのファイル構成

├─ プロジェクト3/
│  └─ src/
│  │  ├─ appsscript.json
│  │  └─ コード.gs
│  └─ .clasp.json

working-directoryによってそれぞれのファイルがルートディレクトリとなるためプロジェクトのファイルを起点として、自動デプロイに必要なファイルを用意します。

  • .clasp.json
  • src/appsscript.json
    など
    claspの場合は.clasp.jsonにプロジェクトファイルに応じたscriptIdを設定することによりgithubActionsでpathを切り分けたのち、それぞれのプロジェクトにデプロイすることができます。
.clasp.json
{
  "scriptId": "スクリプトID", #urlの~/projects/**この部分**/edit
  "rootDir": "./src"
}

Actionsの設定

私はこの記事を参考にしました。
https://zenn.dev/yumechi/articles/5dd115924f81bc

あとは以下のymlファイルをプロジェクトごとに作成するだけです。
シークレットなどは上の記事を参考に設定してください。

name: clasp_push

on:
  push:
    branches:
      - main
    paths:
    - 'プロジェクトディレクトリ/src/**'
      
defaults:
  run:
    working-directory: プロジェクトディレクトリ

jobs:
  deployment:
    runs-on: ubuntu-latest
    steps:
      - name: checkout
        uses: actions/checkout@v2
      - name: node install
        uses: actions/setup-node@v2
        with:
          node-version: '14'
      - name: install clasp
        run: npm install -g @google/clasp
      - name: create clasprc.json
        run: |
          cat << EOS > ~/.clasprc.json
          {
            "token": {
              "access_token": "${{ secrets.ACCESS_TOKEN }}",
              "scope": "https://www.googleapis.com/auth/userinfo.profile https://www.googleapis.com/auth/drive.metadata.readonly https://www.googleapis.com/auth/script.projects https://www.googleapis.com/auth/cloud-platform https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/drive.file https://www.googleapis.com/auth/service.management https://www.googleapis.com/auth/script.deployments https://www.googleapis.com/auth/logging.read https://www.googleapis.com/auth/script.webapp.deploy openid",
              "token_type": "Bearer",
              "id_token": "${{ secrets.ID_TOKEN }}",
              "expiry_date": 1641493053167,
              "refresh_token": "${{ secrets.REFRESH_TOKEN }}"
            },
            "oauth2ClientSettings": {
              "clientId": "${{ secrets.CLIENT_ID }}",
              "clientSecret": "${{ secrets.CLIENT_SECRET }}",
              "redirectUri": "http://localhost"
            },
            "isLocalCreds": false
          }
          EOS
      - name: deploy
        run: clasp push -f

まとめ

これで私の部署では、私だけが扱っていたgasファイルをみんなで見ることができ、軽微な修正ならgithubからプルリクを送ってもらえるようになりました。🙌

Discussion

ttsukagoshittsukagoshi

2年越しに同じ「やりたいこと」を考えてたどり着きました。ありがとうございます!!

(ymlの中でパスを切り分けることができるならコメントで教えていただけると🙇‍♂️)

↑こちらは、もう解決済みでしょうか...?job内のstrategy.matrixを使うと、一つのyml内で全てのプロジェクトのパスについて、それぞれclasp pushできました。ご存じであれば、以下、ご放念ください。記事本文中のymlをもとに、strategy.matrixを入れてみました:

name: clasp_push

on:
  push:
    # branches:
    #   - main
    # paths:
    # - 'プロジェクトディレクトリ/src/**'
    tags:
      - 'v*'  # 私の場合はバージョンごとにpushしたかったのでこうしました
      
# defaults:
#   run:
#     working-directory: プロジェクトディレクトリ

jobs:
  deployment:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        target-dir: ['プロジェクト1', 'プロジェクト2']  # プロジェクト追加時は、ここに追記する
    steps:
      - name: checkout 略
      - name: node install 略
      - name: install clasp 略
      - name: create clasprc.json 略
      - name: deploy
        working-directory: ./${{ matrix.target-dir }}  # ここでworking-directoryを指定
        run: clasp push -f
furnqsefurnqse

なるほど!ありがとうございます!
こちら参考にさせていただきます!