使用循环结构EC2 TOE - EC2 Image Builder
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用循环结构EC2 TOE

本节提供了一些信息,以帮助您在EC2 TOE。循环结构定义了重复的指令序列。您可以在EC2 TOE:

  • for构造 — 迭代有界的整数序列。

  • forEach构造

    • forEach循环与输入列表-迭代有限的字符串集合。

    • forEach循环-迭代由分隔符连接的有限字符串集合。

注意

循环结构仅支持字符串数据类型。

引用迭代变量

要引用当前迭代变量的索引和值,引用表达式{{ loop.* }}必须在包含循环结构的步骤的输入正文中使用。此表达式不能用于引用另一个步骤的循环结构的迭代变量。

引用表达式包含以下成员:

  • {{ loop.index }}— 当前迭代的序数位置,索引位于0

  • {{ loop.value }}— 与当前迭代变量关联的值。

循环名称

所有循环结构都有一个用于标识的可选名称字段。如果提供了循环名称,则可以使用它来引用步骤输入正文中的迭代变量。要引用命名循环的迭代索引和值,请使用{{ <loop_name>.* }}替换为{{ loop.* }}在步骤的输入正文中。此表达式不能用于引用另一个步骤的命名循环结构。

引用表达式包含以下成员:

  • {{ <loop_name>.index }}— 指定循环的当前迭代的序数位置,索引位于0

  • {{ <loop_name>.value }}— 与命名循环的当前迭代变量关联的值。

解析引用表达式

这些区域有:EC2 TOE解析引用表达式:

  • {{ <loop_name>.* }}–EC2 TOE使用以下逻辑解析此表达式:

    • 如果当前正在运行的步骤的循环与<loop_name>值,则引用表达式将解析为当前正在运行的步骤的循环结构。

    • <loop_name>解析为指定的循环结构(如果它出现在当前运行的步骤中)。

  • {{ loop.* }}–EC2 TOE使用当前正在运行的步骤中定义的循环结构来解析表达式。

如果引用表达式在不包含循环的步骤中使用,则EC2 TOE不会解析表达式,并且它们出现在步骤中,而不会替换。

注意

引用表达式必须包含在双引号内才能被 YAML 编译器正确解释。

循环结构的类型

本节提供了有关循环构造类型的信息和示例,这些类型可在EC2 TOE。

forloop

这些区域有:for循环迭代在变量的开始和结束所概括的边界内指定的一系列整数。迭代值位于集合[start, end]并且包括边界值。

EC2 TOE验证startend, 和updateBy值,以确保组合不会导致无限循环。

for循环模式

name: "StepName" action: "ActionModule" loop: name: "string" for: start: int end: int updateBy: int inputs: ...
for循环输入
字段 描述 Type 必需 默认值

name

循环的唯一名称。与同一阶段中的其他循环名称相比,它必须是唯一的。

字符串

""

start

迭代的起始值。不接受链接表达式。

整数

不适用

end

迭代的结束值。不接受链接表达式。 整数 不适用

updateBy

通过添加更新迭代值的差异。它必须为负值或正值非零值。不接受链接表达式。 整数 不适用

for循环输入示例

name: "CalculateFileUploadLatencies" action: "ExecutePowerShell" loop: for: start: 100000 end: 1000000 updateBy: 100000 inputs: commands: - | $f = new-object System.IO.FileStream c:\temp\test{{ loop.index }}.txt, Create, ReadWrite $f.SetLength({{ loop.value }}MB) $f.Close() - c:\users\administrator\downloads\latencyTest.exe --file c:\temp\test{{ loop.index }}.txt - Amazon s3 cp c:\users\administrator\downloads\latencyMetrics.json s3://bucket/latencyMetrics.json - | Remove-Item -Path c:\temp\test{{ loop.index }}.txt Remove-Item -Path c:\users\administrator\downloads\latencyMetrics.json

forEach带输入列表的循环

这些区域有:forEach循环遍历一个显式的值列表,可以是字符串和链接表达式。

forEach带输入列表模式的循环

name: "StepName" action: "ActionModule" loop: name: "string" forEach: - "string" inputs: ...
forEach带输入列表输入的循环
字段 描述 Type 必需 默认值

name

循环的唯一名称。与同一阶段中的其他循环名称相比,它必须是唯一的。

字符串

""

字符串列表forEachloop

用于迭代的字符串列表。接受链接表达式作为列表中的字符串。链接表达式必须用双引号括起来,YAML 编译器才能正确解释它们。

字符串列表

不适用

forEach循环输入列表示例 1

name: "ExecuteCustomScripts" action: "ExecuteBash" loop: name: BatchExecLoop forEach: - /tmp/script1.sh - /tmp/script2.sh - /tmp/script3.sh inputs: commands: - echo "Count {{ BatchExecLoop.index }}" - sh "{{ loop.value }}" - | retVal=$? if [ $retVal -ne 0 ]; then echo "Failed" else echo "Passed" fi

forEach循环输入列表示例 2

name: "RunMSIWithDifferentArgs" action: "ExecuteBinary" loop: name: MultiArgLoop forEach: - "ARG1=C:\Users ARG2=1" - "ARG1=C:\Users" - "ARG1=C:\Users ARG3=C:\Users\Administrator\Documents\f1.txt" inputs: commands: path: "c:\users\administrator\downloads\runner.exe" args: - "{{ MultiArgLoop.value }}"

forEach循环输入列表示例 3

