Gitlab CI 变量和脚本部分给出不同的结果

Gitlab CI variables and script section give different results

我搜索了很多示例,但它们对我不起作用。

我正在尝试 运行 在打开 MR 时检查更改的文件。

我的.gitlab-ci.yml

run_linters:
  image: python:3
  variables:
    FILES: git diff --name-only $CI_MERGE_REQUEST_TARGET_BRANCH_NAME | grep *.py
  before_script:
    - python3 -m pip install black==21.5b1
    - python3 -m pip install flake8==3.9.2
  script:
    - echo $FILES
    - git diff --name-only $CI_MERGE_REQUEST_TARGET_BRANCH_NAME | grep *.py
    - black --check $FILES
    - flake8 $FILES
  only:
    - merge_requests

我得到了奇怪的输出。

echo $FILESgit diff --name-only main | grep incoming_file.py

incoming_file.py 是该 MR 中唯一的文件。为什么在 grep 附近?

并且 git diff 在脚本部分说 fatal: ambiguous argument 'main': unknown revision or path not in the working tree.

  1. 为什么文件名出现在 grep 周围?
  2. 为什么相同的 git diff 命令给出不同的结果?

Why is filename present around grep?

在 bash 中,当您引用 * 时,这将扩展并尝试匹配当前路径中存在的 files/directories,在您的情况下,因为只有 incoming_file.py存在,所以它扩展到这个。

Why are same git diff commands give different result?

variables:
  FILES: git diff --name-only $CI_MERGE_REQUEST_TARGET_BRANCH_NAME | grep *.py

当你在 variables section 中定义一个变量时,Gitlab 不执行命令,它简单地用字符串 git diff --name-only $CI_MERGE_REQUEST_TARGET_BRANCH_NAME | grep *.py

填充变量 FILES

然后在脚本部分,runner 将 *.py 扩展为 incoming_file.py,将 $CI_MERGE_REQUEST_TARGET_BRANCH_NAME 扩展为 main

这就是为什么在 echo 中您会看到 git diff --name-only main | grep incoming_file.py

这里

 - git diff --name-only $CI_MERGE_REQUEST_TARGET_BRANCH_NAME | grep *.py

您实际执行命令并收到上述消息