チームブログをGitHubとHexoではじめよう!
Tokyo Otaku ModeでEngineerやってますpchwです。
通常、チームで技術ブログを書こうとすると、
- 他の人からフィードバックをもらいにくい
- フィードバックをもらっても、どの部分への指摘かわからない
- 下書きをキャプチャした画像に赤入れされたのが送られてきた
- そもそもリッチテキストで書くのがダルい
など不幸な出来事が起こりがちです。
僕らは日々の開発と同じようなフローに則ってチームでブログを執筆する環境を整えたので、その方法を共有します。
Tokyo Otaku Modeでは、主にNode.jsを使って開発を進めています。
そのため、プラグインを書くのにもふだんの環境がそのまま使えるHexoというBlogging Frameworkを使って、ブログを執筆する環境を整えました。
HexoはNode.js製でOctopressの影響を受けて開発されています。
HexoもOctopressも、GitHub Pagesで採用されているJekyllという静的サイトジェネレータから影響を受けたものです。
そのため、GitHub Pagesを使ってのブログのホスティングがしやすくなっています。
インストール
HexoはNode.js製なので、Node.jsのインストールが必要です。
Node.jsのインストール方法は何通りかあるのですが、ここではnvmを使うことにします。
1 | $ curl https://raw.githubusercontent.com/creationix/nvm/v0.13.0/install.sh | bash |
これで、Node.jsがインストールできました。
次に、Hexoをインストールします。
1 | $ npm install -g hexo |
これで、hexo
コマンドが使えるようになります。
セットアップ
使えるようになったhexo
コマンドで、ブログのセットアップを行います。
1 | $ hexo init <blog名> |
と初期化コマンドを実行すると
1 | $ tree <blog名> -L 2 |
このように各種ファイルが生成されます。
(treeコマンドはディレクトリを階層構造をわかりやすく出力してくれるコマンドで、 brew install tree
でインストールできます。)
その後、依存パッケージのインストールします。
1 | $ cd <blog名> |
この状態で、すでにBlogが動く状態になります。
1 | $ hexo server |
http://localhost:4000/ にアクセスすると、
このような形になります。
設定
_config.yml
ファイルを編集することで、Blogの設定を変更できます。
詳細な設定値などはHexoのConfigurationページにまとまっています。
root
などの設定は、正しく設定しないとcssやjsのpathが不正になって正しく動作しないので、設定し忘れないように。
Deployの設定
_config.yml
ファイルの中にdeploy:
というセクションがあります。
ここを適切に設定すれば、hexo deploy
とすることで簡単にGitHub PagesやHeroku等に記事を上げることができるようになります。
1 | $ tail -n 8 _config.yml |
のように設定することで、GitHub PagesでOrganization Pagesを公開することできます。
(もちろん、先にGitHub上にRepositoryは用意しないといけません)
HerokuやRsyncなどを使ったDeployに関しては、公式のガイドに書かれています。
カスタムドメインの設定
ここはHexoの設定というよりは、GitHub PagesとDNSの設定とお考え下さい。
DNS側の設定で、カスタムドメインが<organization名>.github.io
を向くようにします。
そしてsource/CNAME
に
1 | $ echo 'blog.otakumode.com' > source/CNAME |
のようにカスタムドメインの設定を書き、正しくリダイレクトされるようにします。
上記はサブドメインの設定で、トップレベルドメイン(Apex/Root/Naked/Bare)などの場合は手順が異なるので、GitHub Pagesのヘルプを確認してみてください。
(技術ブログなので、サブドメインで運用することが多いと思います。)
記事を書く環境をGit管理下に置く
チームで技術ブログを書く場合は、下記のようなフローを経るのが望ましいです。
- 開発と同じようにGitHub上で草稿を管理する。
- Pull Requestで相互にレビューを行う。
- Pull RequestがマージされたのをトリガーとしてCIを動かす。
4.本番記事として公開する。
このフローができていないと、ブログを書くのがめんどくさくなったり、誰のチェックも通らない記事が世に出て行って、炎上を誘発したりしかねません。
1 | $ git init |
Organization Pagesの場合は、master
ブランチにある静的ファイルがブログの記事となって公開されていくため、記事を書く環境自体は別ブランチにしました。(上記手順ではsource
というブランチにしています)
公開される生成済み静的ファイルと記事を書く環境を同じmaster
ブランチに置いてもいいですが、個人的には分けた方が綺麗だと思うので分けました。
記事を書く
草稿
まず、ブランチを切ります。
1 | $ git checkout -b "write-blog-with-hexo" |
hexo
コマンドを使うと
1 | $ hexo new "<Article Title>" |
以下のようにひな形が出力されるので、そこにMarkdown形式で書いていきます。
1 | $ more source/_posts/<Article_Title>.md |
推敲
書き上がったら、仕上がりを確認します。
1 | $ hexo server |
http://localhost:4000/ にアクセスして記事を読み直し、問題があれば修正します。
Markdownファイルを編集すると自動的に変更を検知するので、リロードするだけで内容が最新にアップデートされます。
Pull Requestとレビュー
記事を書いたブランチをpushします。
1 | $ git add source/_posts |
http://github.com/<organization名>/<organization名>.github.io
を開き、source
ブランチへPull Requestを投げます。(hubコマンドでも構いません)
あとは、他の人にレビューをしてもらい、問題があればcommit/pushを繰り返し、記事を仕上げていきます。
問題が無くなった時点で、source
ブランチへマージします。
記事をデプロイする
マージ済みのsource
ブランチの最新を取得してきて、hexo
コマンドでデプロイします。
1 | $ git checkout source |
これで、無事に先ほど書いた記事が本番に反映されます。
デプロイの自動化
無事に記事が本番反映されたところで、面倒くさいデプロイの処理を自動化します。source
ブランチへのマージまではGitHub上のマージボタンで完結できるので、
Travis CIやCircleCIなどのCIサービスを使ってsource
ブランチへのpushをトリガーにしてsource
ブランチの最新を取得し、hexo deploy
を行えばいいのです。
Tokyo Otaku ModeではCircleCIをCIサービスとして利用しているので、ブログのデプロイもCircleCIを使っています。
以下のようなcircle.yml
ファイルを置いておけば、自動化が出来ます。
1 | $ more circle.yml |
Staging環境の用意
デプロイの自動化が済んだら、次はStaging環境の用意に移ります。
これまでは、ローカルでhexo server
を実行し、localhost:4000
にアクセスすることで見た目の確認を行っていました。
しかし、この方法だとちょっと確認をしてもらうのにも環境整備が必要だったりするなど、面倒なケースが発生し得ます。
そこで、Hexoに付いているHerokuにデプロイする機能を利用し、Staging用にHerokuにデプロイするようにします。
単純に設定しようとすると、本番環境・Staging環境両方にも同時にデプロイするようにしか書けないのですが、Circle CIを噛ませることにより、別々にデプロイさせることが出来ます。
circle.ymlの設定
circle.yml
のdeployment
セクションにproduction
の項目を設定しましたが、ここにはstaging
という項目も設定できます。
また、hexo deploy
コマンドは、_config.yml
のパスを指定するオプションがあります。
この2つを組み合わせると、特定ブランチへの更新は本番環境へ、それ以外はStaging環境へといった動作が可能になります。
以下がstaging環境へのデプロイも設定したcircle.yml
です。
1 | machine: |
sourceへのpushは本番環境へのデプロイが走り、それ以外はStaging環境へのデプロイが走ります。
CircleCI自身が本番環境へのデプロイ時にmaster
を書き換えるため、master
は除外設定をしています。
Staging用の_config.ymlを設定
本番環境は_config.yml
を見て、Staging環境は_staging_config.yml
を見るようになっています。_staging_config.yml
のdeployセクションは
1 | $ tail -n 3 _staging_config.yml |
というふうに設定します。
Herokuの準備
実際にHerokuに上げるためには、Herokuのアプリケーションが必要です。
Heroku Toolbeltをインストールして、
1 | $ heroku login |
とすれば、Herokuアプリケーションが生成されるので_staging_config.yml
のrepo: git@heroku.com:<用意したherokuのアプリ名を入れる>.git
の部分を埋めます。
Circle CIがHerokuへアクセスできるようにする
このままだと、Circle CIからHerokuへのpushがアクセス拒否されてしまうので、
適切にPermissionを設定してあげる必要があります。
Circle CIの設定画面に、HerokuのAPIキーを入れます。
HerokuのAPIキーはここのAPI Keyの項目から取得できます。
ブランチをpushしてみる
ここまで終われば、適当なブランチをsource
から切ってpushすることにより、自動的にCircleCIが動き、Staging環境が更新されるはずです。
あとは、Staging環境のHerokuのURLを校正してもらいたい人に共有するなどすれば、
Hexoが入っていない環境の人も、実際の見た目に近い環境で確認することができます。
まとめ
このようにして、Tokyo Otaku Modeでは、チームで技術ブログを書くうえで面倒くさい障害を取り除き、開発と同じようなフローで書けるように自動化を進めました。
Tokyo Otaku Modeでは、面倒くさいことは自動化してやるぜ!という気概あふれるエンジニアを募集しています!
こちらからご応募ください!
(「ブログを見た」とひと言いただければ、僕らエンジニアが喜びます)