Scalaベースのワークフローエンジンcromwellを試してみるの続きです。
cromwellではワークフローをWDL(Workflow Description Language)という言語で記述するようで*1、cromwellはWDLの参照実装という位置付けでもあるようです。WDLの仕様策定もcromwellを開発しているBroad Instituteのメンバーが中心に行われているようです。
WDLの基本的な記述方法については以下のドキュメントが参考になります。
WDLのサンプルGitHubリポジトリに含まれている簡単なワークフローを見てみます。
workflow SayItTwice { input { String name } call WriteGreeting { input: name = name } call ReadItBackToMe { input: written_name = WriteGreeting.output_name } output { File outfile = ReadItBackToMe.repeated_name } } task WriteGreeting { input { String name } command { echo "${name}" } output { File output_name = stdout() } } task ReadItBackToMe { input { File written_name String original_name = read_string(written_name) } command { echo "${original_name} to you too" } output { File repeated_name = stdout() } }
task
でタスクを定義し、call
で呼び出すという感じ。処理はcommand
に外部コマンドを記述、タスクのouput
で宣言した出力を別のタスクのinput
で指定することでタスク間の依存関係を定義が定義されます。ワークフロー自体の入力は以下のようなJSONファイルで与えます。
{ "SayItTwice.name": "Saying the same thing twice...is nice" }
CLIで実行する場合、-i
オプションでこのJSONファイルを指定します。
$ java -jar cromwell-<version>.jar run linear.wdl -i linear.json
このワークフローでは使われていませんが、runtime
を指定することでdockerコンテナで実行したり、scatter
/gather
で集合を並列処理したりもできるようです。
WDL編集用にVSCodeのエクステンションの開発も進められているようです。あまりアクティブに開発されている感じではないっぽいですが…。
*1:cromwellではWDL以外にCDL(Common Workflow Language)もサポートされています。