俺の CWL ワークフローがこのエンジンで動かない件 (解決編)

# TL;DR
- 準拠度テストを実行するスクリプトに、各機能ごとの準拠度を示すバッジ用のデータを出力する機能を[追加した](https://github.com/common-workflow-language/cwltest/pull/79)。
- あとは各エンジンのリポジトリの CI に、テスト時に生成したバッジ用データを適当なサーバーに保存 (Github の適当なブランチでも良い) する機能を追加し、README でそれを参照するようにすれば対応状況がすぐにわかるようになる！
    - みんなでプルリクエスト送りましょう！がんがん送りましょう！

# 注意！

本記事は二部構成になっています。

- ([前の記事](https://qiita.com/tm_tn/items/d30abd297d07f577cea6)) CWL で書かれたワークフローが、問答無用で CWL 準拠のワークフローエンジンで動くわけではない話
    - 対象
        - CWL でワークフローを書くユーザー
- (この記事) 上を解決するために、機能ごとの準拠度を表すバッジを付ける話
    - 対象
        - README に詳細な準拠度を表すバッジを付けてドヤ顔したいワークフローエンジン開発者
        - バッジが付いてないエンジンに対して、バッジを付けるプルリクエストを投げつけて「このエンジンはわしが育てた」とドヤ顔したいユーザー


# はじめに

前回は、`なんとかRequirement` が含まれるワークフローやツールの実行には、エンジン側がその Requirement への対応が必要であることと、conformance test を利用した対応状況の確認方法を説明しました。

この問題の解決策として、conformance test を実行する仕組みである [cwltest](https://github.com/common-workflow-language/cwltest) に、テストに付いている各タグごとの対応状況を表すバッジ用データを作成する機能を[実装しました](https://github.com/common-workflow-language/cwltest/pull/79) (マージ済み。次回リリースから有効です)。

今回は追加した機能の解説と、それを利用したバッジの追加方法について説明します。

# つかいかた
[公式のリポジトリ](https://github.com/common-workflow-language/common-workflow-language) には、conformance test を一気に走らせる `run_test.sh` というスクリプトがありますが、残念ながらまだ `run_test.sh` はバッジ作成機能には対応していません[^1]。
そのため、`run_test.sh` が内部で使用している [`cwltest`](https://github.com/common-workflow-language/cwltest) を直接呼び出してバッジ用データを作成します。

## cwltest のインストール
cwltest コマンドは[PyPI に収録されているため](https://pypi.org/project/cwltest/)、pip からインストールできます。
しかし、収録されているバージョンにはまだバッジ作成機能がない[^1]ため、開発版を直接インストールします。

[^1]: 2018年12月11日時点

```console
$ git clone git@github.com:common-workflow-language/cwltest.git
$ cd cwltest
$ pip install -U .
```

## テスト実行

インストール後、conformance test を `cwltest` コマンドを使用して実行します。
このとき、バッジ用データを作成する `--badgedir` オプションを追加します。

```console
$ git clone https://github.com/common-workflow-language/common-workflow-language
$ cd common-workflow-language/v1.0
$ cwltest --test conformance_test_v1.0.yaml --tool cwl-runner --badgedir badges # cwl-runner の準拠度バッジが欲しい場合
...
```

実行後、`badges` (`--badgedir` で指定したディレクトリ)以下に、`タグ名.json` というファイルができています。

```console
$ ls badges
command_line.json       initial_work_dir.json   scatter.json                subworkflow.json
...
$ cat badges/command_line_tool.json | jq .
{
  "subject": "[CWL] command_line_tool",
  "status": "100%",
  "color": "green"
}
```

これらのファイルをどこかのサーバーに置けば準備完了です(Github 内でも OK です)。
今回は、サンプルとしてアップロードした [tom-tan/badge-test](https://github.com/tom-tan/badge-test) リポジトリのファイルを利用します[^2]。

[^2]: リポジトリの README.md に、「こんな感じに表示できるといいよね」というサンプルがあります。

## バッジを貼り付ける
あとはバッジを作成してくれる [badgen.net](https://badgen.net) というサービスを利用することで、バッジを作成できます。例えば、バッジ用のファイルが https://raw.githubusercontent.com/tom-tan/badge-test/master/command_line_tool.json にある場合、以下のように Markdown を書けば、

```markdown
![result of command_line_tool](https://flat.badgen.net/https/raw.githubusercontent.com/tom-tan/badge-test/master/command_line_tool.json)
```

こんな感じのバッジを付けられます。素敵！
![result of command_line_tool](https://flat.badgen.net/https/raw.githubusercontent.com/tom-tan/badge-test/master/command_line_tool.json)

# まとめ
とりあえず、バッジを作成するための仕組みはできました。
あとは各エンジンのリポジトリに対して、以下の変更を加えればいいです。

- CI 上で conformance test を実行する際に `--badgedir` オプションを付ける
    - 実行後、別ブランチなどに作成されたバッジ用ファイルをコミットする
- `README.md` に、コミットされたファイルを参照して各機能ごとのバッジを付ける

OSS として公開されているエンジンの場合、CI の内容は `.travis.yml` 等で管理されているため、そこを変更するプルリクエストを送ることで、上の機能を追加してもらうことが可能です。

なので、バッジを付けるために、みんなでプルリクエストを送りましょう！がんがん送りましょう！

# おまけ
現状の conformance test には `SoftwareRequirement` を用いたテストが存在しないため、`SoftwareRequirement` の準拠度バッジは付けることができません。バッジを作成できるようにするためには、conformance test に対応するテストを追加する必要があります。必要な人はプルリクエストを送りましょう！