また会ったな。この記事は PMOB Advent Calendar 3日目の記事です。
やること
おとといのやつ のCI/CDです。 いちいちデプロイするのめんどくさいので、 masterブランチが更新されたら勝手にデプロイされるようにしましょう。
まずgithub.com側の設定
とりあえずワークフローの整備をします。masterを保護するのです。
- masterへのpushの禁止
- masterへのPRのマージは私のレビュー必須
こんなところで良いでしょう。

設定しました。
では本番のCI/CDを設定するぞ。
werckerでCI/CDの設定
wercker使います。個人的なプロジェクトはwerckerに寄せているためです。 設定する項目は2個。
- PRに対してstatus check
- masterのpushに対してデプロイ
テストを未実装なので、1つめに関してはlintだけ走らせようと思います。
ではとりあえずwerckerでアプリケーションを追加します。
https://app.wercker.com/applications/create
ではlintから実装
lintのCI設定
wercker.ymlを書きます。 ベースイメージは、CFsがNode8らしいのでnode8で。
box: node:8.14.0-alpine
build:
steps:
- npm-install
- npm-test
- script:
name: echo nodejs information
code: |
echo "node version $(node -v) running"
echo "npm version $(npm -v) running"
イメージ以外サンプルのコピペです。便利ですね。
npm test
が未実装なので実装しましょう。
yarn add -D eslint
して、package.json
に "scripts"
を追加します。
{
"scripts": {
"test": "npm run lint",
"lint": "eslint ."
}
}
"test"
で直接lintしないのは、lintと別にテストはちゃんと実装しないとな、という気持ちです。
きっとしないんだろうけどな。
あとは eslint --init
して適当な .eslintrc.js
を作ってカスタマイズします。
no-console
とか、stackdriverに書きたいからdisableしました。
全て設定できたので wercker cli でチェックしてみましょう。
❯❯❯ wercker build
...(略)...
--> Running step: npm-test
> slack-bookmark@ test /pipeline/source
> npm run lint
> slack-bookmark@ lint /pipeline/source
> eslint .
--> Running step: echo nodejs information
node version v8.14.0 running
npm version 6.4.1 running
--> Steps passed: 191.38s
--> Pipeline finished: 194.42s
パイプラインが通りました。 grpc周りはC++のビルド環境が必要なので素のalpineでコケたりしますが、lintには関係ないので今は無視。 これを回避したかったらstretch使えば大丈夫です。
CD設定
werckerからのデプロイ方法はだいたいこれを参考にします。
deploy:
box: google/cloud-sdk:alpine
steps:
- create-file:
name: create credentials.json
filename: credentials.json
overwrite: true
hide-from-log: true
content: $GCLOUD_CREDENTIALS
- script:
name: deploy to google functions
code: |
gcloud auth activate-service-account $GCLOUD_SERVICE_ACCOUNT --key-file credentials.json --project $GCLOUD_PROJECT_ID
gcloud functions deploy slackBookmark --runtime nodejs8 --trigger-http
gcloud functions deploy slackBookmarkPickRandomly --runtime nodejs8 --trigger-http
こんな感じ。変更したのが slackBookmark
部分だけでも両functionsデプロイされてしまうのが微妙ですが、まあ今は良いでしょう。
ここでwerckerによるCDのためのservice accountが必要になります。
roleは Cloud Functions Developer
があればデプロイできます。
発行した情報を使い、werckerのGUIからデプロイのためのアカウント情報を埋めます。
注意点として、発行したcredentialの \
部分は \\
に書き換えないと正常なjsonにならないのでご注意ください。
key | value |
---|---|
GCLOUD_CREDENTIALS |
発行したservice accountのcredential(json) |
GCLOUD_SERVICE_ACCOUNT |
今作ったservice accountの名前 |
GCLOUD_PROJECT_ID |
デプロイ対象のプロジェクトID |
設定ができたら wercker.yml
を含んだコミットをpushします。
push後、werckerのGUIからmasterにpushがあった時にdeployするように設定します。 pipelineを追加したあとにworkflowの設定で、build後にブランチがmasterだったらdeploy的な。

おk
試してみる
このコミット が反映されたらよしとします。

あっやべus-central1に投げちった。 コマンドで指定します。

できたくさい。
IAMのドキュメントとか読みながら、2時間以上かかりました。実装の倍やでえ。 しかしデプロイ手順を脳から飛ばしてよくなりました。 自動化楽しいしな。
余談
wercker、初速があったので成長を見越してサービス開始当初から使い始めていましたが、 1年ちょい前からUI改善や機能追加、ドキュメンテーション更新などが殆どない気がします。 近いうちに全部Circle CIに移そうかなーと思っています。