Swaggerの利用基盤をdockerで構築しGitHub Pagesで公開する
APIの設計とWeb上への公開までをシュッとできる基盤をdockerで構築したのでシェアします。
Swaggerについて
OpenAPIのフォーマットに準拠したAPI仕様を定義できるツールです。
OpenAPIに従って認証部分やリクエスト、レスポンス形式などを具体的に整理できるので、draw.ioなどの描画ツールでは気づかない部分や漏れを防げます。
Swaggerの実態は静的コンテンツなので、GitHub PagesやAWS S3などにポンと置いて公開できます。
取り急ぎSwaggerを試したい場合はdocker Hubにimageがあるので、下記コマンドでささっと利用可能です。
docker pull swaggerapi/swagger-editor
docker run -d -p 80:8080 swaggerapi/swagger-editor
Swaggerの利用基盤構築
取り急ぎSwaggerを試すなら前項のdockerコマンドで事足りますが、最終的には仕様書を公開してチーム内で見れるようにしたいという気持ちがあります。
そこで、編集とGitHub Pagesへの公開までスムーズに進められるよう、Swaggerの利用基盤を用意しました。
ディレクトリ構造
.
├── docker-compose.yml
├── setup.sh
└── spec
└── sample.yml
docker-compose.yml
swagger-editorとnginxのコンテナを起動します。
API仕様の編集はswagger-editorで行います。
nginxは公開用に使うswagger-uiの見た目を確認するために用意しました。
version: '3'
services:
swagger-editor:
image: swaggerapi/swagger-editor
container_name: dev-swagger-editor
ports:
- 8090:8080
volumes:
- ./dist/specification.yml:/specification.yml
environment:
SWAGGER_FILE: /specification.yml
nginx:
image: nginx:alpine
container_name: dev-swagger-ui
ports:
- 8091:80
volumes:
- ./dist:/usr/share/nginx/html
setup.sh
初期設定用の処理を記載しています。公開用のファイル一式を入手するため、swagger-uiのコンテナを手元に落とし、中身のファイルを抜き出してホスト側に置くということをやっています。
#!/bin/bash
PWD=`pwd`
DIRECTORY="${PWD}/dist"
function setup() {
touch specification.yml
docker container run -d --name tmp-swagger-ui -e SWAGGER_JSON=/specification.yml -v $(pwd)/specification.yml:/specification.yml swaggerapi/swagger-ui
docker container cp tmp-swagger-ui:/usr/share/nginx/html ./dist
docker container rm -f tmp-swagger-ui
rm ./dist/specification.yml
mv specification.yml ./dist/
}
if [ ! -d "$DIRECTORY" ]; then
printf 'Start running a setup script.\n'
setup
printf 'Finished.\n'
else
printf 'Setup is already done.\n'
fi
使い方
下記コマンドを実行します。
sh ./setup.sh
docker compose up -d
localhost:8090にアクセスすればswagger-editorが開くので、そこでAPIの仕様を定義します。
localhost:8091にアクセスすればswagger-uiが開くので、公開用の見た目を確認します。
GitHub Pagesへの公開方法
ファイル一式をそのまま公開したいリポジトリへ移動させ、GitHub Pagesの設定をすればOKです。
公開用のファイルはdist/配下にあるので、そのパスを直接指定するか、一つ上の階層(rootディレクトリ)を指定しすればいいと思います。
APIの規模によってはディレクトリを分けた利したいと思うので、その場合はdist/ディレクトリの名前変更すれば良いです。例えば下記のようにapiA, apiB, apiCに変更し、公開パスをrootディレクトリにすれば、URLの末尾を /apiA/
, /apiB/
にしてアクセスすることでそれぞれの仕様書のページを開けます。
.
├── docker-compose.yml
├── setup.sh
├── apiA # 公開したいAPI仕様書A
├── apiB # 公開したいAPI仕様書B
├── apiC # 公開したいAPI仕様書C
└── spec
└── sample.yml
まとめ
APIの設計をシュッとできる基盤を用意できました。ちょっと気になる点があるので気が向いたら修正します。
↓リポジトリ