5
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Swaggerをオシャレに公開したい! on GitLab Pages

Last updated at Posted at 2023-12-14

はじめに

この記事は 富士通クラウドテクノロジーズ Advent Calendar 2023 の 15 日目の記事です。

昨日は @tomonai さんの Google ColaboratoryでChat GPTをやってみた話 でした。
OpenAIを使ったプログラミングを気軽に試してみたい場合にとても参考になりますね :rocket:

Swagger(OpenAPI)形式で記述した仕様書をもとに、APIドキュメントをWEB公開する方法の1つを紹介します。
記事の最後にコピペだけで実行可能な状態の.gitlab-ci.ymlも記載します。

成果物

サイト

キャプチャ

image.png

モチベーション

社内GitLabの大型マイグレーションをした話 でも紹介されてるようなGitLabにおいて、Pages機能を自チームで何か活用できてないかなと思っていました。

jamstack.org で静的サイトジェネレーターのトレンドをあさっていたところ、SlateというAPIに特化したツールがあるようです。ただし利用するにはSlate形式のマークダウンが必要でした。

手元にはSwagger、そして widdershins というSwaggerをSlate互換形式に変換するツールも見つけました。

そして出来上がったものがこの記事になります。

ビルドとデプロイ

必要なもの

  • Swagger または OpenAPI形式で記述したAPI仕様書
  • GitLabのアカウント(gitlab.comの無料アカウントでも可)
    • 以下説明のため各種コマンドを記述していますが、それらの実行は最後に紹介するGitLab のパイプライン上で完結できます

静的サイトのビルド

今回はサンプルとして作ったBooksAPIのSwaggerをもとにサイトを作ってみます。

books-swagger.yaml
swagger: "2.0"
info:
  version: 1.0.0
  title: Books API
  description: 本の登録を行うAPIです
host: books.example.com
basePath: /v1
schemes:
  - http
consumes:
  - application/json
produces:
  - application/json
paths:
  /books:
    get:
... 省略

1. Swagger(OpenAPI)をSlate形式に変換

まずはSwagger形式のYAMLをマークダウンに変換します。Node.js製のwiddershins というツールを使います。

OpenAPI / Swagger / AsyncAPI / Semoasa definition to Slate / ReSlate compatible markdown

とあるように、ドキュメント生成ツールであるSlateと、互換のある形式にSwaggerを変換できます。

コマンドのオプションは色々とありますが、以下のように入力と出力だけ指定できれば生成できます。

npm install widdershins
npx widdershins books-swagger.yaml -o generated.slate.md

2. 静的サイトとして生成

サイト生成には Slate を利用します。
StripeやPayPalのAPIドキュメントからインスパイアを受けたとの記述もあり、洗練されたデザインとコードサンプル付きなドキュメントが生成できそうです。

公式ドキュメント Using-Slate-Natively が参考になりますが、概要としてはSlateのリポジトリをcloneして、source/配下にあるコンテンツをもとに生成するという仕組みです。

Slateのclone

まずは先ほど生成したマークダウンをsource/配下に配置します。Slateはシングルページのため、index.html.mdだけ上書きすれば配置は完了です。

git clone https://github.com/slatedocs/slate.git
mv generated.slate.md slate/source/index.html.md

ビルド

マークダウンの配置までできたら、最後に静的サイトとして生成すれば完成です。

方法はいくつかありますが、middleman(Ruby製)でビルドする方法が簡単でした。

以下のようにbundle execすることでbuild/配下に生成できます。

Using-Slate-Nativelyに書いてあるように、OSによっては追加でインストールが必要な依存がある場合もあります。

cd slate
bundle install
bundle exec middleman build

GitLab Pagesに公開

せっかく生成できたので、WEB上に公開したいです。ホスティングする方法はいくつかありますが、今回ははじめに触れたようにGitLab Pagesで公開してみます。

とは言っても簡単でこの記事に今まで張られているコマンドをCI上で実行すれば終わりです。

具体的にはリポジトリの .gitlab-ci.yml に以下のようなジョブを追加します。(リポジトリがない場合はプロジェクトを新規作成し、.gitlab-ci.yml とSwagger形式のYAMLをコミットします)

.gitlab-ci.yml
pages:
  image: cimg/ruby:3.2-node
  stage: deploy
  variables:
    SWAGGER_PATH: "books-swagger.yaml"
  script:
    # Slate形式に変換
    - npm install widdershins
    - npx widdershins $SWAGGER_PATH  -o generated.slate.md
    # 静的サイトとして生成
    - git clone https://github.com/slatedocs/slate.git
    - mv generated.slate.md slate/source/index.html.md
    - cd slate
    - bundle install
    - bundle exec middleman build
    - mv build ../public
  artifacts:
    paths:
      - public
  rules:
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH

ポイントはjob名をpagesにする点と、publicという名前でartifactsに登録する点です。

(こだわりポイントとしては、nodeとrubyが必要なので、両方最初から入った cimg/ruby のnodeタグをイメージとして使った点です)

※ Pages機能の有効化やページの公開範囲は、プロジェクトの Settings -> General で設定できます。

image.png

jobが無事成功したらプロジェクトの左側のペインからDeploy -> Pagesにいけば、
以下の画像のようにAccess pagesに生成されたURLが記載されています。

※ ここで Use unique domain をオフにすればURLが毎jobで固定になります

image.png

完成

そしてできたのがこちらになります :rocket:

キャプチャ

image.png

APIドキュメントが無事公開できました!

補足

  • favicon等カスタマイズしたい場合は Slateのwiki が参考になりそうです。

  • 本記事で紹介したBooks APIのドキュメントは以下のリポジトリで生成してますので参考にしていただければ幸いです。

まとめ

この記事は 富士通クラウドテクノロジーズ Advent Calendar 2023 の 15 日目の記事でした。

今日はAPIドキュメントをWEB公開する方法を紹介しました。
仕事や趣味で開発したAPIドキュメントをサクッとホスティングしたい方は、ぜひ参考にしてください。

明日は @fuku2014 さんの Terraform小ネタ集 です。
Terraformでの書き方に悩むこともあると思うのですがそんなときに役立つTipsが知りたい方はぜひご覧ください🤸

5
0
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
5
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?