ようへいの日々精進XP

よかろうもん

2017 年 09 月 24 日(日)

ジョギング

  • 香椎浜 x 3 周
  • 昨日のコブクロライブの興奮が冷めないうちに BGM はコブクロ
  • 軽く追い込んだけど、右足の膝から太腿に張りが強い
  • 明日が心配

日課

  • (腕立て x 30 + 腹筋 x 30) x 3

夕飯

  • ちょっと贅沢して牛肉を食べる
  • サッと焼いただけの牛肉をおろしポン酢やわさびで、めっちゃ美味しかった
  • 奥さんが作ったエビとアボガドのサラダがとても美味しかった

2017 年 09 月 23 日(土)

ジョギングと日課

  • 共にお休み

ランチ

  • 奥さんとよし本
  • 天丼を食べる、奥さんは海鮮丼
  • 相変わらずコスパ最高(だと思う)
  • 天丼と海鮮丼のハーフアンドハーフがあればいいのにねと話ながら食べる

コブクロ

emtg.jp

  • コブクロのライブに参戦 in マリンメッセ
  • 知らない曲が数曲あったものの、「流星」が聴けたり、MC が漫才みたいですごく楽しめた
  • 奥さんも途中、体がきつそうだったけど、元気貰えたみたいで本当に良かった

Masaki

tabelog.com

  • 博多の隠れ家中華ダイニングで夕飯
  • 中華なのにだいぶん盛り付け等小洒落ていて、味もかなりのハイスペックだと思う
  • オーナーのマサキさんとは Facebook でもお友達だったりするので雑談で盛り上がった

2017 年 09 月 22 日(金)

ジョギング

  • 香椎浜 x 2 周
  • テンポ良く走れた気がする

日課

  • 休み

systemd

  • ちょっとしたスクリプトをデーモン化させたい場合に便利だと解った(今更だけど)

バタバタ

  • 夕方になって仕事に漏れがあってバタバタ
  • 関係各位には迷惑を掛けてしまった…申し訳ない

2017 年 09 月 21 日(木)

ジョギング

MSPJ 福岡インフラ勉強会

connpass.com

に参加した。

山本さんの Terraform の話、すごく解りやすくて Terraform の魅力を再確認した次第。Terraform はクラウドインフラの構築に留まらず、最近では Datadog プロバイダとかもあったりするので、同じようなインターフェースと DSL で透過的に色々なインフラを操作出来るツールとしてだいぶん成熟してきている感じがした。

www.terraform.io

でも、AWS の構築には CloudFormation を使いたいと切に願う今日この頃。

王子の Application Insights の話。

azure.microsoft.com

監視設定ってインフラエンジニアがインフラの視点で設定するから、サーバーリソースはだいぶん手厚くやるけど、気付いたらアプリケーションの監視ってせいぜい URL 監視くらいなんだよなと。インフラがイミュータブル化していく中で、これからのアプローチとしては、Application Insights や Datadog APM でアプリケーション(サービス)の監視を手厚くやっていけばいいんぢゃないかと思った次第。

Nulab 平山さんの Cacoo の HTML5 化を支えるインフラの話。

cacoo.com

Cacoo は我々エンジニアにとって紙と鉛筆みたいな無くてはならない仕事道具。その仕事道具の裏話が聞けてサイコーだった。HTML5 化に伴い、エディタ部分は Amazon ECS のコンテナでマイクロサービス化したとのこと。マイクロサービス化することのメリットやデメリットの話がとても印象に残った。

2017 年 09 月 20 日(水)

ジョギング

日課

  • (腕立て x 30 + 腹筋 x 30) x 3

馬刺し x 辛子レンコン

奥さんが熊本出張に行ったので、お土産で馬刺しと辛子レンコンを買ってきた。

早速、スライスしてもらって食べたけどサイコーだった。食べに行きたいくらい。

2017 年 09 月 19 日(火)

ジョギング

  • 香椎浜 x 2 周
  • ペースは遅いのだいぶん体がキツイ

日課

  • (腕立て x 30 + 腹筋 x 30) x 3

奥さん

朝からとても辛そうだったが、自分で病院に行って先生の話しを聞いて少し元気になった模様。

焦らずにのんびりとやっていって欲しい。

2017 年 09 月 18 日(月)

ジョギング

日課

  • (腕立て x 30 + 腹筋 x 30) x 3

志賀島

夕陽を見に行った。

志賀島で夕陽に向かってバカヤロー。

奥さん

最近、調子が良かったので少し疲れが出てしまったのかもしれない。あまり焦らずに元気になっていって欲しいと思う。

2017 年 09 月 17 日(日)

昨晩

変な夜更かしをしてしまったので、朝から体調イマイチ。

台風 18 号

福岡の北の方だと強い風は感じられなかったけど、朝から雨がずーっと降り続いていた。

