werckerでCFsのCI/CD

gcp


また会ったな。この記事は PMOB Advent Calendar 3日目の記事です。

やること

おとといのやつ のCI/CDです。 いちいちデプロイするのめんどくさいので、 masterブランチが更新されたら勝手にデプロイされるようにしましょう。

まずgithub.com側の設定

とりあえずワークフローの整備をします。masterを保護するのです。

こんなところで良いでしょう。

設定しました。

では本番のCI/CDを設定するぞ。

werckerでCI/CDの設定

wercker使います。個人的なプロジェクトはwerckerに寄せているためです。 設定する項目は2個。

テストを未実装なので、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からのデプロイ方法はだいたいこれを参考にします。

WerckerからGAEにデプロイ

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に移そうかなーと思っています。