今日からはじめるCI/CD ─ CircleCI + Deployerでテストとデプロイを自動化しよう!【休日個人開発】

プライベートでも何か作りたい! そんなときの「今日からはじめる休日個人開発」シリーズ、今回はテストやデプロイをGitHubと連携し、自動化させてCI/CDに対応します。

今日からはじめるCI/CD ─ CircleCI + Deployerでテストとデプロイを自動化しよう!【休日個人開発】

皆さん、プライベートで何か開発していますか? 「何か作りたい」という気持ちはあるものの、いまひとつ何から始めたらいいのか分からず、動けないままの人も多いと思います。

そんな皆さんのために、「仕事以外にも休日に個人で気軽に何かを作ってみよう!」という企画の第3回です。第1回で用意した開発環境と、第2回で作成した画像を加工するツールを用いて、テストとデプロイの自動化を行います。

これまでの休日個人開発シリーズでは、Webアプリケーションを動作させる本番環境にログインし、動作しているファイルを直接修正して開発を行っていました。しかし、Web上でサービスを公開した場合、本番で動作しているファイルをいきなり修正するべきではありません。ローカルの開発環境などできちんと動作確認し、テストが実施されたアプリケーションのみを本番に反映してください。

そこで、ファイル一式をGitHubで管理し、ローカル環境で開発したものが、自動でテストされ、本番のサーバに反映される環境が構築できれば便利で安全です。

この記事では、次の2つを実現します。

  • GitHubでPull Requestを投げたら、自動的にテストが実行されて、その結果が確認できる
  • Pull Requestの確認が完了して、テストに成功するソースコードがmasterブランチへマージされたタイミングで、デプロイが自動的にされる

いわゆる、CI/CD(継続的インテグレーション/継続的デリバリ、Continuous Integration/Continuous Delivery)を実現させることがゴールです。

開発環境の確認

第1回から使用している開発環境をそのまま利用する場合には、まずサーバ内のパッケージを最新にしておきましょう。

コラム:開発環境を最新の状態にする

環境を構築してから時間が経っている方は、脆弱性対策のため、次の手順で最新の状態にしましょう。

$ sudo yum update

カーネル関連のアップデートが含まれている場合は、OSを再起動して、更新した内容を反映させます。

$ sudo reboot

また、今回の記事で使用する設定ファイルなどは、第2回の記事のサンプルソースコードと同じリポジトリにも追加しています。

1GitHub - github-sample/tool

先ほどゴールとして挙げたように、今回はファイルをGitHubで管理していることが前提になりますが、このサンプルのリポジトリを自身のGitHubアカウントにフォークして編集し、記事の内容を試すこともできます(もちろん第2回までのファイルを自身でGitHubにプッシュしてもかまいません)

GitのインストールやGitHubのアカウント取得などについては「今日からはじめるGitHub」の記事を参考にしてください。

デプロイ先のサーバとしては、第2回まで使用してきた開発環境のWebサーバが使用できます。デプロイ先のディレクトリを新しく用意する場合は、あらかじめ権限設定をしておきましょう。

$ sudo mkdir 【デプロイ先のディレクトリ】
$ sudo chmod 777 【デプロイ先のディレクトリ】

Deployerを使ってデプロイを効率化

CI/CDに利用する便利なツールは世の中でたくさん開発され、フリーで利用できるものも数多く存在します。どのツールにもそれぞれ利点と欠点があり、かつ時代の流れもあって「これを使えば間違いない!」と言えるツールはなかなか存在しません。

実際には自分が使いたいものではなく、企業によって、サービスによって、プロジェクトによって、既に使われているツールがあり、それを利用しなければならない状況が多いでしょう。

そのため、何かのツールのエキスパートになるのではなく、CI/CDがどのようなものなのかを理解して、臨機応変にツールを使いこなせるスキルを身に着けることが大切です。その上で、よく使うツールのエキスパートになることはもちろん有意義なことではあります。

今回は、ツールの使い方そのものを理解するコストを下げるため、導入コストが比較的低いDeployerを利用してみます。

DeployerはPHPで開発されているツールで、手軽に使えることが利点ですが、細かいことをやりたければ他のツールに劣るという特徴もあります。また、現在も次のリポジトリで開発が進行中です。

2Pulse ・ deployphp/deployer ・ GitHub

Deployerのダウンロード

開発環境にDeployerをダウンロードします。ここではPHPのバージョンによって、ダウンロードするバージョンを調整することがポイントです。

今回はCentOS 7でyumの標準リポジトリにおいてインストールされるPHP 5.4.16で試していますが、PHPのメジャーバージョンは7まで進んでおり(2018年3月1日現在の最新バージョンは7.2.3)、5系でも5.6までバージョンが上がっています。実際にサービスで利用する際には、可能な限り、新しいバージョンに入れ替えていきましょう。

PHP 7系の場合

