久々の更新になります。
今日は、以前記事にした Gitlab の CI/CD を使用した自動デプロイメントを、ステージングと本番が同一サーバー上にある環境のエックスサーバーで構築した話をしようと思います。
エックスサーバー は、サーバー費用も比較的安価で稼働も安定しています。そして、SSHにも対応しているので、使用している制作会社さんやエンジニアの方も多いと思います。
なので、今後エックスサーバーで、CI/CD 環境を構築する機会も増えそうなので、備忘録の意味も含めて、注意点などを記載しておこうと思います。
ここ最近は、新規のプロジェクトでは、Gitlabに開発ブランチにプッシュやマージイベントがあったら、自動的にステージングサーバーへデプロイ、マスターブランチにマージイベントがあったら(直接プッシュは禁止している)デプロイをスタンバイという具合にGitlab CI/CD を利用して、自動デプロイメント環境を構築しています。
Gitlab の CI / CD に関しては、簡単にまとめた記事がありますので、 こちらをご覧ください。
レガシーなPHP環境でもできる!EnvoyとGitlab CI / CD を使用した自動デプロイ | Metrocode.co
エックスサーバーでCI / CDを構築
いつものように develop ブランチに push したら、ステージングサーバーへ自動デプロイ、master ブランチに merge したら、本番サーバへ手動デプロイという感じに構築しようと思ったのですが、ちょっとした問題に遭遇しました。
今回のケースは、ステージングと本番が同一サーバー上にあります。ここまでは、問題になることはないのですが、エックスサーバー でのサブドメインのドキュメントルートに問題がありました。
サブドメインのドキュメントルート(エックスサーバー の場合)
エックスサーバー で 本番ドメインが www.example.com で、ステージングを stage.example.com という構成にした場合、サーバーのディレクトリ構成が以下のようになります。
└── example.com
└── public_html
└── stage
なぜ、これが問題になるかというと、ダウンタイムゼロの CI/CD を構築するう場合、releaseディレクトリにgitより最新データをクローンして、コンパイルなどのタスクを実行した後、ドキュメントルートをシンボリックリンクで差し替えるという方法をとります。
そのため、本番用のドキュメントルート内にステージング用のドキュメントルートがあるので、本番環境にデプロイすると、ステージ環境が使用できなくなる現象が発生しました。
参考までに CI/CD 時のディレクトリ構成は以下のような感じです。
└── example.com
├── stage
│ └── releases
├── releases
└── public_html
└── stage
本番環境デプロイ時にステージングのドキュメントルートのシンボリックリンクを作成し直す
解決策は、シンプルにステージング用ドキュメントルートのシンボリックリンクを本番デプロイ時に作成し直してあげればOKです。
具体的に何をするかと言うと、本番へのデプロイタスク中に、ステージング用リリースディレクトリ(上の例では、example.com/stage/release
)内の最新のフォルダを example.com/public_html/stage
としてシンボリックリンクを追加するようにします。
実際に使用している Envoy のタスク(一部抜粋)
@task('update_current_symlinks')
echo 'Linking stage newest release'
ls -drt {{ $releases_dir_dev }}/* | tail -n 1 | xargs -I "{}" ln -nfs "{}"{{ $new_release_dir }}/stage
echo 'Linking current release'
ln -nfs {{ $new_release_dir }} {{ $app_dir }}/public_html
@endtask
ls -drt {{ $releases_dir_dev }}/* | tail -n 1 | xargs -I "{}" ln -nfs "{}"{{ $new_release_dir }}/stage
この1行で、ステージング用のreleaseディレクトリの最新フォルダをドキュメントルートとしてシンボリックリンクを作成しています。
最後に、、、
低価格対で 継続的インテグレーション (CI/CD)が組めてしまうエックスサーバー って凄いですね。
今まで、CI / CD を構築するためにVPSとかを使用していたけど、問題なくCI/CD環境を構築できることがわかりました。
正直、この価格帯で、継続的インテグレーションが使用できるとなると、エックスサーバー の利用シーンも増えそうです。