せかいや

いまいるここを、おもしろく http://sekai-in-the-box.appspot.com/

【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