AWS CodeBuild でMaven Wrapperが使えない #AWS初心者

概要

AWS CodeBuildで提供されているJavaビルド環境( aws/codebuild/java:openjdk-8 )ではMaven Wrapperがエラーなってしまう。

Mavenはイメージに含まれているのでそれをそのまま使うか、別イメージを利用する必要がありそう。

詳細

CIツールとしてCodeBuildを使ってみようとしていたのだが、ビルドがエラーになってしまった。

[ERROR] Unknown lifecycle phase "/root/.m2". You must specify a valid lifecycle phase or a goal in the format <plugin-prefix>:<goal> or <plugin-group-id>:<plugin-artifact-id>[:<plugin-version>]:<goal>.

ビルゴ環境はAWSが提供している aws/codebuild/java:openjdk-8 を使用しており、buildspec.ymlは下記の通り(抜粋)。

build:
  commands:
    - echo Build started on `date`
    - ./mvnw clean install

ログを頼りに調べてみると下記のような情報が。

https://issues.jenkins-ci.org/browse/JENKINS-47890

イメージの中身まで正確に確認したわけではないけど、Maven Wrapperの使っている環境変数MAVEN_CONFIG)に別の値が設定されているとエラーになってしまう模様。

公式のサンプルのようにMavenコマンドを使うよう( mvn clean install )にしたらビルドは成功した。

ただ折角Javaだけで動作できるようにMaven Wrapperを入れているので、別のイメージ(DockerHubのOpenJDKあたり)を使うようにしようかなと思う。

MacでNginxを使ってみる #nginx

Apacheおじさんの道は遠い。

インストール

brewで入れられる

$ brew install nginx

バージョンを確認してみる。

$ nginx -V
nginx version: nginx/1.13.12

起動

nginxで起動できる

$ nginx

curlで確認してみる。デフォルトだと8080で起動するようだ。

$ curl http://localhost:8080

IPv6に対応させる

MacOSのバージョンやhostsの設定にもよるが、localhostIPv6で解決しようとしてエラーになってしまうことがある。

curl: (52) Empty reply from server

デフォルトの設定に、IPv6でのLISTENも追加する。

設定ファイルは /usr/local/etc/nginx/nginx.conf

server {
    listen       8080;
    # IPv6を追記
    listen [::]:8080;
    server_name  localhost;

    # 略
}

その他

停止はStop

$ nginx -s stop

再起動はReload

$ nginx -s reload

設定ファイルのシンタックスチェックがtオプションで可能

$ nginx -t

コンテンツのデフォルトの配置場所は /usr/local/Cellar/nginx/1.13.12/html らへん

「現場で役立つシステム設計の原則」を呼んだ

具体性に飛んだ、非常に実践的な本。

全体的に難しい表現はなく、「こういうときはこうするとよい」という、ある種のパターン紹介に近い部分が多いので、すぐにでも現場で活用できそう。

自分はtoB向けの業務システムに関わってきたことが多いが、とても参考になるものが多かった。

目新しい考えが紹介されているわけではないけど、実践的な例に落とし込んであるというところで非常によい本だと思う。

ステータス地獄、区分地獄、NULLABLE地獄に苦しんだ経験がある人は一読の価値ありかと笑

kotlin-testで例外のテスト #Kotlin

概要

KotlinのUnitTestはSpekで書いており、Assertion Frameworkはkotlin-testを使ってる。

kotlin-testで例外発生のテストをAssertする。

例外の発生をテストする

  • assertFailsを使えばOK
assertFails { someMethod(invalidArg) }

発生した例外の型をテストする

  • assertFailsWithを使えば発生する例外の型もチェックできる
// IllegalArgument以外の例外発生時はテストがコケる
assertFailsWith<IllegalArgumentException> { someMethod(invalidArg) }

例外のメッセージをテストする

  • assertFailsもassertFailsWithも発生した例外を返してくれる
val throwable = assertFails { someMethod(invalidArg) }
val exception = assertFailsWith<IllegalArgumentException> { someMethod(invalidArg) }

