【GAE】【Ruby】テスト環境デプロイ & 404テスト & 本番環境デプロイを自動化
■topic summary
how to create batch which tests contents before deploy on production mode.
I use GAE(Google App Engine).
自分のサイトで、404エラーが発生した、とは前書いたところ。
404というか、任意のパスがindex.phpに紐付いていたために、
何度もアニメーションが再生されるという、
わりかしありえない事態になっていました。
詳しくは前の記事を参考ください。
app.yamlを修正するのはすぐできる。
けど、再発防止のためにテスト自動化バッチを作ったのでご紹介。
修正内容
そもそもの修正内容は以下の通り。
■バグ時
- url: /(.*\.html) static_files: com/\1 upload: com/(.*\.html) - url: /.* script: com/index.php
■修正完了
- url: /((iseer|kimono)\.html) static_files: com/\1 upload: com/(.*\.html) - url: / script: com/index.php - url: /.* static_files: com/notfound.html upload: com/notfound.html
ご覧のとおり、任意のパスをindex.phpに紐付けるのではなく、
「/」とそれ以外に仕分けし、任意のパスはnotfound.htmlに紐付けた。
また、以前の設定だと、
作成していないhtmlパス(例:hoge.html)を指定された場合に、
「静的リソースhoge.htmlは存在しません」のエラーが表示されるため、
作成したhtmlファイル名を明示((iseer|kimono)\.html)した。
コード全量はgithubにおいてあるapp.yamlをご覧ください
こっから本題
テスト概要
こういう流れを自動化するよ。
・テスト環境にデプロイ
・テスト環境のHTTPを取得し、期待するコードが含まれている(ページが表示されている)かを確認
・本番環境にデプロイ
あと、
不正なコメントアウトが行われていないかチェックするバッチは以前作成したので、
このテストもまとめると、こういう流れ。
・不正なコメントアウトを確認
・テスト環境にデプロイ
・テスト環境のHTTPを取得し、期待するコードが含まれている(ページが表示されているか)を確認
・本番環境にデプロイ
バッチファイル
バッチファイルはRubyファイルを呼び出すだけ。
特にコメントはない。%ERRORLEVEL%での分岐がポイントかな。
@ECHO OFF ruby deploy.rb IF %ERRORLEVEL%==1 ( pause exit ) echo "SUCCESS: comment check" echo "SUCCESS: page status check" echo "deploy done" pause
app.yaml
同一のapp.yamlで2環境にデプロイする。
そのため、バージョンIDを置換対象文字列にして、
Rubyスクリプト内で対象IDに置換する。
application: sekai-in-the-box version: __APP_VERSION__ runtime: php api_version: 1
テストの大枠
- __APP_VERSION__ をテスト環境用ID、本番環境用IDと置換する。
- check_show_statusメソッドでHTTPレスポンスを確認する。
__APP_VERSION__ をテスト環境用ID、本番環境用IDと置換する。
is_comment_in? begin edit_app_yaml("__APP_VERSION__", "dev-test") p `#{CMD}` check_show_status ensure edit_app_yaml("dev-test", "__APP_VERSION__") end begin edit_app_yaml("__APP_VERSION__", "ver001") p `#{CMD}` ensure edit_app_yaml("ver001", "__APP_VERSION__") end
check_show_statusメソッドでHTTPレスポンスを確認する。
RSpecを参考に、期待する文字列がレスポンス内に存在するかを確認。
def check_show_status root = "http://dev-test.sekai-in-the-box.appspot.com" open(root) {|f| raise "top page error " if !exist?(f, "sekai in the box!") } open(root+"/iseer.html") {|f| raise "iseer page error" if !exist?(f, "iseer.png") } open(root+"/kimono.html") {|f| raise "kimono page error" if !exist?(f, "kimono1.png") } # expect not found ["/hoge","/hoge/huga","/hoge.html","/hoge/huga.html"].each do |st| open(root + st) {|f| raise "not not found" if !exist?(f, "not found") } end end
この箇所では、not-foundページが表示されることをテストしている。
["/hoge","/hoge/huga", "/hoge.html","/hoge/huga.html"].each do |st| open(root + st) {|f| raise "not not found" if !exist?(f, "not found") } end
おわり!
ひとまずはこれで。。
ソースコードはご自由に参照ください。
https://github.com/sekaiya/sekai-in-the-box/tree/master/deploy