我的 GitHub 操作中嵌入式 shell 脚本的 YAML 语法有啥问题?

Posted

技术标签:

【中文标题】我的 GitHub 操作中嵌入式 shell 脚本的 YAML 语法有啥问题?【英文标题】:What's wrong with my YAML syntax for an embedded shell script in my GitHub action?我的 GitHub 操作中嵌入式 shell 脚本的 YAML 语法有什么问题? 【发布时间】:2021-12-17 18:15:26 【问题描述】:

在我的 GitHub 操作 workflow 中,我有以下部分(在作业/构建/步骤下):

      - name: Install/Select GCC and G++
        run: |
          sudo apt-get install -y gcc-$ matrix.gcc  g++-$ matrix.gcc 
          echo "CC=/usr/bin/gcc-$ matrix.gcc " >> $GITHUB_ENV
          echo "CXX=/usr/bin/g++-$ matrix.gcc " >> $GITHUB_ENV
          echo "CUDAHOSTCXX=/usr/bin/g++-$ matrix.gcc " >> $GITHUB_ENV

GitHub 运行失败,发出:

工作流文件无效

第 82 行的 yaml 语法有错误

现在,我从另一个存储库中提取了这个same code 应该可以工作的存储库……这是怎么回事?

【问题讨论】:

这似乎与缩进有关,看看第 76 行和第 83 行 - 符号前有多少空格。 @GuiFalourd:哦,缩进很重要?这不仅仅是“任意数量的空格”吗?我认为 YAML didn't care much 关于缩进。 在这种情况下,我认为这很重要,因为工作、步骤和工作流变量有很多级别。例如,在您的情况下,第 83 行的步骤与作业变量字段处于相同的缩进级别,并且由于它不希望该字段存在,因此它返回错误。 @einpoklum 一定很喜欢那篇文章复制my answer 而不尊重CC-BY-SA。没有提到的是,当然,同一个集合节点的键/项必须在相同的缩进级别。只是说,对那个压痕层的深度没有要求,只要它比周围层至少缩进一个空间。这就是你断章取义时得到的结果。 【参考方案1】:

以下是相关行,从68开始,有些行略过:

    steps:
      - uses: actions/checkout@v2
      - name: Install CUDA
        # .. snip ..

      - name: Install/Select GCC and G++
        run: |
          sudo apt-get install -y gcc-$ matrix.gcc  g++-$ matrix.gcc 
          echo "CC=/usr/bin/gcc-$ matrix.gcc " >> $GITHUB_ENV
          echo "CXX=/usr/bin/g++-$ matrix.gcc " >> $GITHUB_ENV
          echo "CUDAHOSTCXX=/usr/bin/g++-$ matrix.gcc " >> $GITHUB_ENV
    - name: CMake configure

steps: 是 YAML 映射的一部分。下一行开始一个 YAML 序列,它缩进了两个空格。因此,该序列在第 82 行以- name: CMake configure 结束。我不知道为什么 GitHub 将其显示为第 83 行;如果您将其复制粘贴到编辑器,则该空行不存在。可能是行尾问题,但我懒得启动十六进制编辑器来找出答案。

无论如何,在第 82 行,YAML 解析器结束了映射键 steps 的值,因此期望另一个映射键或映射结束。但是,它会找到一个序列项。那是你的错误。

您似乎打算将以下序列项作为steps: 的一部分。如果是这样,请将它们缩进到与前面的项目相同的级别。

【讨论】:

以上是关于我的 GitHub 操作中嵌入式 shell 脚本的 YAML 语法有啥问题?的主要内容,如果未能解决你的问题,请参考以下文章

Shell脚本中的数组,而不是Bash

分享嵌入式中几个实用的shell脚本!

Shell和Makefile

嵌入式Linux从入门到精通之第六节:shell脚本

嵌入式Linux从入门到精通之第六节:shell脚本

Shell脚本中执行sql语句操作