この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
こんにちは、大前です。
以前、Clasp という Google Apps Script をローカル管理できる CLI ツールを紹介しましたが、今回はこれを使った CD の仕組みを作ってみましたので、ブログを書いていきます。
claspを使ったGoogle Apps Scriptのソース管理を試してみた
構成
下記の構成となります。
- GitHub 上の特定の操作が発生
- CodeBuild が起動
- CodeBuild から EC2 上のシェルスクリプトを実行
- EC2 上で最新のソースを GitHub からクローン
- Clasp を利用して GAS にデプロイ
何だかまわりくどい構成になっていますが、Clasp を使用するために叩く「clasp login」で必ずブラウザでの操作が必要となってしまい、ログイン状態を保持するために EC2 上で処理を行う形になっています。
GitHub Actions 等でうまくやる方法もあるのかもしれませんが、現時点では見つけられませんでした。
これより良い方法があれば教えてください。。。
とはいえ、上記構成でも GAS の CD という目的は達成できますので、実際にやっていきたいと思います。
やってみた
前準備
Google Apps Script プロジェクトの用意
GAS のプロジェクトを作成しておきます。今回は下記の様な「clasp-test」プロジェクトを用意しました。
プロジェクトの作成方法はこちら。
Git リポジトリの用意
GAS のソースを管理するリポジトリを用意します。
今回は、下記の様なディレクトリ構造にしました。/gas 配下が GAS にデプロイされる様にする予定です。
$ tree
.
├── README.md
├── buildspec.yml
└── gas
├── appsscript.json
└── main.js
1 directory, 4 files
CodeBuild と連携するため、buildspec.yml のみ必須です。あとはお好みで。
EC2 の構築
まずは EC2 を構築します。細かい手順は省きますが、以下の様な構成を作成しました。
EC2 上で git や clasp を叩く必要があるため、色々とインストールをしていきます。
今回は、SSM を使える様に設定をし、セッションマネージャーにて行いました。
yum アップデート
sh-4.2$ sudo su ec2-user
[ec2-user@ip-10-10-2-163 bin]$ cd ~
[ec2-user@ip-10-10-2-163 ~]$ sudo yum update -y
nodejs インストール
clasp を npm でインストールするため、nodejs をインストールします。
チュートリアル: Amazon EC2 インスタンスでの Node.js のセットアップ
[ec2-user@ip-10-10-2-163 ~]$ curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.34.0/install.sh | bash
[ec2-user@ip-10-10-2-163 ~]$ . ~/.nvm/nvm.sh
[ec2-user@ip-10-10-2-163 ~]$ nvm install node
[ec2-user@ip-10-10-2-163 ~]$ node -e "console.log('Running Node.js ' + process.version)"
[ec2-user@ip-10-10-2-163 ~]$ npm -v
6.14.4
git インストール
[ec2-user@ip-10-10-2-163 ~]$ sudo yum install -y git
[ec2-user@ip-10-10-2-163 ~]$ git --version
git version 2.23.1
git clone
ssh で git clone 等を行うため、鍵の生成を行なっています。
生成した公開鍵は GitHub に登録しておきます。
[ec2-user@ip-10-10-2-163 ~]$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/ec2-user/.ssh/id_rsa):(Enter)
Enter passphrase (empty for no passphrase):(Enter)
Enter same passphrase again:(Enter)
Your identification has been saved in /home/ec2-user/.ssh/id_rsa.
Your public key has been saved in /home/ec2-user/.ssh/id_rsa.pub.
[ec2-user@ip-10-10-2-163 ~]$ git clone git@github.com:xxxxxxxx/clasp-test.git
[ec2-user@ip-10-10-2-163 ~]$ ls
clasp-test
clasp インストール
[ec2-user@ip-10-10-2-163 ~]$ npm install -g @google/clasp
[ec2-user@ip-10-10-2-163 ~]$ clasp -v
2.3.0
clasp login
clasp の初期化作業になります。
clasp login を実行すると「https://accounts.google.com/〜〜」といったリンクが表示されるので、そのリンクをブラウザで開きます。
画面の指示にしたがって認証を進めるとコードが表示されるので、そちらを入力するとログイン成功となります。
[ec2-user@ip-10-10-2-163 ~]$ mkdir ~/clasp
[ec2-user@ip-10-10-2-163 ~]$ cd ~/clasp
[ec2-user@ip-10-10-2-163 clasp]$ clasp login --no-localhost
Logging in globally...
Authorize clasp by visiting this url:
https://accounts.google.com/xxxxx.....
Enter the code from that page here: xxxxxxxxxx
Authorization successful.
Default credentials saved to: ~/.clasprc.json (/home/ec2-user/.clasprc.json).
clasp clone
「xxxxx」部分には、対象の Google Apps Script プロジェクトID を指定してください。
ID の確認方法はこちら。
[ec2-user@ip-10-10-2-163 clasp]$ clasp clone xxxxxxxx
Warning: files in subfolder are not accounted for unless you set a '.claspignore' file.
Cloned 2 files.
└─ appsscript.json
└─ main.js
Not ignored files:
└─ appsscript.json
└─ main.js
Ignored files:
└─ .clasp.json
シェルスクリプト配置
CodeBuild から実行させるスクリプトを配置します。
[ec2-user@ip-10-10-2-163 clasp]$ cd ..
[ec2-user@ip-10-10-2-163 ~]$ vi ~/release.sh
スクリプトの内容は下記です。
- GitHub から最新のソースを pull
- clasp で GAS の最新ソースを pull
- GitHub から pull したソース(今回は/gas配下)を clasp ソースに上書き
- clasp で GAS に push
#!bin/sh
echo "[release] start"
echo "[git pull] start"
cd ~/clasp-test
git checkout master
git pull
echo "[git pull] finish"
echo "[clasp pull] start"
cd ~/clasp
clasp pull $1
echo "[clasp pull] finish"
echo "[clasp push] start"
cp ~/clasp-test/gas/*.js .
clasp push
echo "[clasp push] finish"
echo "[release] finish"
Security Group の設定
CodeBuild から EC2 に SSH できる様に Security Group を設定します。
CodeBuid 用
EC2 用
パラメータストアの設定
CodeBuild に EC2 の秘密鍵と GAS のプロジェクトID を渡す必要があるため、SSM パラメータストアでパラメータを作成しました。
Clasp-Test-SSHKey(EC2秘密鍵)
Clasp-Test-ProjectId(GASプロジェクトID)
CodeBuild の設定
最後に、CodeBuild の設定を行います。
ビルドプロジェクトの作成より、プロジェクト名は「Clasp-Test-AutoDeploy」とします。
送信元は、ソースプロバイダを GitHub、GitHub リポジトリに対象のリポジトリを指定します。
GitHub への接続がまだの方は、画面の指示にしたがって接続を行なってください。
プリマリソースへのウェブフックイベントを有効にし、イベントタイプは「プッシュ」、HEAD_REF に「^refs/heads/master$」を指定しました。
こうすることで、master ブランチへのプッシュ時のみビルドがトリガーされます。
環境イメージは Amazon Linux2 のマネージドイメージを指定します。カスタムイメージでも良いと思います。
サービスロールは新しいものを作成しますが、パラメータストアから Get を行う権限を後ほど追加してあげる必要があります。
VPC を指定します。サブネットは EC2 が存在するプライベートサブネット、SG は先ほど作成した CodeBuild 用の SG を指定します。
「VPC 設定の確認」をクリックし、問題なければおkです。
環境変数に先ほど作成したパラメータストアを指定します。「名前」が buildspec.yml で参照される値で、「値」がパラメータストアで作成したパラメータ名です。
ここまで設定したら、ビルドプロジェクトの作成をします。
また、buildspec.yml は以下になります。「xx.xx.xx.xx」には構築した EC2 のプライベートIP を記載してください。
version: 0.2
phases:
pre_build:
commands:
- echo "${SSH_KEY}" > ~/.ssh/ssh-key.pem
- chmod 0700 ~/.ssh
- chmod 0400 ~/.ssh/ssh-key.pem
build:
commands:
- ssh -i ~/.ssh/ssh-key.pem -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null ec2-user@xx.xx.xx.xx -p 22 "sh ~/release.sh ${GAS_PROJECT_ID}"
IAM ロールへのポリシー追加
ビルドプロジェクト作成時に作成された IAM ロールに、パラメータストアへのアクセス権限を追加します。
今回は「AmazonSSMReadOnlyAccess」を追加しました。
動作確認
全ての設定が完了したので、動作確認をしてみます。
今回は、既存の main.js を編集するのと、新規ファイル(add.js)を追加してみました。
$ vi gas/main.js
$ cat gas/main.js
function myFunction() {
// add comment
}
$ vi gas/add.js
$ cat gas/add.js
// add file
$ git add gas/.
push します
$ git commit -am 'test'
$ git push
push されると、CodeBuild のコンソールにて、ビルドが実行されているのが確認できます。
少し待つと、ビルドが成功しました!(一度失敗してやり直したため、上記スクショとビルド番号が異なっています。。)
GAS プロジェクトを更新してみると、GitHub にプッシュした内容が反映されていることも確認できます。
おわりに
clasp + GitHub + CodeBuild を組み合わせた Google Apps Script の CD を試してみました。
もっとうまくできるかもしれませんが、やりたかった clasp での CD が実現できたので、とりあえず満足です。
以上、AWS 事業本部の大前でした。