name: "DownloadAllBinaries" action: "S3Download" loop: name: MultiArgLoop forEach: - "bin1.exe" - "bin10.exe" - "bin5.exe" inputs: - source: "s3://bucket/{{ loop.value }}" destination: "c:\temp\{{ loop.value }}"

forEach带分隔列表的循环

循环遍历包含由分隔符分隔的值的字符串。要迭代字符串的组成部分,EC2 TOE使用分隔符将字符串拆分为适合迭代的数组。

forEach具有分隔列表模式的循环

name: "StepName" action: "ActionModule" loop: name: "string" forEach: list: "string" delimiter: ".,;:\n\t -_" inputs: ...
forEach带分隔列表输入的循环
字段 描述 Type 必需 默认值

name

指定循环的唯一名称。与同一阶段中的其他循环名称相比,它应该是唯一的。

字符串

""

list

由通用分隔符连接的组成字符串组成的字符串组成的字符串。也接受链接表达式。在链接表达式的情况下,请确保这些表达式用双引号括起来,以便 YAML 编译器正确解释。 字符串

不适用

delimiter

用于分隔块内字符串的字符。默认值为逗号字符。给定列表中只允许一个分隔符字符:
  • 点:"."

  • 逗号:","

  • 分号:";"

  • 冒号:":"

  • 新建行:"\n"

  • 选项卡:"\t"

  • 空格:" "

  • 连字符:"-"

  • 下划线:"_"

不能使用链接表达式。

字符串 逗号:","
注意

list被视为不可变字符串。如果list在运行时更改,则在运行过程中不会反映出来。

forEach循环与分隔列表示例 1

// Uses chaning expression ({{ <phase_name>.<step_name>.inputs/outputs.<var_name> }}) // to refer to another step's input/output variables for code re-use. name: "RunMSIs" action: "ExecuteBinary" loop: forEach: list: "{{ build.GetAllMSIPathsForInstallation.outputs.stdout }}" delimiter: "\n" inputs: commands: path: "{{ loop.value }}"

forEach带有分隔列表的循环示例 2

name: "UploadMetricFiles" action: "S3Upload" loop: forEach: list: "/tmp/m1.txt,/tmp/m2.txt,/tmp/m3.txt,..." inputs: commands: - source: "{{ loop.value }}" destination: "s3://bucket/key/{{ loop.value }}"

步骤字段

循环是步骤的一部分。与步骤运行相关的任何字段都不会应用于单个迭代。步骤字段仅适用于步骤级别,如下所示:

  • timeoutSeconds— 循环的所有迭代都必须在此字段指定的时间段内运行。如果循环运行超时,那么EC2 TOE运行步骤的重试策略,并为每次新尝试重置超时参数。如果循环运行在达到最大重试次数后超过超时值,则步骤的失败消息指出循环运行已超时。

  • onFailure— 将故障处理应用于步骤,如下所示:

    • 如果onFailure设置为Abort、EC2 TOE退出循环并根据重试策略重试步骤。超过最大重试尝试次数之后,EC2 TOE将当前步骤标记为失败,并停止运行该进程。

      EC2 TOE将父阶段和文档的状态代码设置为Failed

      注意

      失败步骤后不会运行其他步骤。

    • 如果onFailure设置为Continue、EC2 TOE退出循环并根据重试策略重试步骤。超过最大重试尝试次数之后,EC2 TOE将当前步骤标记为失败,并继续运行下一步。

      EC2 TOE将父阶段和文档的状态代码设置为Failed

    • 如果onFailure设置为Ignore、EC2 TOE退出循环并根据重试策略重试步骤。超过最大重试尝试次数之后,EC2 TOE将当前步骤标记为IgnoredFailure,然后继续运行下一个步骤。

      EC2 TOE将父阶段和文档的状态代码设置为SuccessWithIgnoredFailure

      注意

      此操作仍被视为成功运行,但包括通知您一个或多个步骤失败并被忽略的信息。

  • maxAttempts— 对于每次重试,整个步骤和所有迭代都从头开始运行。

  • status— 步骤运行的总体状态。status不表示单个迭代的状态。具有循环的步骤的状态如下所示:

    • 如果单个小版本无法运行,则步骤的状态指向失败。

    • 如果所有迭代都成功,则步骤的状态指示成功。

  • startTime— 步骤运行的总体开始时间。不表示单个迭代的开始时间。

  • endTime— 步骤运行的总体结束时间。不表示单个迭代的结束时间。

  • 失败消息— 包括在出现非超时错误时失败的迭代索引。如果出现超时错误,则该消息指出循环运行失败。不提供每个迭代的单个错误消息,以最大限度地减少失败消息的大小。

步进和迭代输出

每次迭代都包含一个输出。在循环运行结束时,EC2 TOE将所有成功的迭代输出合并到detailedOutput.json。合并输出是属于操作模块输出模式中定义的相应输出键的值的归类。以下示例演示如何合并输出:

输出ExecuteBash用于迭代 1

[{"stdout":"Hello"}]

输出ExecuteBash用于迭代 2

[{"stdout":"World"}]

输出ExecuteBash针对步骤

[{"stdout":"Hello\nWorld"}]

例如,ExecuteBashExecutePowerShell, 和ExecuteBinary是返回STDOUT作为操作模块输出。STDOUT消息与新行字符连接,以生成detailedOutput.json

EC2 TOE不会合并不成功迭代的输出。