うなすけとあれこれ

2015年11月23日

CircleCIでmiddlemanのdeployを自動化した

Circle ci

まずはdeploy方法

さてmiddlemanでbuildした記事は、どこかにdeployしないと公開されません。github pagesでもいいですし、herokuでも、Amazon S3でもいいでしょう。

ただ、僕はさくらのVPS上でh2oを動かしているので、それにそったdeployをする必要があります。

middleman-deploy

どのような方法でdeployするにしても、middleman-contrib/middleman-deployを使うことになると思います。これは便利です。

rsyncを用いてdeployしようと思い、このような設定をconfig.rbに書きました。

activate :deploy do |deploy|
  deploy.method       = :rsync
  deploy.host         = "blog.unasuke.com"
  deploy.path         = "/var/www"
  deploy.user         = ENV["MIDDLEMAN_USER"]
  deploy.port         = ENV["MIDDLEMAN_PORT"]
  deploy.flags        = '-rltgoDvzO --no-p --del'
  deploy.build_before = true
end

deploy.userdeploy.portが環境変数になっているのは、一応このblogのリポジトリは公開になっていて、この設定も誰でも見られるようになっている状態で、sshが繋がるポートを明記するのが危険だからです。

この状態で、

$ bundle exec middleman deploy

を実行すると、buildされ、deployされます。

自動化

さて、これをいちいち手でやるのは面倒です。なので、CIサービスを使って自動化してやります。今回はCircleCIを選びました。理由は使い慣れているからです。

とはいっても、masterにmergeされたら自動でdeployくらいの設定なら、こんなにも書かなくてよく、多分、ただdeploymentの項目だけ書けばいいと思います。

machine:
  timezone: Asia/Tokyo

  ruby:
    version: 2.2.3

dependencies:
  pre:
    - gem install bundler -v 1.10.6

  override:
    - bundle install --jobs=4

test:
  override:
    - bundle exec middleman build

deployment:
  publish:
    branch: master
    commands:
      - bundle exec middleman deploy

ただ、よくわからないのは、この場合testとして何を実行すればいいのか、ということです。今はbundle exec middleman buildが成功することをテストのpassと見なしていますが、Circle CIではこの前段階にcompileとしてmiddleman buildが行われてしまうので、2重にmiddleman buildが走ってしまい、時間の無駄です。(さらに、deploy.build_before = trueなので、計3回のbuildが走り時間の無駄)

まとめ

Tweet
2015年11月23日