// 中身のテスト
assertEquals("不正な引数です", throwable.message)
assertEquals("不正な引数です", exception.message)

参考

kotlin.test - Kotlin Programming Language

PostgreSQLを使ったユニットテストをするときに、外部キーを一時的に無効化する

概要

RDBを使ったユニットテストをするときに、前提条件となるテストデータを用意することがある。

しかし外部キーの制約上、テストしたいことと直接関係ないデータの作成が必要になる状況が発生する。

例えば、テーブルが「親-子-孫」という階層になっているときに、孫に関するテストを書きたいのだが子だけでなく親のデータも必要になるといった感じ。

そういったときには、外部キーを一時的に無効化するという選択肢がある。

ALTER TABLEでTRIGGERを無効化する方法

TRIGGERを無効化することで、制約チェックを走らなくする。

テストデータの準備ができたら、再度有効化すればよい。

-- 無効化
ALTER TABLE child_table DISABLE TRIGGER ALL;
-- 有効化
ALTER TABLE child_table ENABLE TRIGGER ALL

JavaのDbSetupを使うなら下記のような感じになる。

これをユニットテストのsetupで行うイメージ。

Operation operation = Operations.sequenceOf(
  // 制約チェック無効化
  Operations.sql("ALTER TABLE child_table DISABLE TRIGGER ALL"),
  Operations.insertInto("child_table")
          .columns("id", "parent_id", "name")
          .values(11, 1, "1の子どもです")
          .build()
  , Operations.sql("ALTER TABLE child_table ENABLE TRIGGER ALL")
)
DbSetup(DataSourceDestination(dataSource), operation).launch()

dbsetup.ninja-squad.com

制約チェックをDEFERREDにする方法

PostgreSQLの制約チェックはデフォルトだとIMMEDIATE(即時)なのだが、これをDEFERRED(遅延)にする。

DEFERREDの場合、制約チェックはトランザクション終了時(コミット時)に走るようになる。

ただしDEFFERREDを使うにはそもそも制約をDEFERRABLEとして定義する必要がある。

-- 制約はDEFERRABLEで定義する
CREATE TABLE child_table (
  id        SERIAL        PRIMARY KEY,
  parent_id INTEGER       NOT NULL REFERENCES parent_table(id) DEFERRABLE,
  name      VARCHAR(128)  NOT NULL
);
-- 無効化(チェックを遅延)
SET CONSTRAINTS ALL DEFERRED;
-- 有効化(チェックを即時)
SET CONSTRAINTS ALL IMMEDIATE

無効化したいタイミングがトランザクション単位になるようであればこちらの方法もとれる。

しかしテストデータの作成とテストの実行はトランザクション単位を分けたほうがいいと思うので、ユニットテストで使うには微妙かも。

参考

stackoverflow.com qiita.com

「Real World HTTP」を読んだ

Real World HTTP ―歴史とコードに学ぶインターネットとウェブ技術

Real World HTTP ―歴史とコードに学ぶインターネットとウェブ技術

  • 作者:渋川 よしき
  • 発売日: 2017/06/14
  • メディア: 単行本(ソフトカバー)

一応Webエンジニアとして働いているが、実務ではあまり直接的に扱うことの少ないHTTPに関連する話を幅広く、歴史を交えて学べた。

復習や整理に加えて、個人的にあまり馴染みのない分野(動画のストリーミングとか)や、比較的新し目の知識も「ふむふむこんな感じなのね」と雰囲気をつかめた気がする。

近々では興味が薄いものでも、頭の片隅に置いてあるのとないのでは、いざ身近になったときに大分違ってくると思う。

Goでの実装の章は読み飛ばしてもあまり影響はないように思えるが、Goは好きなので、理解を深めるために楽しみながら写経できた。

テーマは本当に幅広くて、その分深掘りは難しいかも。

社内の有志で読書会を開催しているのだが、この本をとっかかりに皆でワイワイやるのにもいいのではないだろうか。

歴史に触れているだけあって、懐かしキーワードで盛り上がったりできます。

読書メモ