Github 操作: 将长命令拆分为多行

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

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"

我可以知道是否有可能将长命令分割成多行以提高可读性吗?我已经试过分离器”,但它不工作。

59638 次浏览

这是不可能的使用反斜杠,早些时候。看到接受的答案如何做到这一点。


据我所知,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 会话中连接和执行它们。

还要注意表达式的 加入格式函数:

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

大概这些可以与 env 变量结合起来。

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

- name: Configure functions
run: |
firebase functions:config:set \
some.key1="$\{\{ secrets.SOME_KEY_1 }}" \
some.key2="$\{\{ secrets.SOME_KEY_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

既然还没有被提及,我们就来分享一下。

你可使用:

  • 称为 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

上面的答案都有一些片段,但这是我在 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: bash

右:

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