【问题标题】:How to call multiple multiline commands in a yml script?如何在 yml 脚本中调用多个多行命令?
【发布时间】:2020-09-13 12:06:02
【问题描述】:

我不太确定如何在我的 CI 的 yml 文件中添加带有多个命令的多行脚本 - 在我的情况下是 .gitlab-ci.yml

production:
    stage: deploy
    image: ${DOCKER_IMAGE}
    script:
        - while IFS='-' read -r dom app; do
            docker stop "$dom-$app" || true &&
            docker rm "$dom-$app" || true 
            docker run
               --name "$dom-$app"
               --detach
               --restart=always
               -e VIRTUAL_HOST=$dom
               "$dom-$app":latest
        done < $FILE

所以我在这里做的是读取包含应用列表的文件。对于每一行,我必须停止现有的 docker 映像,将其删除并使用一些参数运行新的。

  1. 如何连接 docker 命令(停止、rm 和运行)?也许是&amp;&amp;
  2. $dom-$app 必须使用 " 吗?

【问题讨论】:

    标签: bash shell yaml gitlab-ci


    【解决方案1】:

    有几种方法可以在 YAML 中创建多行字符串。

    你使用多行纯字符串的方式,所有的行都会用空格折叠在一起。

    你的字符串的最后一行缩进不够。

    应该引用这样的较长字符串,因为在 YAML 中很特殊的字符串中很有可能存在 : #

    我建议使用文字块样式,因为这意味着文本将完全按照您看到的方式解释:

        script:
        - |
          while IFS='-' read -r dom app; do
            docker stop "$dom-$app" || true
            docker rm "$dom-$app" || true 
            docker run \
             --name "$dom-$app" \
             --detach \
             --restart=always \
             -e VIRTUAL_HOST=$dom \
             "$dom-$app":latest
          done < $FILE
    

    (请注意,序列(以- 开头的项目)不必缩进,这就是- 直接位于script 下方的原因。)

    您可以在我的网站上找到有关 YAML 引用样式的更多信息: https://www.yaml.info/learn/quote.html

    【讨论】:

    • 谢谢。我必须引用我的变量吗?在name 参数中我做到了,在VIRTUAL_HOST 中我没有......而且我是否需要在每个命令的末尾加上&amp;&amp;?第一次我做到了,第二次没有..
    • 例如,如果变量可能包含空格,那么在 bash 中引用总是一个好主意。因此,如果您不确定,请引用它。但这是一个纯粹的 bash 问题。如果您使用&amp;&amp; 连接两个命令,那么只有第一个成功时才会执行第二个命令。所以这取决于你希望你的脚本如何表现。
    猜你喜欢
    • 2020-05-10
    • 2023-01-12
    • 2020-03-08
    • 1970-01-01
    • 1970-01-01
    • 2014-01-25
    • 2019-08-15
    • 1970-01-01
    • 2020-08-11
    相关资源
    最近更新 更多