【问题标题】:Github Action: Split Long Command into Multiple LinesGithub Action:将长命令拆分为多行
【发布时间】:2020-05-14 04:32:31
【问题描述】:

我有一个非常长的 Github 操作命令:

name: build

on: [push]

jobs:
    build:
        runs-on: ubuntu-18.04
        steps:
            - uses: actions/checkout@v1
            - name: Install Prerequisites
              run: |
                sudo apt-get update
                sudo apt-get install -y --no-install-recommends "a very very long list of prerequisites"

我想知道是否可以将长命令拆分为多行以提高可读性?我试过分隔符'\',但它不起作用。提前致谢。

【问题讨论】:

    标签: github yaml github-actions


    【解决方案1】:

    我有一个使用反斜杠分隔行的多行命令,如下所示:

    - name: Configure functions
      run: |
        firebase functions:config:set \
          some.key1="${{ secrets.SOME_KEY_1 }}" \
          some.key2="${{ secrets.SOME_KEY_2 }}" \
        ...    
    
    

    注意前面的“|”字符。

    【讨论】:

    • 这是正确的答案,将是一个更好的答案。反斜杠的工作方式与 bash 中的多行命令相同。 (不过,为了便于阅读,我建议使用悬挂缩进。)
    • 有谁知道什么时候可以做到这一点? (我认为当我写下我的答案时这是不可能的,但我完全同意这个答案现在被接受)
    • @dan1st 在我问这个的时候我也不认为这是可能的,但似乎 Github 人已经添加了对反斜杠的支持。
    • 我不知道以前对任何人来说它是如何工作的,但是添加反斜杠现在不适用于 GitHub Actions。这不应该是公认的答案。
    • 我确认:目前这在 GitHub Actions 上不起作用。您需要使用“>”而不是“I”(请参阅​​其他答案)
    【解决方案2】:

    您可以将 YAML 折叠样式与 GitHub Actions 支持的 > 结合使用。

    例如,

    run: >
      xvfb-run
      ./mvnw -f my/pom.xml
      clean verify
      -DskipTests
    

    换行符将被替换为空格,所以上面的等价于

    run: xvfb-run ./mvnw -f my/pom.xml clean verify -DskipTests
    

    【讨论】:

    • 另请参阅yaml-multiline.info 以使用不同的标量/咀嚼风格。
    • 这行得通,谢谢!重要提示:根据 yml 规范,空格在这里很重要,因此行前的任何额外制表符都会导致问题。
    • 它似乎可以工作,但它不会因任何错误而失败,与 | 相同也..所以它变得毫无意义..
    • @JohnnyOshika 谢谢你的评论!它消除了我长期以来的误解。
    • 简单说明一下这是针对默认外壳的。例如,我的 YML 文件有一些位运行 R 代码 shell: Rscript {0},在这些情况下换行不需要任何特殊字符(就像在 R 中一样)。
    【解决方案3】:

    因为没有被提及,所以打算分享这个。

    你可以使用:

    • | 称为 Literal Block Scalar,它保留新行和尾随空格
    • > 称为 Folded Block Scalar,它将新行转换为空格
    • 普通的旧字符串,不带引号、单引号或双引号

    我发现网站 yaml-multiline.info 有助于了解如何解释 yaml 字符串。

    对于我的用例,我最终做了以下事情:

    run: >-
      for i in $(find . -type f -name "*.log");
      do
       echo "File: ${i} \n";
       cat $i;
       printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' -;
      done
    

    【讨论】:

    • >- 中的连字符有什么作用?
    • @silkfire 根据链接的网站,它似乎从块的末尾删除了换行符,因此末尾没有额外的尾随 \n。
    • 也就是说,GitHub Actions 不支持此功能:github.com/actions/runner/issues/418
    【解决方案4】:

    这在之前使用反斜杠是不可能的。请参阅接受的答案,了解如何立即进行操作。


    据我所知,GitHub Actions 不支持。

    但是,您可以为此使用环境变量。

    例如,此脚本将您的命令拆分为 3 行代码并作为一行执行。

    steps:
      - name: Install Prerequisites
        run: |
          sudo apt-get update
          bash -c "$line1 $line2 $line3"
        env:
        - line1='sudo apt-get install -y --no-install-recommends '
        - line2='a very very long list'
        - line3='of prerequisites'
    

    它创建环境变量 line1line2line3,并在 bash 会话中连接并执行它们。

    【讨论】:

      【解决方案5】:

      以上答案都有部分,但这是在 github 复合操作中对我有用的方法。它也应该在常规工作流程中工作。

      正如@lorenzo-bettini 所说,如果您希望所有内容都在一条线上,请使用@Josue Alexander Ibarra 所说的Folded Block Scalar

      run: >
        xvfb-run
        ./mvnw -f my/pom.xml
        clean verify
        -DskipTests
      

      换行符将被替换为空格,所以上面的等价于

      run: xvfb-run ./mvnw -f my/pom.xml clean verify -DskipTests
      

      如果您希望保留新行,请使用 @Josue Alexander Ibarra 所说的 Literal Block Scalar

      run: |
        FILE=./package.json
        if test -f "$FILE"
        then
          echo "$FILE exists."
        else
          echo "File does not exist"
        fi
      

      但是,当您执行多行运行时,您必须确保缩进正确,否则 step 会认为 shell: bashrun: | 字符串的一部分。

      错误:

        steps:
          - run: |
            FILE=./package.json
            if test -f "$FILE"
            then
              echo "$FILE exists."
            else
              echo "File does not exist"
            fi
            shell: run
      

      右:

        steps:
          - run: |
              FILE=./package.json
              if test -f "$FILE"
              then
                echo "$FILE exists."
              else
                echo "File does not exist"
              fi
            shell: run
      

      【讨论】:

        【解决方案6】:

        还要注意表达式的joinformat 函数:

        HELLO_WORLD = ${{ join('Hello', 'world!') }}
        HELLO_WORLD = ${{ format('{{Hello {0}}}', 'World') }}
        

        大概这些可以与环境变量相结合。

        【讨论】:

          猜你喜欢
          • 2011-02-06
          • 2022-09-23
          • 2016-05-20
          • 1970-01-01
          • 2016-10-04
          • 1970-01-01
          • 2021-03-01
          • 1970-01-01
          • 2023-03-21
          相关资源
          最近更新 更多