Blog

レガシーなPHP環境でもできる!EnvoyとGitlab CI / CD を使用した自動デプロイ

基本的には、Github Actionsでも同じことが言えると思いますが、プライベートレポジトリーを無制限に持てることから、Gitlabを使用することが多いので、Gitlabベースの話になっています。

開発・本番サーバーへのデプロイメント

最近は、開発サーバーと本番サーバーへのリリースともに CI / CD を使用しています。FTPなどで、人の手を介して更新ファイルのアップロードおよび、キャッシュクリアのコマンドを実行していたりすると、リリース漏れがあったりと、ろくな事がありません。

タスクランナー Laravel / Envoy

自動デプロイメントで良く使用するのは、Laravelで提供されているタスクランナーの Envoy です。Laravelで提供されていますが、単独でも使用可能なツールなので、非常に重宝しています。

Envoyには、setup、task、storyなどがあり、基本的には、taskで指定した内容をstoryで実行していくイメージです。

Envoyサンプル

@story(‘deploy’)
    clone_repository
    run_composer
@endstory

@task(‘run_composer’)
    echo “Starting deployment ({{ $release }})”
    cd {{ $new_release_dir }}
    composer install —prefer-dist —no-scripts -q -o
@endtask

非常に優秀なEnvoyですが、ツールの依存関係で、PHPのバージョンが7.2.5以上でないと動作しません。

少し前にレガシーなPHPバージョンで書かれたサービスのリファクタリングを行った時のことですが、本来であればLaravelなどに載せ換えたかったのですが、様々な諸事情によりPHPのバージョンアップができないため、レガシー環境のなかで、MVCの概念に沿って独自にライブラリーなどを揃えて実装したことがあります。デプロイに関してもEnvoyを使用して自動的に行いたいと思い、インストールをしようとしたところ、PHPのバージョンが低いと言われインストールができませんでした。

大規模なリファクタリングのため、更新ファイルや必要なコマンド群を控えての人為的な更新作業は、絶対に避けたいと思い、どうしようかと考えていました。

冷静になって考えてみれば、レガシーな環境でも問題なかったという話

実際のところ、10年ほど前から提供しているサービス運営していたり、または、それらを使用している企業などでは、レガシーなPHP環境を使用しているケースも珍しくないと思います。実際にお仕事をさせていただいたクライアント様の中でも諸事情によりPHPのバージョンアップができないというところも、そこそこありました。

少し冷静になって考えてみると当たり前のことなのですが、Laravelを実行するのは、開発しているアプリケーション内ではなく、Gitlabが提供している CI / CDのランナーが実行します。なので、アプリケーションのPHPバージョンに関係なく、Envoyの実行に必要なPHPバージョンを搭載したDockerfileを用意してGitlabのContainerとしてPushしてあげれば良いだけでした。

用意したDockerfile

このDockerfileは、GitlabのCI / CD の解説ページにも掲載されています。 大抵はこのままのDockerfileでも問題ないと思いますが、ご自身の環境などに合わせて適宜調整してください。 Gitlabで掲載されているDcokerfile

# Set the base image for subsequent instructions
FROM php:7.1

# Update packages
RUN apt-get update

# Install PHP and composer dependencies
RUN apt-get install -qq git curl libmcrypt-dev libjpeg-dev libpng-dev libfreetype6-dev libbz2-dev

# Clear out the local repository of retrieved package files
RUN apt-get clean

# Install needed extensions
# Here you can install any other extension that you need during the test and deployment process
RUN docker-php-ext-install mcrypt pdo_mysql zip

# Install Composer
RUN curl —silent —show-error https://getcomposer.org/installer | php — —install-dir=/usr/local/bin —filename=composer

# Install Laravel Envoy
RUN composer global require “laravel/envoy=~1.0”

これで、Gitlab上でEnvoyが動く環境を構築でき、レガシーな環境でも自動デプロイが使用できる状態になりました。 Gitのバージョン管理を利用したデプロイフローを確立することで、いつ・だれが・どのファイルを更新したかが把握できるだけでなく、ファイルのリリース漏れなどの人為的なミスを防ぐことができるので、大規模リニューアルなどの際に特に威力を発揮してくれるかと思います。

GitlabのCI / CDの設定方法や、Envoyでのタスクの記述方法などは、本日は割愛しますが、また別の記事で紹介したいと思います。

For Every type of your business

開発やコンサルティングのご相談は、
お問い合わせフォームからお気軽に。