DocFxとGitHub Actionsでドキュメント生成のCIを構成する
DocFXにより、.NET (C#, VB.NET, F#) のプロジェクトから、静的HTMLによるドキュメントを生成できます。/// <summary>
の要領で記述するXMLドキュメントコメントを集めてきてくれます。
本記事では、DocFXによるドキュメント生成と、生成したHTMLをGitHub Pagesで公開するまでをGitHub Actionsで行う手順を示します。つまり、pull requestをマージするだけで勝手にドキュメントも更新されていくようにします。
成果物(例)
- GitHub Actions https://github.com/shimat/opencvsharp/blob/9cddac20dbe257901c102a8eafe6d90ab224bee4/.github/workflows/docfx.yml#L1
- docfx.json https://github.com/shimat/opencvsharp/blob/772168668dbc743887919308cdfea19d2462ddb1/docfx/docfx.json#L1
- 生成したドキュメント
http://shimat.github.io/opencvsharp/api/OpenCvSharp.html
環境
- GitHub Actions (windows-latest)
- ubuntu-latest でも可
- 適当な .NET プロジェクト
対象とする .NET ソリューションのディレクトリ構成は以下の通りと仮定します。いくつかのクラスライブラリが src/
の下にあります。
MyDotNetSolution/
├ docfx/ (この中は本記事で作成)
│ ├ _site/ (HTML出力先)
│ └ docfx.json (設定ファイル)
├ src/
│ ├ MyProject01/
│ │ ├ MyProject01.csproj
│ │ ├ Class01.cs
│ │ └ ...
│ └ MyProject02/
│ ├ MyProject02.csproj
│ ├ Class02.cs
│ └ ...
└ MyDotNetSolution.sln
DocFXの導入と実行
本家の解説の通りで、特につまづく点はありません。本記事ではChocolateyで導入します。
導入
PS> choco install docfx
MyDotNetSolution
の中で docfx
を実行します。
PS> cd MyDotNetSolution
PS> docfx init -q -o docfx
-q
を外すと、各オプションを対話的に設定できます。
ローカルで表示
さっそくHTMLを見てみるには以下を実行し、http://localhost:8080
をブラウザで開きます。
PS> docfx docfx\docfx.json --serve
ここで上のナビゲーションバーから Api Documentation
を押すと各クラスの説明が見られるはずなのですが、まだ設定が漏れているので見られません。
Api Documentation を構成
docfx/docfx.json
を開きます。上の metadata
の設定を修正し、MyDotNetSolution/src/
以下の各クラスライブラリプロジェクトを見に行くようにします。
{
"metadata": [
{
"src": [
{
"files": [
"**/*.csproj"
],
"src": "../src"
}
],
... (以下略)
ビルドだけ実施
--serve
を付けないで実行すると、ローカルにサーバを立てずHTMLの出力までを実施します。結果は既定では _site
ディレクトリの下に出てきます。
ただし、これで出力された静的HTMLをブラウザで見ると、上のApi Documentation
等と書かれたナビゲーションバーが表示されません。
CORSの問題っぽい?ですので、ローカルではおとなしく --serve
で確認するのが良いと思います。GitHub Pagesにアップロードすれば問題なく表示されます。
GitHub Pagesにアップロード
ある既存のリポジトリにGitHub Pagesをつくる前提とし、そのリポジトリに gh-pages
という空のブランチをつくり、_site
の中にある生成したHTMLをcommit・pushします。
PS> git checkout --orphan gh-pages
PS> git reset --hard
PS> xcopy C:\MyDotNetSolution\dotfx\_site\* .
PS> git commit -m "GitHub Pages initial commit"
PS> git push origin gh-pages
リポジトリの設定を確認し、以下のような表示になっていればGitHub Pagesの構築に成功しているはずです。
GitHub Actionsの構築
ここまでの手順を自動化しましょう。GitHub Actionsが発動するタイミングは、main (古いリポジトリならmaster) ブランチにマージされるタイミングとします。
.github/workflows/docfx.yml
というファイルを新規作成して、以下のように書きます。
name: DocFX
on:
push:
branches:
- main
jobs:
build:
runs-on: windows-2019
steps:
- name: Checkout
uses: actions/checkout@v2
with:
fetch-depth: 1
- name: DocFX
shell: cmd
run: |
choco install docfx -y
docfx docfx\docfx.json
- name: Upload DocFX packages
uses: actions/upload-artifact@v2
with:
name: docfx_site
path: ${{ github.workspace }}\docfx\_site
- name: Publish Documentation on GitHub Pages
uses: peaceiris/actions-gh-pages@v3
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
publish_dir: docfx/_site
Upload DocFX packages
のところは無くても構いません。GitHub Actionsのアーティファクトとしても残すようにしている処理です。
最後のGitHub Pagesの公開 (gh-pages
ブランチへのpush) のステップにはGitHubのトークンが必要です。secrets.GITHUB_TOKEN
は事前設定無しに使える値で、このリポジトリのGitHubトークンが入っています。
これで今後、何か実装を変更するpull requestをマージするたびにGitHub Actionsのワークフローが発動します。マージした後に Actions
のナビゲーションから様子を見に行きましょう。
まとめ
- 少ない手順で、.NETプロジェクトに対するドキュメント生成やGitHub ActionsによるCI構築までを実現できました。
- 老舗のSandcastle Help File Builderに比べ、HTML出力までが軽量でかつ圧倒的に高速です。出力のファイル一式のサイズも小さめです。
- GitHub Pagesへのpushについては既製品があり、トークンの用意だけで終わります。
- 少し凝ってみようとすると手掛かりが少なく、途方に暮れている状態です。しかしぶっちゃけ、C#はIntellisenseなどVisualStudioの機能に全力で頼ればいいので、あまりAPIドキュメントに凝らなくていいよな...というのが正直なところで、私の感覚ではこれ以上がんばる気が起きません。
- issueには「ドキュメント欲しい」「ドキュメント古い」といったのがよく来るので、世間には必要とする人も多いようです。
参考文献
記事
- https://dotnet.github.io/docfx/tutorial/docfx_getting_started.html
- https://www.misuzilla.org/Blog/2016/05/25/Docfx
GitHub Actions Marketplace
全環境対応
- (GitHub Pagesへのデプロイ) https://github.com/marketplace/actions/github-pages-action
Ubuntu向け
今回はwindows-latestのGitHub Actionsで構築しましたが、ubuntu-* でも実現可能です。以下の2つはUbuntuのみの対応なので注意しましょう。
- (DocFX実行) https://github.com/marketplace/actions/docfx-action
- (GitHub Pagesへのデプロイ) https://github.com/maxheld83/ghpages
Discussion