デプロイ研究の活動報告
どうも。キャッチアップの渕上です。
秋どこ行った?
夏が過ぎ紅葉の時期がぼちぼちだよね、とか思いつつ日々過ごしていたのですが、急な冷え込み。
紅葉、見てませんねえ。
気づけば、はんてん、ニット帽子、ネックウォーマー、そして電気毛布をセットしてました。
ただし電気毛布はまだ毎日ONではありません。
そんな感じで、今日は私が取り組んできたデプロイについてちょっと書いてみようと思います。
結論「cu_deploy」という名のデプロイツール(ファイル反映用のツール)を作った
作りました。キャッチアップで利用するデプロイ。
その名も「cu_deploy」
常日頃、デプロイについて考えていた活動の一環として、PHPの力を借りてツールを作成しました。
phpをCLIで起動し、FTPを用いて反映、ssh+rsyncを用いて反映ができるツール。
補助として、以下のことができます。
- git のコミットログから、対象ファイル一覧のリストを作成
- 反映前にバックアップとして対象ファイル一覧を取得
- backup内のフォルダ名指定によるロールバック
- デプロイ実行後、自動で git tag を作成
動作しているスクショは以下です。
このスクショでは、ツールを起動し、FTP接続を行い、対象ファイルに記載のあるファイルを対象としてダウンロードしに行ってます。
お試し動作なのでドライラン(仮実行)です。
次に、同じくツールを起動し、FTP接続を行い、対象ファイルに記載のあるファイルを対象としてアップロードしに行ってます。
こちらもお試し動作のためドライランです。
こういった動作を行うことができるので、デプロイを最短以下の流れで完了することができます。
- リストを作る
- バックアップとしてファイルをダウンロードする
- デプロイ実行でファイルを反映する
ツールでできる4つの機能こと
次に、このツールでできることを紹介します。メインとなるのは4つです。
ツールを利用する環境の前提として、gitリポジトリとして管理していること、ssh接続ができること、rsyncが利用できること、php_ftpが利用できること、です。
1. リスト作成 機能
$ php ./deploy.php list [比較元hash値] [比較先hash値] [ファイル名.txt]
hash値の指定がないときは、カレントブランチの最新コミットログ2件から、変更ファイルをリストとして書き出し作成します。
ファイル名の指定がないときは、yyyymmddhhiiss.txt といった実行タイミングで年月日時分秒をファイル名とします。
2. バックアップ取得 機能
$ php ./deploy.php backup [ファイル名.txt] [環境別設定の指定(例: staging)]
指定したファイル名のリスト内容に記載のあるパスに基づき、バックアップとしてファイルを取得します。
取得時に、リモート側のパスと同じ階層構造を保ったまま取得します。
「環境別設定の指定」では、サーバ接続先を指定することが可能です。
cu_deploy では、サーバへの接続先を複数持てる仕組みにしてあります。
それにより、たとえば今回はステージング環境への事柄。次回は本番環境への事柄、と切り替えて行うことができます。
動作時はドライランで確認、その後、実動作で取得します。
3. 反映 機能
$ php ./deploy.php exec [ファイル名.txt] [環境別設定の指定(例: staging)]
指定したファイル名のリスト内容に記載のあるパスに基づき、ファイルを反映します。
「環境別設定の指定」は、先のバックアップ取得と同様です。
動作時はドライランで確認、その後、実動作で反映します。
4. ロールバック 機能
$ php ./deploy.php rollback [backup内のフォルダ名] [環境別設定の指定(例: staging)]
指定したバックアップフォルダ名に存在しているファイルを反映します。
これは、バックアップにより取得したファイルが存在していることが前提です。
反映後に戻す必要が出た場合に利用できる機能となっています。
「環境別設定の指定」は、先のバックアップ取得と同様です。
動作時はドライランで確認、その後、実動作で反映します。
ここまでのまとめ
対象ファイルの管理は普通のテキストファイルなので、行単位=ファイル単位で追加・削除を自由に行うことができます。
そのため、コミット内容に、バックアップ(or 反映)不要ファイルがある際は生成したリストを書き換えればOKです。
ファイル構成は以下のようになってます。ここでは省略してメインとなるフォルダを紹介します。
.
├── backup バックアップ実行時にファイルを保存するフォルダ
├── config 接続設定を持つ設定ファイルを置くフォルダ
├── deploy.php 実行ファイル
├── filelist リスト作成時にファイルを保存するフォルダ
└── library 動作用のファイル群
つまり、filelist内のファイルをもとにして取得・反映を行い、バックアップ実行時はbackupフォルダ内に収められるだけとなっています。
なぜ作ったのか
背景として、デプロイ自体が非常にナイーブな作業のため、スムーズにする仕組み化をしたかったことがあります。
- FTPクライアントによるフォルダ辿って取得、反映する手順の課題
- 単純に1ファイルずつの操作で時間かかる
- 移動と操作時のリスク低減
- 意図しないフォルダの移動操作による事故防止
- 事前に反映操作するファイル一覧の明確化
- ロールバック準備の簡素化
- etc...
これらを踏まえ、スムーズにする仕組み化としては、一括で取得、ファイル差分比較、一括で反映、による流れができるのが理想でした。
そして、継続できる仕組みに持って行くためツール化に踏み込みました。
私が考える継続できる仕組みとは次の4つです。
- 記憶より記録 → ログ表示、リスト
- スコープを定める → 対象リストによる範囲の指定
- 仮説と検証 → リスト準備による仮説。dryrunによる検証
- 同じ間違いをしないための仕組み → ftp操作ミス。反映漏れ
これらを実現するには、作ってしまうのが最適でした。
ぶっちゃけて言うと、自分の作業を楽にしたかった(笑)社内Sさんの大変さをなんとかしたかった。社内の反映作業をちょっとなんとかしたかった。
そんなところです。
いろんな仕組みや手法
「デプロイ」と一言で言ってもいろんなツールや手法が世の中には存在してます。
せっかくなのでいくつかご紹介します。どれもすばらしいツールやサービスなので、覗いてみると次のアイデアに繋がるかもしれません。
scttnlsn/dandelion: Incremental Git repository deployment.
https://github.com/scttnlsn/dandelion
Deployer - The deployment tool for PHP | Deployer
https://deployer.org/
capistrano/capistrano: A deployment automation tool built on Ruby, Rake, and SSH.
https://github.com/capistrano/capistrano
papertank/envoy-deploy: Laravel Envoy Deployment
https://github.com/papertank/envoy-deploy
DeployBot | Code Deployment Tools | Deploy Code Anywhere
https://deploybot.com/
最後に「cu_deploy」のGUI版
さて、ここまでコマンドラインで動作する cu_deploy についてお話を進めて来ました。
いわゆる黒い画面で操作するだけで完結できる仕組みにできて、特段の不都合はなかったのですが、利用している内に、より 手抜き トライしたくなりました。
その結果、最近このツールにGUIのインターフェイスを組み込むことで、GUI版が出来てしまいました。
利用者の慣れや習熟度に左右されるため、CLI版・GUI版どちらが良いということではなく、選択できるものにしたかったところです。
最後に、GUI版の画面を紹介して、本記事は終わりとします。
このツールを作るにあたり、社内エンジニアメンバーの多大なアドバイスと協力、後押しがあったことに感謝してます。
ありがとうございます。
現場からは以上です(`Д´)キリッ