30億のデバイスで走るHonMarkHunt

JavaとJavaScriptと恐竜の絶滅について書いていきます。

now.shとCircle CIで継続的音速サービスリリース

f:id:HonMarkHunt:20181201173532p:plain:w200

この記事は 2018年 Shinjuku.LTアドベントカレンダー の1日目の記事になります!

2日目の記事はこちら =>

vue-cliとNetlifyで始めるお手軽サイトホスティング - Qiita

Shinjuku.LTってなに?って方はこちら => https://shinjukult.netlify.com

はじめに

Shinjuku.LTはコミュニティーのサイトをOSSとして開発しています!

github.com

簡単な構成

f:id:HonMarkHunt:20181201181102p:plain

本日はバックエンドのリリースフローを簡単にご紹介します!

https://github.com/shinjuku-lt/shinjuku-lt-backend

  1. now.shでデプロイ
  2. Circle CIで自動化

1つづつ見ていきましょう!

now.shでデプロイ

zeit.co

now.shって何?

now.shはzeit(ツァイト?)社が作成しているPaaSです。一言で説明すると 「コマンド一つでデプロイできるサービス」 できます。超早いし、超楽です。最高。あと無料です。無敵。

これは個人的な感想ですが、趣味や勉強で開発しているプロダクトであれば現状最高のプラットフォームだと思います。

  • node.js ()
  • static page
  • docker

でできたプロダクトであれば利用できます。

簡単にやってみましょう!

# install now.sh
$ npm install now -g

# 適当にexpressのアプリを作成
$ mkdir myapp
$ cd myapp
$ npm init
$ npm install express --save

index.jsを作成し以下の内容を記載

const express = require('express')
const app = express()
const port = 3000

app.get('/', (req, res) => res.send('Hello World!! from now.sh!!'))

app.listen(port, () => console.log(`Example app listening on port ${port}!`))

念の為起動確認

$ node index.js

$ curl http://localhost:3000
> Hello World!! from now!!

アプリができたので早速デプロイしてきましょう!

$ now
> Synced 3 files (13.25KB) [1s]
> https://myapp-xxxxxxxxxx.now.sh [v2] [in clipboard] [1s]
> ┌ **        Ready               [499ms]
> ├── package-lock.json
> ├── index.js
> └── package.json
> Success! Deployment ready [8s

# 念の為動作確認
$ curl https://myapp-xxxxxxxxxx.now.sh
> Hello World!! from now!!

デプロイが終わりました!!(nowコマンドは初回のみ) こちらがデプロイ後のURLです! => https://myapp-xxxxxxxxxx.now.sh

Circle CIで自動化

now.shを使用してデプロイが完了しました しかし色々問題が残っているので解消しましょう!

nowコマンドでデプロイした後の改善点

  1. チームで安定的なデプロイができない
  2. ドメインが固定されない
  3. デプロイがローカル依存になる

この辺解決しながらCircle CIで自動化していきます。

チームで安定的なデプロイができない

nowコマンドはlocalの~/.now/auth.json中身を見て実行されます。複数人で同一プロダクトを開発する場合かなり厄介です。 また、CIからnowコマンドを実行しようとした場合認証情報がないのでエラーになり、メールでの認証も行えないのでコマンドが実行できません。

$ now -t ${YOUR_TOKEN}

ここからtokenを払い出してloginしていなくても、CI上からでもnowコマンドが実行できます!

ドメインが固定されない

nowコマンドでデプロイすると基本的にはhttps://myapp-xxxxxxxxxx.now.shランダムなURLが毎回発行されます。サービスのURLがデプロイのたびに変わっていたら由々しき事態なので毎回固定しましょう。

$ now alias ${ALIAS_YOU_WANT}

毎回コマンド打つと大変なのでnow.jsonで固定できます。

https://github.com/shinjuku-lt/shinjuku-lt-backend/blob/master/now.json

デプロイがローカル依存になる

チーム開発などの場合にはデプロイのたびにnowのインストールとtokenの共有が必要になります。 GitHubでPRレビューなどした場合は、レビューが終わってマージ後に手動でデプロイ。などのめんどっちいオペレーションが発生します。 せっかくの音速デプロイなので完全自動化しましょう!

GitHubのmasterの変更をtriggerにCircle CI(CIは別になんでもいいと思います)を設定して、環境変数に先ほどのtokenを登録して置くだけでデプロイの自動化ができます!

サンプルで、Shinjuku.LTのバックエンドで利用しているCircle CIの設定を貼っておきますのでご参考になさってください!

https://github.com/shinjuku-lt/shinjuku-lt-backend/blob/master/.circleci/config.yml

version: 2
jobs:
  build:
    docker:
      - image: circleci/node:8.9

    branches:
        only:
          - master

    working_directory: ~/repo

    steps:
      - checkout

      - run:
          name: install now
          command: sudo npm i -g --unsafe-perm now

      - run:
          name: deploy asap now!!
          command: |
            now shinjuku-lt/shinjuku-lt-backend --public -t ${ZEIT_TOKEN}
            now alias -t ${ZEIT_TOKEN}

最後に

now.shとCircle CIで無料で高速デプロイする方法を紹介しました!ちなみにnow.shは最新バージョンの2.0がリリースされており。現在移行作業中です。

now.sh 2.0 を利用中の場合は本記事の内容が正しく動作しない場合があるかもしれませんのでご注意ください。