Github Action:将长命令拆分为多行

Boj*_*eng 55 yaml github github-actions

我有一个非常长的 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"
Run Code Online (Sandbox Code Playgroud)

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

Mik*_*rco 74

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

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

Run Code Online (Sandbox Code Playgroud)

注意前面的“|” 特点。

  • 我不知道以前对任何人来说它是如何工作的,但添加反斜杠现在不适用于 GitHub Actions。这不应该是公认的答案。 (26认同)
  • 目前有效。确保反斜杠之前也有一个空格。 (8认同)
  • 使用“>”。“|” 不再起作用了。 (7认同)
  • 这是正确的答案,并且会是一个更好接受的答案。反斜杠的作用与 bash 中的多行命令相同。(不过为了可读性,我建议使用悬挂缩进。) (3认同)
  • 现在也不起作用 (2认同)
  • 我确认:目前这在 GitHub Actions 上不起作用。您需要使用“>”而不是“I”(请参阅​​其他答案) (2认同)

lor*_*ini 42

您可以使用YAML折叠风格>它由GitHub的行动支持。

例如,

run: >
  xvfb-run
  ./mvnw -f my/pom.xml
  clean verify
  -DskipTests
Run Code Online (Sandbox Code Playgroud)

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

run: xvfb-run ./mvnw -f my/pom.xml clean verify -DskipTests
Run Code Online (Sandbox Code Playgroud)

  • 这有效,谢谢!重要提示:根据 yml 规范,空格在这里很重要,因此行前的任何额外制表符都会导致问题。 (8认同)
  • 另请参阅 https://yaml-multiline.info/ 来尝试不同的标量/chomping 风格。 (2认同)
  • 正如@JohnnyOshika 指出的那样,空白在这里至关重要(经过惨痛的教训才知道)。如果一行以多余的空格开头,则该行将被忽略。因此,请确保所有行都从同一列开始。 (2认同)

Mix*_*nge 34

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

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

run: >
  xvfb-run
  ./mvnw -f my/pom.xml
  clean verify
  -DskipTests
Run Code Online (Sandbox Code Playgroud)

换行符将替换为空格,因此上面相当于

run: xvfb-run ./mvnw -f my/pom.xml clean verify -DskipTests
Run Code Online (Sandbox Code Playgroud)

如果您想保留新行,请使用 @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
Run Code Online (Sandbox Code Playgroud)

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

错误的:

  steps:
    - run: |
      FILE=./package.json
      if test -f "$FILE"
      then
        echo "$FILE exists."
      else
        echo "File does not exist"
      fi
      shell: bash
Run Code Online (Sandbox Code Playgroud)

正确的:

  steps:
    - run: |
        FILE=./package.json
        if test -f "$FILE"
        then
          echo "$FILE exists."
        else
          echo "File does not exist"
        fi
      shell: bash
Run Code Online (Sandbox Code Playgroud)

  • 重要提示:对于“>”块,请确保每行具有相同的缩进。 (3认同)

Jos*_*rra 11

由于尚未提及,因此将在此分享。

您可以使用:

  • |称为 aLiteral Block Scalar保留新行和尾随空格
  • >称为 a 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
Run Code Online (Sandbox Code Playgroud)

  • 也就是说,GitHub Actions 不支持此功能:https://github.com/actions/runner/issues/418 (8认同)
  • `>-` 中的连字符有什么作用? (3认同)
  • @PaulRazvanBerg,正如我在之前的评论中提到的,添加连字符(即“>-”)会去除最后一个换行符,而不包括它(即“>”)会在字符串末尾包含一个换行符。 (2认同)

dan*_*1st 8

早些时候,这是不可能使用反斜杠的。请参阅有关如何立即执行的已接受答案。


据我所知,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'
Run Code Online (Sandbox Code Playgroud)

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