概要
Web APIの開発をするのにapi blueprintとaglio+drakovを利用してドキュメント作成とモックサーバ立ち上げが簡単にできる環境を構築してみます。
api blueprint
https://apiblueprint.org/
こちらの記事を参考にさせてもらいました。感謝!
API BlueprintとdrakovとdreddでAPIドキュメントを書きつつモックサーバを立ててさらにテストを走らせる
https://arata.hatenadiary.com/entry/2018/03/22/204723
今回構築した環境をGitHubにUPしていますので、ご参考ください。
https://github.com/kai-kou/api-blueprint-use-aglio-darkov
環境構築
Docker環境を用意します。
> mkdir 任意のディレクトリ > cd 任意のディレクトリ > touch Dockerfile > touch docker-compose.yml
node.jsが利用できるようにイメージを指定します。
aglioとdrakovもインストールしておきます。
Dockerfile
FROM node:latest WORKDIR /projects RUN npm install -g aglio --unsafe-perm RUN npm install -g drakov
command
でaglioとdrakovのそれぞれが起動するようにコマンドを指定しておきます。
docker-compose.yml
version: '3' services: aglio: build: . ports: - "3000:3000" volumes: - "./md:/projects" tty: true command: aglio --theme-variables slate -i index.md -s -h 0.0.0.0 drakov: build: . ports: - "3001:3001" volumes: - "./md:/projects" tty: true command: drakov -f "**/*.md" --public --watch --p 3001
ドキュメントを用意する
Docker起動前にAPI仕様を記述したファイルを用意しておきます。
> mkdir md > touch md/index.md > touch md/sample.md
md/index.mdはAglioで複数mdファイルを取り扱う際に利用します。
aglioで**/*.md
と指定できたら良いのですが、Docker-compose.ymlで指定するとうまく起動しませんでした。
md/index.md
<!-- include(sample.md) -->
md/sample.md
# GET /message + Response 200 (text/plain) Hello World!
Dockerコンテナの立ち上げ
準備ができましたので、Dockerコンテナを立ち上げます。
> docker-compose up -d
起動したか確認してみます。
> docker-compose ps Name Command State Ports --------------------------------------------------------------------------------------------------------- api-blueprint-use-aglio-darkov_aglio_1 aglio --theme-variables sl ... Up 0.0.0.0:3000->3000/tcp api-blueprint-use-aglio-darkov_drakov_1 drakov -f **/*.md --public ... Up 0.0.0.0:3001->3001/tcp
はい。
それでは、それぞれアクセスしてみます。
aglio
> open http://localhost:3000/
drakov
> curl -v http://localhost:3001/message * Trying ::1... * TCP_NODELAY set * Connected to localhost (::1) port 3001 (#0) > GET /message HTTP/1.1 > Host: localhost:3001 > User-Agent: curl/7.54.0 > Accept: */* > < HTTP/1.1 200 OK < X-Powered-By: Drakov API Server < Access-Control-Allow-Origin: * < Access-Control-Allow-Credentials: true < Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept < Content-Type: text/plain; charset=utf-8 < Content-Length: 13 < ETag: W/"d-oLZZOWcLwsAQ9NXWoLPk5FkPuSs" < Date: Mon, 03 Sep 2018 02:19:27 GMT < Connection: keep-alive < Hello World! * Connection #0 to host localhost left intact
はい。それぞれ起動しています。
ログでも確認してみます。
aglio
> docker-compose logs aglio aglio_1 | Server started on http://0.0.0.0:3000/ aglio_1 | Rendering index.md aglio_1 | Socket connected aglio_1 | Refresh web page in browser aglio_1 | Socket connected
drakov
> docker-compose logs drakov drakov_1 | DRAKOV STOPPED drakov_1 | DRAKOV STARTED drakov_1 | [LOG] Setup Route: GET /message drakov_1 | Drakov 1.0.4 Listening on port 3001 drakov_1 | PUBLIC MODE running publicly drakov_1 | [LOG] GET /message drakov_1 | [MATCHING] by url pattern: /message MATCHED drakov_1 | [DRAKOV] GET /message drakov_1 | [LOG] GET /message drakov_1 | [MATCHING] by url pattern: /message MATCHED drakov_1 | [DRAKOV] GET /message
md/sample.mdの内容を変更してみます。
md/sample.md
# GET /message + Response 200 (text/plain) Hello World!!!!!
変更したらログを確認してみます。
aglio
> docker-compose logs aglio aglio_1 | Updated sample.md aglio_1 | Rendering index.md aglio_1 | Refresh web page in browser aglio_1 | Updated sample.md aglio_1 | Rendering index.md aglio_1 | Refresh web page in browser
drakov
> docker-compose logs drakov drakov_1 | [CHANGE] sample.md Restarting 6 drakov_1 | DRAKOV STOPPED drakov_1 | DRAKOV STARTED drakov_1 | [LOG] Setup Route: GET /message drakov_1 | Drakov 1.0.4 Listening on port 3001 drakov_1 | PUBLIC MODE running publicly
変更を検知してくれていますね。
aglio
> open http://localhost:3000/
drakov
> curl -v http://localhost:3001/message * Trying ::1... * TCP_NODELAY set * Connected to localhost (::1) port 3001 (#0) > GET /message HTTP/1.1 > Host: localhost:3001 > User-Agent: curl/7.54.0 > Accept: */* > < HTTP/1.1 200 OK < X-Powered-By: Drakov API Server < Access-Control-Allow-Origin: * < Access-Control-Allow-Credentials: true < Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept < Content-Type: text/plain; charset=utf-8 < Content-Length: 17 < ETag: W/"11-dSdq9EnT5dkGNunArS5pSGaVctI" < Date: Mon, 03 Sep 2018 02:23:53 GMT < Connection: keep-alive < Hello World!!!!! * Connection #0 to host localhost left intact
それぞれ変更が反映されています。
mdファイルを追加してみます。
> touch md/sanple2.md > vi md/sanple2.md > vi md/index.md
md/sanple2.md
# GET /message2 + Response 200 (text/plain) Hello World!!!
md/index.md
<!-- include(sample.md) --> <!-- include(sample2.md) -->
追加したら反映されているか確認してみます。
aglio
> open http://localhost:3000
drakov
> curl -v http://localhost:3001/message2 * Trying ::1... * TCP_NODELAY set * Connected to localhost (::1) port 3001 (#0) > GET /message2 HTTP/1.1 > Host: localhost:3001 > User-Agent: curl/7.54.0 > Accept: */* > < HTTP/1.1 200 OK < X-Powered-By: Drakov API Server < Access-Control-Allow-Origin: * < Access-Control-Allow-Credentials: true < Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept < Content-Type: text/plain; charset=utf-8 < Content-Length: 16 < ETag: W/"10-DyKYcjpVzlBcpDK0SJCKLaPPxvE" < Date: Mon, 03 Sep 2018 02:29:31 GMT < Connection: keep-alive < Hello World!!!! * Connection #0 to host localhost left intact
はい。いい感じです。
たまにファイル更新や追加時にプロセスが落ちてしまうことがありました。
その際には以下コマンドで再起動すると復帰できます。
> docker-compose start Starting aglio ... done Starting drakov ... done
それでは、良きapi blueprint開発ライフを^^