now

`now alias`がおかしいので、正しく動作するシェルワンライナー

now alias がおかしい

保存していたキャプチャがどっかいってしまったので曖昧ですが、now2からnow aliasargument ...みたいなエラーになりnow alias <url> <alias>でやらないと効かなくなってしまいました。

その後、https://github.com/zeit/now-cli/issues/1701こういうものができたのでyarn global add nowで更新し、now aliasは治りましたが、対象のurlが何故か古いものになってしまいます。

解決シェルワンライナー

これです。

now -n appname \
&& sh -c 'now ls appname | while read line; do if echo \"$line\" | grep \"appname-\" > /dev/null; then set $line; echo \"$2\"; break; fi; done;' | xargs -I@ now ln @ appname \
&& now rm appname --safe --yes

1行目

これはただデプロイしてるだけです。ちなみに-nはアプリ名(appname)を指定してます。

2行目

now ls appnameでこのアプリの全部のurlを含む詳細一覧を出します。その一覧を1行ずつ見ていってappname-が含まれている部分が来たらそれが最新のurlを含む行なので、そこからurlを取り出しnow lnへ渡します。

3行目

最後にデプロイしたもの以外(過去にデプロイした古いアプリ)を全部削除します。

自分のログイン済Nowを扱えるプライベートDockerイメージを作る

動機

nowはCLIを提供していてくれてすごく便利なんですけど、ログインするのに入力が必要な感じなのでcliだけで自動処理させようとか思っても無理です。APIはあるので、一時期自作してましたがメンテナンスが面倒くさいのでやっぱりどうしても公式のを使いたい。

5分で作れる

方法は以下の通り

  1. 公式のnodeイメージを使ってコンテナを走らせる
  2. 中でnowにログイン
  3. docker commit
  4. DockerHubへpush

DockerHubへプッシュ前にプライベートリポジトリを作っておくのと、docker loginはしておく必要があります。

コンテナを走らせる

以下のようなコマンドで立ち上げて中に入ります。--nameには分かりやすい名前を付けるといいです。

docker run -it --rm --name now node:10 /bin/sh

nowにログイン

中にはいったらまずnowコマンドをインストール。そしてnow loginと実行するとメールアドレスを聞かれるので入力して認証します。

yarn global add now
# [1/4] Resolving packages...
# [2/4] Fetching packages...
# [3/4] Linking dependencies...
# [4/4] Building fresh packages...
# success Installed "now@11.4.0" with binaries:
#       - now
now login
# > Enter your email:

認証が終わった直後の状態をイメージ化

ここまで終わったら一旦コンテナから抜けます。抜ける方法はctrl+p`ctrl+qです。exitしちゃったりしたら最初からです。 そしてdocker commitします。以下のコマンドはnowという名前のコンテナからnju33/now`というイメージを作るというような意味です。名前はDockerHub上に作ったリポジトリと同じにします。

docker commit now nju33/now

できたら以下のコマンドで出てくるか確認します。

docker image ls
# REPOSITORY                 TAG                 IMAGE ID            CREATED             SIZE
# nju33/now                  latest              xxxxxxxxxxxx        3 days ago          790MB

DockerHubへプッシュ

以下のようにイメージ名を指定してpushするだけです。

docker push nju33/now

使用例

# 一覧
docker run --rm nju33/now now ls
# static deploy
docker run -it --rm -v `pwd`/src:/root/src nju33/now now /root/src