Slide 1

Slide 1 text

FuelphpのテストをJenkinsと docker-composeで実行

Slide 2

Slide 2 text

Masahiro Higuchi / 樋口雅拓 ● グリーグループのリミア株式会社で、LIMIA という住まい領域のメディアを 作っています。ゲーム会社ですが、最近はメディアに力を入れています。 ● 機械学習のエンジニアですが、iOS, Android,JSなどもやっている何でも屋 です。4歳の娘のパパ。twitter: @mahiguch1 ● https://limia.jp/ ● https://arine.jp/ ● https://aumo.jp/ ● https://www.mine-3m.com/mine/

Slide 3

Slide 3 text

LIMIAとは? ● メディアサービス ● Android, iOS, Web ● 記事一覧を表示し、タップすると記事 詳細を閲覧できる。 ● AWS:90%、GCP:10%。 ● PHP/EC2 → Go/ECS移行中

Slide 4

Slide 4 text

Fuelphpが。。。 ● 最近バージョンアップの話を聞かない ● Githubを確認すると、最後のcommitが2018年5月 ● Laravelに行く? いや、コンテナ考えたらgolangでしょ! —> golangに移行開始したばかりですが、さっそくJenkinsでハマったことに ついて話します。

Slide 5

Slide 5 text

移行したシステムについて

Slide 6

Slide 6 text

開発環境 ● まず、他との繋がりが薄いRecommendEngineをgolangで書いてコンテナ を作った。 ● php, MySQL, memcached, DynamoDB Local, elasticmqもコンテナにし て、開発環境をdocker-composeで作った。 ● 本番環境はgolangのみECSで動かし、phpはEC2で。

Slide 7

Slide 7 text

本番環境 ユーザが記事の一覧表示をしようとすると、 EC2で動く fuel PHP ApplicationにHTTPリクエストが飛ぶ。PHP Appは、ECSで動くgolang Serviceにgrpcで問い合わ せる。PHP Appはgolangからの応答に後処理を行 なってユーザに返す。

Slide 8

Slide 8 text

APIの結合テスト

Slide 9

Slide 9 text

テストについて ● UnitTestだけでなく、APIの結合テストもFuel phpのテストを書いていた。 ● レスポンスのIFをかなり網羅していたので、リファクタのときには重要。 ● GitのDevelop branchにmergeされるとJenkinsでテストが走り、成功したら結合テスト環境に配布してい た。 —> 実装完了してmergeしたらテストが失敗。何故!?

Slide 10

Slide 10 text

テストが失敗した理由 ● Jenkins Slaveは、EC2にphpをインストールしてテストを実行していた。 ● 当然だがgolangコンテナが無いので、接続失敗でテストがコケる。 ● Jenkins Slave専用にECS Service建てるのは、もったいないよねー。 —> 開発環境用に作ったdocker-composeをJenkins Slaveの中に立ててしまおう!

Slide 11

Slide 11 text

第1の関門: git tokenの渡し方 Repository構成 ● docker: docker-compose.ymlなど ● app: PHPで書かれた本体 ● api: golangで書かれたマイクロサービス これまでは、Jenkinsにgithubのtokenとrepository pathを登録しておくと、手元に展開されていた。 Repositoryが3つだとScriptの所でgit cloneを3行書く。—> Permission Denied... あれ? どうやってtoken渡そう。—> .netrcに書くことで解決!

Slide 12

Slide 12 text

第2の関門: コンテナの建て方 ● 1つ目のテストは成功したが、別のテストで失敗。 ● コンテナが立てっぱなしだったので、ポートを取れなかった。 ● 80/tcp —> 8080/tcp(dockerのNginxが動くport)に透過させていたのが原因。 —> テストの開始時にdocker-compose up、終了時にdocker-compose downすることで解決。

Slide 13

Slide 13 text

第3の関門: コンテナの更新 ● しばらくうまく動いていたが、突然テストが失敗するように。 ● Jenkins Slaveでコンテナの更新を行なっていなかった。 ● テスト開始前にdocker-compose pullしたが上手くいかない。あれ? —> ecr loginしてなかったので、docker repos.にアクセスできていなかった。 loginすることで解決。

Slide 14

Slide 14 text

まとめ ● 一部のサービスをgolangで書き直してみた。 ● 今後PHPの部分はBFFっぽくなっていく予定。 ● PHPをコンテナ化する必要があるが、知見が無いので、もし経験があれば教えて欲しい。 ありがとうございました。懇親会でぜひ声をかけてください!