追記
この記事を踏まえて、より良い環境を構築した記事を書きました
Google Apps ScriptへCI経由でデプロイする (1年半後)
やりたいこと
- Google App Scriptのソースコードをgit管理したい
- それらのコードをCI経由でGoogle App Scriptにデプロイしたい
どうやったか
node-google-apps-scriptを使うと手元のファイルをGoogle App Scriptにアップロードできるようになるので、同じことをCI上で行うようにします
CIは何でも良いですが、今回はbitbucket pipelinesを使いました
結果的にclient_secretなどをソースコードに含める必要があったため、publicなリポジトリのプロジェクトなどでは採用できない手法となってしまいました
1. node-google-apps-scriptをセットアップする
こちらの記事が大変参考になりました
GoogleAppsScriptローカル開発用の公式CLI(node-google-apps-script)がついに登場したので試してみる
http://qiita.com/zaki-yama/items/9a301542137febd8876c
この記事の通りに準備すると、ローカルからファイルのアップロードができるようになります
まずはローカルからのアップロードができるまで準備します
2. ~/.gapps
をリポジトリにコミットする
この記事の肝はこの設定です
記事の通りにセットアップすると、~/.gapps
というファイルが生成されます
gapps upload
の際にこのファイルを参照して認証をしているので、CIでも必要になります
なので、cp ~/.gapps path/to/repo
などでリポジトリに含めます
.gapps
にはclient_secret
やrefresh_token
といった情報が含まれているので、できればリポジトリには含めず環境変数などで制御したかったのですが、軽くソースコードを見た感じだとそのようなオプションは無いようでした
- https://github.com/danthareja/node-google-apps-script#common-issues
- https://github.com/danthareja/node-google-apps-script/search?utf8=%E2%9C%93&q=STORAGE_FILE&type=Code
いつかプルリク出したいところです
3. CI上で~/.gapps
を参照できるようにする
bitbucket pipelinesの場合は下記のコードだけでOKでした
image: node:4.3.2
pipelines:
default:
- step:
script:
- npm install
- npm run upload-from-ci
"scripts": {
"upload-from-ci": "cp .gapps ~/.gapps; gapps upload"
},
リポジトリの.gapps
をそのまま~/.gapps
へコピーしています
CIはどれでも大丈夫と書きましたが、ホームディレクトリへの書き込み権限がないと無理ですね...
ここまでできればCI上からデプロイができます!
注意点
webアプリケーションとして公開しているGASアプリの場合、ソースコードのアップロードだけでは反映されません
アップロード後にプロジェクトバージョンを新しくする必要があります

これはAPIも用意されてないっぽいですね...
トリガーで発火しているコードに関しては、uploadするだけで問題なく更新されるようでした
感想
GASのおかげでサーバの準備不要でお手軽にスクリプトを動かせるは大変ありがたいですね!
今回はちょっとしたslack botをGASで動かしていたのですが、少しコードベースが大きくなってきたタイミングでgit管理がしたくなり、この方法を導入しました
やってみて、git管理やCI運用を導入したくなった時点で既にGASで動かすには不適切な規模感なのかなと感じました
お手軽にサクッとスクリプトを動かせるのが良い点だと思うので、その良さを活かせるような使い方を意識して使おうと思いました!