利用しているPHPが7系の場合、最新のDeployerを利用可能です(2018年3月1日現在でバージョン6.0.5)

$ curl -LO https://deployer.org/deployer.phar

PHP 5/6系の場合

利用しているPHPが5系や6系の場合、それぞれのPHPに対応したDeployerのバージョンを明記してダウンロードする必要があります。広く利用されているPHP 5系では、次の表がそれぞれサポートされている最新バージョンです(2018年3月1日現在)

PHP Deployer
PHP 5.6 Deployer 4.3.1
PHP 5.5 Deployer 3.3.0
PHP 5.4 Deployer 3.0.11

各バージョンのpharファイルのダウンロード先は以下を参照してください。

{Deployer ― Download

ここでは前述したようにPHP 5.4.16に対応したバージョン3.0.11をダウンロードします。

$ curl -LO https://deployer.org/releases/v3.0.11/deployer.phar
pharPHP Archive)は、PHPをアーカイブ化した拡張モジュールです。

なお、PHP 5系で最新のDeployerをダウンロードすると、利用時に以下のようなエラーが発生します。

$ dep
Upgrade to php7
Deployer 5.x supports only php7 and above.
If you want to use older php version use Deployer 4.x

また、最新のDeployerでは設定項目などが変更されている場合があります。公式サイトのドキュメントを参照してください。

Deployerを配置する

pharファイルのダウンロードが完了したら、depコマンドでDeployerが実行されるように配置します。

$ sudo mv deployer.phar /usr/local/bin/dep
$ chmod +x /usr/local/bin/dep

Deployerの実行テスト

depコマンドでDeployerを試してみます。以下のページも参考にしてください。

Deployer ― Getting Started

次のコマンドで、Deployerのタスクなどを定義する設定ファイルのひな形を生成することができます。

$ dep init

また、設定ファイルはコマンドを利用せず、deploy.phpというファイル名で直接手動で用意することも可能です。

まず、Deployerの挙動を確認するために、deploy.phpを以下のようにしてみます。

<?php
task('test', function () {
  writeln('Hello world');
});

この記述では、Hello worldと表示するtestタスクを定義しています。これを実行してみます。

$ dep test
? Executing task test
Hello world
? Ok

問題なくDeployerが動作することが確認できました。

次は、GitHubからソースコードをデプロイできるdeploy.phpを記述してみましょう。

デプロイ用の設定

上記のテストでタスク(task)を直接定義しましたが、Deployerには便利なレシピがあります。ここではComposerレシピ(recipe/composer.php)を利用します。

デプロイ先のホスト情報をproductionとして定義し、付随する情報をいくつか設定します。【……】としている箇所を、各自の環境に合わせて記述してください。

<?php
require 'recipe/composer.php';
// デプロイ先
server('production', '【デプロイ先のホスト名 or IP】', 【SSH接続先ポート番号】)
  ->user('【ユーザー名】')
  ->identityFile()
  ->forwardAgent()
  ->env('deploy_path', '【デプロイ先のディレクトリ】');
set('ssh_type', 'native');
// リポジトリ
set('repository', '【GitHubのクローン元】');

これでデプロイ用の設定は準備完了です。

次に、これがCircleCI上で自動的に実行されるように連携させていきます。このdeploy.phpファイルはGitHub上で、リポジトリ直下(第2回で作成したindex.phpなどと同じ場所)に置いておいてください。

CircleCIを使ってテストやデプロイを自動化

続いて、GitHubのPull Requestをフックにし、テストやデプロイを自動化させてみます。

Pull Requestを投げたら自動的にテストを実行、Pull Requestの確認が完了してmasterブランチへマージされたタイミングでデプロイが自動的にされるようにします。

今回は、CircleCIを用います。これはCircle Internet Services, Inc.が運営する継続的インテグレーションのサービスで、1コンテナであれば無料で利用可能です。

CircleCIのアカウント作成

CircleCIにアクセスし、「Sign Up」を選択します。

4

「Sign Up with GitHub」を選択します。

5

GitHubアカウントにログインし、CircleCIに権限を付与します。

6

以下のような画面が表示されたら成功です。

7

次に、「Projects」から、連携したいリポジトリの「Setup project」を選択します。

8

以下のような画面が表示されるので、Operating Systemは[Linux]、Languageは[PHP]を選択します。

9

続く手順が「Next Steps」に記されていますが、今回は先にSSH鍵のFingerprintの値をYAMLファイルconfig.ymlに記載したいため、手順を入れ替えて、先に「Start building」を押してください。この段階ではまだ設定が完了していないためエラーになります。

デプロイ用のSSH鍵

エンジニアHubに会員登録すると
続きをお読みいただけます(無料)。
登録のメリット
  • すべての過去記事を読める
  • 過去のウェビナー動画を
    視聴できる
  • 企業やエージェントから
    スカウトが届く