【GAS】 バージョン管理の方法（version, deploymentとは何か）

GAS開発をしていてGASのバージョン管理の概念の理解に困ったので備忘録的に残します。

## versionとは
ソースコードのセーブポイントを作成/管理する機能です。日本語では「版」と訳されています。
<img width="476" alt="スクリーンショット 2020-01-30 22.06.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111555/cde20452-078b-f437-967e-dd79f0cf6c3c.png">


`ファイル > 版を管理...` でversionの一覧を確認できます。
適当にgsファイルを編集した後に`save new version` でversionを作成しましょう。
説明文(description)にはバージョンを判別するための情報を入れておきます。
そうすると以下のように新しいversionが作成されるのが確認できるかと思います。（ここでは説明のため2つのversionを作成しました）
gitで言えばcommitのような機能ですね。

<img width="782" alt="スクリーンショット 2020-01-30 22.16.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111555/c5091159-ac28-9ad7-24e2-ece9b774ed92.png">

versionには`HEAD`と名前がつけられた特別なversionがあり、これはGASのエディタ上で確認できる最新のソースコードをさしています。

下の写真のようにトリガーを作成する際に、デプロイを選択する箇所で`Head`と出ているのは`GASエディタ上の最新のソースコードを実行する`という設定になるわけです。

<img width="767" alt="スクリーンショット 2020-01-30 22.31.16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111555/1507a8e1-c3fa-0029-c088-c770dc361e50.png">

ただ、実際に運用されているシステムにおいては、`ソースコードは変更したいが実行されるソースコードのversionは固定したい`ことの方が多いですよね。実行するデプロイが`Head`を参照しているとこれができません。
これを解決するためにdeploymentを使用します。


## deploymentとは

<img width="754" alt="スクリーンショット 2020-01-30 21.52.18.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111555/06cbec27-2826-1c42-318f-219beba82425.png">

GASエディタの`マニフェストから配置` で確認できるものがdeploymentの一覧になります。
デフォルトでは写真にあるようにHEADを参照しているdeploymentが一つ存在しています。
deploymentは`staging`や`production`などの`環境`に近い概念で、デフォルトで作成される`Latest Version`という環境は最新のソースコード（HEAD）を参照しています。

デフォルトのdeploymenは編集ができないので`create`から新しいdeploymentを作成しましょう。
ここでversionを指定することができますね。この`version1`を指定して`save`しましょう。

<img width="824" alt="スクリーンショット 2020-01-30 23.03.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111555/efa7e20d-979a-a096-0175-eed7156c2021.png">

これでversionが固定されたdeploymentが作成できましたね。
早速、トリガーに設定してみましょう。

<img width="749" alt="スクリーンショット 2020-01-30 23.03.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111555/99697adb-7b8e-c0e0-d85b-35d36b0fc2b7.png">

これはなぜだかわからないのですが、トリガー作成の際にリストに出てくるのは`deploymentの名前` ではなく `deploymentが参照しているversion`です。ここでは新しく作成した`バージョン1`を参照しているdeploymentを指定してトリガーを作成します。

<img width="1318" alt="スクリーンショット 2020-01-30 23.01.36.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111555/6bdcef08-6d3a-0e97-2f51-d126320cd530.png">


トリガーの一覧に作成したトリガーが表示されていますか？
作成したトリガーの`導入`（おそらくdeploymentの訳）が指定したdeploymentの参照しているversionをさしています。
このトリガーではバージョン1を参照しているdeploymentを実行するようになります。
これでHEADがどんな状態であろうが、このトリガーはバージョン1を実行してくれます。

## バージョンを変更したいときは
ここまでくれば、バージョン変更は簡単です。インシデントのが起きて元のバージョンに戻すとき、新機能をリリースするときも`deploymentが参照するversionを変更するだけ`です。
再び、GASのエディタで`公開 > マニフェストから配置`でdeploymentを編集しましょう。ここではversionを2に指定しています。

<img width="843" alt="スクリーンショット 2020-01-30 23.06.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111555/7e2d9e0d-6c6d-493d-ddd2-e1fd02567cd9.png">

保存が終了したら、トリガーの設定を確認しましょう。
トリガーの`導入`が`バージョン2`になってますよね？これで次回以降トリガーが実行される際はバージョン2で実行されます。

<img width="1291" alt="スクリーンショット 2020-01-30 23.08.31.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111555/1b69e861-7122-45a5-a19c-cc47305159da.png">

## 画面ポチポチするのは面倒くさい
そんなことを考えている人は[clasp](https://github.com/google/clasp)を使いましょう。
導入の方法などは[他の記事](https://qiita.com/HeRo/items/4e65dcc82783b2766c03)にお任せしますが、この記事で紹介した作業がコマンドで実行できるようになります。


```
// 手元のソースコードをHEADに適応する
$ clasp push

// HEADで新しいversionを作成する
$ clasp version

// deploymentsの一覧を取得
$ clasp deployments

// versionの一覧を取得
clasp versions

// deploymentが参照するversionを変更する
$ clasp deploy -i {deploymentId} -V {versionNo}
```