问题
如何将工具连接到一个工作流中?
目标
学习如何从多个CWL工具描述中构建工作流。
这个工作流从tar文件中提取java源文件,然后编译它。
1st-workflow.cwl
#!/usr/bin/env cwl-runner
cwlVersion: v1.0
class: Workflow
inputs:
tarball: File
name_of_file_to_extract: string
outputs:
compiled_class:
type: File
outputSource: compile/classfile
steps:
untar:
run: tar-param.cwl
in:
tarfile: tarball
extractfile: name_of_file_to_extract
out: [extracted_file]
compile:
run: arguments.cwl
in:
src: untar/extracted_file
out: [classfile]
在单独的文件中使用YAML或JSON对象来描述运行的输入:
1st-workflow-job.yml
tarball:
class: File
path: hello.tar
name_of_file_to_extract: Hello.java
调用 cwl-runner
:
$ echo "public class Hello {}" > Hello.java && tar -cvf hello.tar Hello.java
$ cwl-runner 1st-workflow.cwl 1st-workflow-job.yml
[job untar] /tmp/tmp94qFiM$ tar --create --file /home/example/hello.tar Hello.java
[step untar] completion status is success
[job compile] /tmp/tmpu1iaKL$ docker run -i --volume=/tmp/tmp94qFiM/Hello.java:/var/lib/cwl/job301600808_tmp94qFiM/Hello.java:ro --volume=/tmp/tmpu1iaKL:/var/spool/cwl:rw --volume=/tmp/tmpfZnNdR:/tmp:rw --workdir=/var/spool/cwl --read-only=true --net=none --user=1001 --rm --env=TMPDIR=/tmp java:7 javac -d /var/spool/cwl /var/lib/cwl/job301600808_tmp94qFiM/Hello.java
[step compile] completion status is success
[workflow 1st-workflow.cwl] outdir is /home/example
Final process status is success
{
"compiled_class": {
"location": "/home/example/Hello.class",
"checksum": "sha1$e68df795c0686e9aa1a1195536bd900f5f417b18",
"class": "File",
"size": 416
}
}
cwlVersion字段表示文档使用的CWL规范的版本。class字段表示本文档描述了一个工作流。
cwlVersion: v1.0
class: Workflow
输入部分描述了工作流的输入。这是输入参数列表,其中每个参数由一个标识符和一个数据类型组成。这些参数可以用作特定工作流步骤的输入源。
inputs:
tarball: File
name_of_file_to_extract: string
输出部分描述工作流的输出。这是一个输出参数列表,其中每个参数由一个标识符和一个数据类型组成。outputSource将编译步骤的输出参数类文件连接到工作流输出参数compiled_class。
outputs:
compiled_class:
type: File
outputSource: compile/classfile
steps部分描述了工作流的实际步骤。在本例中,第一步是从tar文件中提取文件,第二步使用java编译器从第一步编译文件。工作流步骤不一定按照列出的顺序运行,而是由步骤之间的依赖关系(使用source)确定顺序。此外,不相互依赖的工作流步骤可以并行运行。
第一步,untar运行tar-param.cwl(在前面的参数引用中描述)。该工具有两个输入参数tarfile和extractfile,以及一个输出参数extracted_file。
工作流步骤的in部分使用source将这两个输入参数连接到工作流的输入,tarball和name_of_file_to_extract。这意味着,当执行工作流步骤时,分配给tarball和name_of_file_to_extract的值将被用于参数tarfile和extractfile,以便运行工具。
工作流步骤的out部分列出了期望从工具中得到的输出参数。
compile:
run: arguments.cwl
in:
src: untar/extracted_file
out: [classfile]
第二步编译依赖于第一步的结果,即使用untar/extracted_file将输入参数src连接到untar的输出参数。此步骤类文件的输出连接到上述工作流的输出部分。