CircleCIを使って、Middlemanで作ったものをrsyncでデプロイする

やぎすけAdventCalendar2016 middleman

Posted on Dec 19


こんにちは、やぎにいです。 やぎすけ Advent Calendar 2016の19日目です。
私事ですが、今朝Nexus5Xがbootloopに陥って死にました。
docomoで買ってたので、持ち込んで修理見積もり出しました。見積もり結果は年明けらしいです。つらいですね。
今年もガジェット運はダメダメでした。

昨日は僕がRaspberryPiを使って、家に超A&G+を垂れ流す環境を作ったを書きました。

今日はこのブログを自動でデプロイするお話です。


はじめに

僕はこのアドベントカレンダーで17日目にMac上でMiddlemanを使ってCentOSにホストするとNFD問題にぶち当たるという記事を書きました。
結果はMacでビルドしたのをそのままCentOSでホストすると死ぬ。ということだったので、じゃあMacでビルドをやめようという発想に至りました。

今までの環境だと、Macで記事を書く→Mac上のMiddlemanでビルド→CentOSへMacからrsyncという形を取っていました。
が、このブログはGitHub - yagi2/blogのリポジトリで管理している、つまり書く度にリモートのリポジトリにpushしているのでせっかくだしCIで自動デプロイしようと思いました。

使用するのはCircleCIです。理由は特にないです。
最初はうなすけが書いていたうなすけとあれこれ - CircleCIでmiddlemanのdeployを自動化したを参考にしようと思ったのでCircleCIを登録だけしていました。
上記事ではmiddleman-deployを使用していたのですが、不便なのとMaintenanceがあまりされてないという理由でやめました。
不便というのは、例えばrsyncはssh通したときに鍵を指定したく鳴る時があり、rsyncのコマンドでは$ rsync -e "ssh -i /path/to/key"とかで書けるわけですが、middleman-deployでは鍵の指定コンフィグが見つからなかったので最初はdeploy.flags = '-rltgoDvzO --no-p --del -e "ssh -p PORT_NUM -i /path/to/key'とか指定してました。こんなものflagではない。

今回は純粋にcircle.ymlに書いてあげました。


手順

circle.ymlを用意する

今回はテストとか考えずとりあえずデプロイをしたかったので以下のとおりです。

1
2
3
4
5
deployment:
  push_to_server:
    branch: master
    commands:
      - rsync -rltgoDvzO --no-p --del -e "ssh -p $PORT_NUMBER" build $USER_NAME@$HOST_NAME:$DOCUMENT_ROOT

CircleCIのWeb上から環境変数を設定する

上記の設定では

  • PORT_NUMBER(rsyncで使うsshポート番号)
  • USER_NAME(sshでのログインユーザ名)
  • HOST_NAME(デプロイ先のホスト名)
  • DOCUMENT_ROOT(デプロイするドキュメントルートのパス)

の4つを変数としているので、これらをCircleCIのWebページから設定します。
circle.ymlでも設定できるのですが、このブログはオープンソースなので外部に漏れるとまずいのでこの手順を踏んでいます。特に公開してないという場合は直書きしてあげてもいいかもです。
projectのBUILD SETTINGSにEnvironment Variablesという項目が存在するので、ここに上記の4つを設定しました。

なんとこの2手順で完了してしまいました。
あとはmasterブランチにコミットしてpushするだけです。
非常に便利ですね。


これから

今のところNo TestなのでなんかこれCircleCIでいいのか……?という感じがしています。
テストを書くか、なんか他の自動でデプロイするのを目的としたツールを使うべきなのかなとか早くも思いはじめています。

ちなみにうなすけが、このアドベントカレンダーの記事として14日目にうなすけとあれこれ - このblogのCIをCircle CIからwerckerに変更しましたという記事を出しています。
このCircleCIでの自動デプロイに苦戦している時に1歩未来に行かれました。
が、僕は今のところCircleCIでデプロイされるまでに1分30秒くらいなのであまりこれに関しては困っていないです。
今後もいろいろ模索していきたいと思います。

以上、やぎにいでした!



comments powered by Disqus

<< 今更理解するREST(ful)について     RaspberryPiを使って、家に超A&G+を垂れ流す環境を作った >>



2016 やぎ小屋