ということで、ジョギングはお休み。

日課

  • (腕立て x 30 + 腹筋 x 30) x 3

CodeBuild で実行したビルドの結果を Slack に通知するヤツ(PHPUnit を実行した場合にはテスト結果もブラウザで確認出来るようにしちゃる)

CodeBuild にお願いしっぱなしでは

いけないと思ったので CodeBuild のイベントを拾って Slack に通知する Lambda ファンクションを作ってみた。

github.com

使い方

ファイル

整理出来ていないけど。

$ tree .
.
├── README.md
├── codebuild-sample.prj
├── decrypt-sample.arn
├── environment-sample.yml
├── handler.py
└── serverless.yml

0 directories, 6 files
  • codebuild-sample.prj には CodeBuild のプロジェクト名を指定
  • decrypt-sample.arn には KMS のキーを指定
  • environment-sample.ymlには Lambda ファンクションの環境変数を指定

デプロイ

Serverless Framework で楽ちん。

sls deploy --aws-profile=xxxxx --stage=xxxxx

後は CodeBuild を走らせるだけ。

こんな感じ

処理の流れ(1)

f:id:inokara:20170917233330p:plain

最初は単純に処理開始、成功、失敗、停止のみを通知するようにしていた。

処理の流れ(2)

f:id:inokara:20170918000843p:plain

前の記事で PHPUnit の結果をいい感じで HTML に吐くことが出来たので S3 に Put して PreSigned URL を発行して期間限定でブラウザから確認出来るようにしてみた。PHPUnit にも関わらず、他言語のテストフレームワークでも HTML 書き出し機能があると思うのでうまくそれを利用すれば同じようなことが出来るはず。

通知例

ビルド開始

f:id:inokara:20170917234101p:plain

地味に開始の通知は嬉しい。個人的に。

成功

f:id:inokara:20170917234358p:plain

Result URL をクリックすると HTML に書き出したテスト結果を確認出来る。

失敗

f:id:inokara:20170917234452p:plain

失敗した際も同様に Result URL をクリックすると HTML フォーマットのテスト結果を確認出来る。

f:id:inokara:20170918000633p:plain

ハマった点こととか

PreSigned URL

Lambda に付与されている IAM Role に対して S3 を操作する権限が付与されていなくても PreSigned URL が発行出来てしまうというワナ。但し、発行された URL にアクセスしても Access Denied となる。

個人的には権限が無いのなら、エラーになって欲しいと思ったり。

結果 URL の処理をどこでやるか

当初は通知の Lambda ファンクション側で頑張ってみようと思ったけど、Event の内容から Artifact の URL を取得したり、XML から HTML の変換を実装することを考えたら辛かったので、今回は CodeBuild の Post Build フェーズでやってみた。これが良い判断なのかは悩ましい。

ということで

以下の二本の記事はここにたどり着く為の布石でござりんした。

inokara.hateblo.jp

inokara.hateblo.jp

お疲れさまでござりんした。

PHPUnit のテスト結果を人間に優しい感じで出力する

モチベーション

特に何もオプションを指定しない場合の PHPUnit の結果があまりにも人間に対して素っ気ない感じがしたので、テスト結果っぽい感じの出力が得られないものかを調べていた。

世の中の人たちはあの素っ気ない感じで満足されているのかと諦めかけていたころ、PHPUnit のドキュメントに貼られたリンクに気付いた。

Plugins for PHPUnit – The PHP Testing Framework

以下のリンク。

PHPUnit xslt · GitHub

この XSLT Template を噛ませば、あら素敵、テスト結果の出力がお客様が喜びそうな解りやすい感じで出力されるぢゃありませんか。

ということで

引き続き

github.com

こちらの sample を利用する。

シンプルなテスト結果

素っ気ないというとあれだけど、シンプルな出力で個人的には嫌いではない。

# php phpunit.phar tests
PHPUnit 5.7.21 by Sebastian Bergmann and contributors.

...F...                                                             7 / 7 (100%)

Time: 1.43 seconds, Memory: 12.50MB

There was 1 failure:

1) CalcTestCase::test_div
Failed asserting that 3 matches expected 2.

/opt/codebuild/tests/CalcTest.php:23

FAILURES!
Tests: 7, Assertions: 7, Failures: 1.

F は失敗したテストケースであることは何となく判る。ちなみに、.F 以外にも以下のようなステータスがある。

ステータス 意味
.(ドット) テスト成功
F テスト失敗
E テストが危険としてマーク
S テストをスキップした
I テストが未実装

ログ出力

ドキュメント を読んでいるとテスト結果を XML フォーマットでログ出力することが出来るとのこと。

# php phpunit.phar tests --log-junit post_build/result.xml
PHPUnit 5.7.21 by Sebastian Bergmann and contributors.

