1. 问题
    2. 如何将工具连接到一个工作流中?
    3. 目标
    4. 学习如何从多个CWL工具描述中构建工作流。

    这个工作流从tar文件中提取java源文件,然后编译它。
    1st-workflow.cwl

    1. #!/usr/bin/env cwl-runner
    2. cwlVersion: v1.0
    3. class: Workflow
    4. inputs:
    5. tarball: File
    6. name_of_file_to_extract: string
    7. outputs:
    8. compiled_class:
    9. type: File
    10. outputSource: compile/classfile
    11. steps:
    12. untar:
    13. run: tar-param.cwl
    14. in:
    15. tarfile: tarball
    16. extractfile: name_of_file_to_extract
    17. out: [extracted_file]
    18. compile:
    19. run: arguments.cwl
    20. in:
    21. src: untar/extracted_file
    22. out: [classfile]

    在单独的文件中使用YAML或JSON对象来描述运行的输入:
    1st-workflow-job.yml

    1. tarball:
    2. class: File
    3. path: hello.tar
    4. name_of_file_to_extract: Hello.java

    调用 cwl-runner :

    1. $ echo "public class Hello {}" > Hello.java && tar -cvf hello.tar Hello.java
    2. $ cwl-runner 1st-workflow.cwl 1st-workflow-job.yml
    3. [job untar] /tmp/tmp94qFiM$ tar --create --file /home/example/hello.tar Hello.java
    4. [step untar] completion status is success
    5. [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
    6. [step compile] completion status is success
    7. [workflow 1st-workflow.cwl] outdir is /home/example
    8. Final process status is success
    9. {
    10. "compiled_class": {
    11. "location": "/home/example/Hello.class",
    12. "checksum": "sha1$e68df795c0686e9aa1a1195536bd900f5f417b18",
    13. "class": "File",
    14. "size": 416
    15. }
    16. }

    cwlVersion字段表示文档使用的CWL规范的版本。class字段表示本文档描述了一个工作流。

    1. cwlVersion: v1.0
    2. class: Workflow

    输入部分描述了工作流的输入。这是输入参数列表,其中每个参数由一个标识符和一个数据类型组成。这些参数可以用作特定工作流步骤的输入源。

    1. inputs:
    2. tarball: File
    3. name_of_file_to_extract: string

    输出部分描述工作流的输出。这是一个输出参数列表,其中每个参数由一个标识符和一个数据类型组成。outputSource将编译步骤的输出参数类文件连接到工作流输出参数compiled_class。

    1. outputs:
    2. compiled_class:
    3. type: File
    4. 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部分列出了期望从工具中得到的输出参数。

    1. compile:
    2. run: arguments.cwl
    3. in:
    4. src: untar/extracted_file
    5. out: [classfile]

    第二步编译依赖于第一步的结果,即使用untar/extracted_file将输入参数src连接到untar的输出参数。此步骤类文件的输出连接到上述工作流的输出部分。