GeekFactory

int128.hatenablog.com

Webアプリのデプロイ後に初期化を待つスクリプト

Gradleスクリプトの小ネタです。

Webアプリのインテグレーションテストやスモークテストを行う場合、デプロイ後にアプリが完全に初期化されるまで待機してからテストを行いたい場合があります。そんな時は、アプリがHTTP 200を返すまでリトライする処理を直前に入れます。必要に応じてレスポンスの内容を検証します。

以下の流れでタスクや関数を書くとよいでしょう。

  1. サーバにWebアプリをデプロイする。
  2. データセットなどの事前条件を整える。
  3. アプリケーションの初期化を待つ。
  4. テストを行う。
  5. 事後条件を検証する。

このうち、アプリケーションの初期化を待つコードは下記のように実装できます。

buildscript {
  repositories {
    mavenCentral()
  }
  dependencies {
    classpath 'org.codehaus.groovy.modules.http-builder:http-builder:0.6'
  }
}

def waitUntilResourceIsReady(uri) {
  def http = new groovyx.net.http.HTTPBuilder(uri)
  def check = {
    try {
      http.get(contentType: groovyx.net.http.ContentType.TEXT)
      /* assert response content here if needed */
      true
    } catch(IOException e) {
      logger.warn "Waiting for ${uri}: ${e.localizedMessage}"
      false
    }
  }
  while (!check()) {
    Thread.sleep(1000L)
  }
}

リトライ回数を制限した方がいいかも。http-builderは便利ですね。