...F...                                                             7 / 7 (100%)

Time: 2.27 seconds, Memory: 12.50MB

There was 1 failure:

1) CalcTestCase::test_div
Failed asserting that 3 matches expected 2.

/opt/codebuild/tests/CalcTest.php:23

FAILURES!
Tests: 7, Assertions: 7, Failures: 1.

上記のように --log-junit オプションをつけてテストを起動すると JUnit XML フォーマットでテスト結果を出力してくれる。

以下のような内容になる。

<?xml version="1.0" encoding="UTF-8"?>
<testsuites>
  <testsuite name="tests" tests="7" assertions="7" failures="1" errors="0" time="0.004735">
    <testsuite name="CalcTestCase" file="/opt/codebuild/tests/CalcTest.php" tests="4" assertions="4" failures="1" errors="0" time="0.002838">
      <testcase name="test_add" class="CalcTestCase" file="/opt/codebuild/tests/CalcTest.php" line="6" assertions="1" time="0.000586"/>
      <testcase name="test_sub" class="CalcTestCase" file="/opt/codebuild/tests/CalcTest.php" line="11" assertions="1" time="0.000567"/>
      <testcase name="test_mul" class="CalcTestCase" file="/opt/codebuild/tests/CalcTest.php" line="16" assertions="1" time="0.000622"/>
      <testcase name="test_div" class="CalcTestCase" file="/opt/codebuild/tests/CalcTest.php" line="21" assertions="1" time="0.001063">
        <failure type="PHPUnit_Framework_ExpectationFailedException">CalcTestCase::test_div
Failed asserting that 3 matches expected 2.

/opt/codebuild/tests/CalcTest.php:23
</failure>
      </testcase>
    </testsuite>
    <testsuite name="EmailTestCase" file="/opt/codebuild/tests/EmailTest.php" tests="3" assertions="3" failures="0" errors="0" time="0.001896">
      <testcase name="testCanBeCreatedFromValidEmailAddress" class="EmailTestCase" file="/opt/codebuild/tests/EmailTest.php" line="12" assertions="1" time="0.000612"/>
      <testcase name="testCannotBeCreatedFromInvalidEmailAddress" class="EmailTestCase" file="/opt/codebuild/tests/EmailTest.php" line="20" assertions="1" time="0.000830"/>
      <testcase name="testCanBeUsedAsString" class="EmailTestCase" file="/opt/codebuild/tests/EmailTest.php" line="27" assertions="1" time="0.000454"/>
    </testsuite>
  </testsuite>
</testsuites>

うむ、冒頭の .F の方が人間には解りやすいかもしれぬ。

phpunit.xslt を噛ますといい感じになる

再掲。

PHPUnit xslt · GitHub

前述の XML にこの XSLT を噛ましてあげると下図のように人間に解りやすい感じの出力になる。

f:id:inokara:20170917221241p:plain

具体的には以下のように XML ファイルの 2 行目に phpunit.xslt へのパスを指定してあげる。

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="https://gist.githubusercontent.com/jrfnl/3c28ea6d9b07fd48656d/raw/aaeb0b879647b1cf1dbfd461a2c4a8e292be738d/phpunit.xslt"?>
<testsuites>
  <testsuite name="tests" tests="7" assertions="7" failures="1" errors="0" time="0.004735">
    <testsuite name="CalcTestCase" file="/opt/codebuild/tests/CalcTest.php" tests="4" assertions="4" failures="1" errors="0" time="0.002838">
      <testcase name="test_add" class="CalcTestCase" file="/opt/codebuild/tests/CalcTest.php" line="6" assertions="1" time="0.000586"/>
...

もう少し踏み込んで

このログを HTML に変換して、手元のブラウザでお手軽に見ることが出来るようになれば、もっと人間に優しくなるような気がしたので PHP を使って HTML に変換するスクリプトを作ってみた。

<?php

$filename = 'result.xml';

if (! file_exists($filename)) {
    echo "$filename は存在していません." . "\n";
    exit(1);
}

$xsl = new DOMDocument();
// 事前に https://gist.githubusercontent.com/jrfnl/3c28ea6d9b07fd48656d/raw/aaeb0b879647b1cf1dbfd461a2c4a8e292be738d/phpunit.xslt からダウンロード
$xsl->load("phpunit.xslt");
$xml = new DOMDocument();
// テスト結果
$xml->load("result.xml");

$proc = new XsltProcessor();
$proc->importStylesheet($xsl);
$result_html = $proc->transformToXML($xml);
file_put_contents("result.html", $result_html);

このスクリプトを実行すると result.html が出力される。

f:id:inokara:20170917222709p:plain

何件のテストを実施して、何件のテストが Failure になっているのかが一目瞭然、Failure の原因についても個人的に見易い気がする。

以上

メモでした。