開発Tweetブログなどの記事をGitHubのWebで編集することが多く、そうしたGitHub上の変更をすぐに本番環境へ反映できたらなあということを思ったので、CircleCIのWorkflowから自動でデプロイできるようにしてみました。この記事ではその際に行った手順や用いた設定をまとめて紹介していきます。実現すること・前提GitHubのmasterブランチに変更が加えられたら各種ビルドが走り、エラーがなければ本番サーバーへ反映されるようにします。アプリケーションはリモートサーバー上で稼働しており、PHPで書かれています。パッケージ管理のためにComposerや、フロントエンドではnpm、Sass、webpackを利用しています。7上でApacheが動いています。CircleCIのWorkflowから、ビルド成功後にSSHでリモートサーバーへ接続し、デプロイ用のシェルスクリプトを実行します。シェルスクリプトではソースコードの取得、ビルド、公開ディレクトリへの配置を行います。WorkflowについてGitHubと手軽に連携できてプライベートリポジトリにも無料で対応できるので、CircleCIを重宝しています。2.0からWorkflowという機能を利用できるようになっており、各工程(Job)について実行条件や順序の依存関係などを指定できます。CircleCIWorkflowの設定はじめに、CircleCIのWorkflowを設定します。パッケージ取得や静的アセットのビルドに成功したらSSHでリモートサーバーへ接続し、シェルスクリプトdeploy.shを実行します。master$SSH_PORTなどの環境変数は、CircleCIのWebサイトから自由に追加できます。CircleCIrequires:の記述によって、ビルド成功後にデプロイのJobが実行されるようになり、filters:の記述によって、GitHubのmasterブランチ以外ではデプロイのJobが実行されないようになります。CircleCIからリモートサーバーへ接続するために、事前にSSH鍵の作成・登録が必要なので、こちらも公式のドキュメントを参考に行っておきます。続いて、リモートサーバーに設置するデプロイ用シェルスクリプトdeploy.shを作成します。このスクリプトは特定のユーザーdeployerでの実行を想定しており、以下の内容を含んでいます。"Done!"ビルド用にComposerやNode.jsの環境を用意するのは面倒なので、Dockerを利用してビルドを行っています。runでは生成されるファイルの所有者がrootになってしまうので、これを変更するには上記のように実行ユーザーを指定する必要があります。おわりGitHubからの自動デプロイ環境を構築するための主要な部分は以上です。これまでリリースの度にリモートサーバーへ接続して一連のコマンドを叩いていましたが、今回の取り組みによってGitHubを更新したら自動反映されるのを待つだけで良くなりました。浮いた時間はもっと価値のある仕事に回せるようになるので、単純作業はどんどん自動化していきたいですね。