LoginSignup
12
6

More than 5 years have passed since last update.

Dockerとapi blueprint+aglio+drakovを使ってAPI開発を楽にする

Last updated at Posted at 2018-09-13

概要

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/

スクリーンショット 2018-09-03 11.18.42.png

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/

スクリーンショット 2018-09-03 11.23.44.png

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

スクリーンショット 2018-09-03 11.26.31.png

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開発ライフを^^

12
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
6