Adways Advent Calendar 2018 1日目の記事です。
http://blog.engineer.adways.net/entry/advent_calendar_2018
GASとGitLabの連携をGitLab-CIとClaspを使って連携する方法
こんにちは。
インフラ系の部署で既存インフラのコード化を進めている戸田です。
5年待ったゲームの発売まであと53日で夜もねれません(あれこんなこと前もいったような
今回はコード化じゃないですけど
はじめに
インフラではGASを使うことがたびたびあります。
そして、弊社ではGitLabを使用しています。
今回は、GASをGitLabで管理したいなー
あわよくば、便利機能を作成したいなーといった感じで思い立って試行錯誤しました。
そのことを書きたいと思います。
やること
といったことをしたいと思います。
あとは、GASはアクセスできたらブラウザ上で変更ができてしまいます。
もし変更された際にSlackに通知をする仕組みも一緒に行いたいと思います。
そうすることで、GitLabとGASのコードを一緒にするためです。
使うもの
- clasp
- GitLab Community Edition 11.2.3
- GAS(マイドライブではなく、チームドライブ上にあるもの
- Slack Incoming Webhooks
claspで設定すること
自分のPCで設定します。
インストールに関しては割愛します。
まず、GitLabで管理するためにGASをclaspでローカルに持ってきます。
cat ~/.clasprc.json
これはGitLab-CIで設定するために必要なので、tokenをメモしておきます。
GitLab-CIでやること
GitLabは".gitlab-ci.yml"というファイルをディレクトリのルートに配置して、PushするとCIが自動的に動く仕組みになっています。 ファイルの構成はこんな形です。
|-- .gitlab-ci.yml
|-- README.md
|-- gitlab-ci
| |-- diff.sh
| `-- slack.sh
`-- GASのファイル
|-- 〇〇.js
|-- △△.js
|-- ☓☓.js
#!/bin/sh git diff master --exit-code --quiet || echo 'GASに変更を確認しました' | . gitlab-ci/slack.sh
これは、 [10分で出来る]シェルスクリプトの結果をslackに投稿 - Qiita を参考にさせて頂きました。
#!/bin/sh
set -eu
WEBHOOKURL="Incoming webhhoks のURLを入れる
### 見出しとなるようなメッセージ
set -eu;
WEBHOOKURL="";
### slack 送信チャンネル
CHANNEL=${CHANNEL:-"#好きなチャンネル"}
## slack 送信名
BOTNAME=${BOTNAME:-"GAS警察"};
### slack アイコン
ICON='icon_emoji';
FACEICON=${FACEICON:-":male-pilot:"};
MESSAGE=${MESSAGE:-""};
MESSAGEFILE=$(mktemp -t webhooks.XXXXXX);
trap "
rm ${MESSAGEFILE}
" 0;
function usage_exit ()
{
echo "Usage: $0 [-m message] [-c channel] [-i icon] [-n botname]" 1>&2;
exit 0
};
while getopts c:i:n:m: opts; do
case $opts in
c)
CHANNEL=$OPTARG
;;
i)
FACEICON=$OPTARG
;;
n)
BOTNAME=$OPTARG
;;
m)
MESSAGE=$OPTARG"\n"
;;
\?)
usage_exit
;;
esac;
done;
if [ -p /dev/stdin ]; then
cat - | tr '\n' '\\' | sed 's/\\/\\n/g' > ${MESSAGEFILE};
else
echo "nothing stdin";
exit 1;
fi;
WEBMESSAGE='```'`cat ${MESSAGEFILE}`'```';
curl -s -S -X POST --data-urlencode "payload={\"channel\": \"${CHANNEL}\", \"username\": \"${BOTNAME}\", \"${ICON}\": \"${FACEICON}\", \"text\": \"${MESSAGE}${WEBMESSAGE}\" }" ${WEBHOOKURL} > /dev/null
実際に動かすものは以下のファイルです。
---
stages:
- diff
- deploy
diff:
stage: check
image: node:9
before_script:
- npm i npm@latest -g
- npm i @google/clasp -g
script:
- echo $CLASP_TOKEN > ~/.clasprc.json
- cd GASのファイル && clasp pull
- . gitlab-ci/diff.sh
- clasp logout
only:
- schedules
deploy:
stage: deploy
image: node:9
before_script:
- npm i npm@latest -g
- npm i @google/clasp -g
script:
- echo $CLASP_TOKEN > ~/.clasprc.json
- cd GASのファイル && clasp push
- clasp logout
only:
- master
Settings -> CI/CDにvariablesがあります。
ここにtokenを設定をします。
設定すれば、gitlab-ci上でもこのtokenを利用して、
ローカルと同じようにclaspが動きます。

実際に動かしてみる
あとはスケジュールを設定すれば、定期的にチェックするためのスクリプトを実行してくれます。 もし、自動で変更されたら通知してくれます。

こんな風に、教えてくれます。
しようとしてできなかったこと
といった感じで、実際にチームドライブ上のGASをコピーしようとしました。
- しかし、claspで新しく作ろうとするとマイドライブ上にしか作られない
- 他のツール(rclone)も試しましたが、チームドライブには対応してもGASの作成やコピーには対応していない
- ならば、APIを使って、本番のGASをコピーすればいいじゃないかと思って試すが、コピーできるが、一番上の階層にしか作成されない
- ならばならば、APIを使って、移動されたらいいじゃないかと思い、試しましたが移動するAPIがない
といった問題点があり、GASのコピーと移動を断念しました。
GASが複製できたら、簡単にテストなどできて楽だな~と思っていたので、残念です。(2018/11/28 現在)
感想
CI/CDのCDの部分ができました。
そのうち、APIでGASが移動できるようになったら、GASを分けれて本番に影響なくテストできるので、してみたいです。
あと、DockerのイメージをGitLabを登録にできるので、テストするスピードも上がると思います。TypeScriptを使って、GASのテストとかできるといいかもしれませんね。
まとめ
GitLabとGASの連携をは意外と簡単にできました。 コード管理ができて、自動でデプロイできるのはすごくありがたいです。
以上となります。 最後までご覧いただきありがとうございます。
次は大曲さんの記事です。
http://blog.engineer.adways.net/entry/advent_calendar_2018/02

