如何列出修改后的文件?

Gaj*_*jus 9 gitlab-ci

每当提高PR 时,我都会使用运行定义的脚本.gitlab-ci.yml

我想获取自上次提交以来已修改文件的列表。

用例是在大型代码库中运行特定于文件的集成测试。

Gaj*_*jus 10

如果您不需要知道路径,而只需要在更改特定文件时才运行特定作业,则使用only/changes .gitlab-ci.yml配置,例如

docker build:
  script: docker build -t my-image:$CI_COMMIT_REF_SLUG .
  only:
    changes:
      - Dockerfile
      - docker/scripts/*
Run Code Online (Sandbox Code Playgroud)

另外,如果您需要获取修改后的脚本的路径,则可以使用 CI_COMMIT_BEFORE_SHACI_COMMIT_SHA环境变量,例如

> git diff --name-only $CI_COMMIT_BEFORE_SHA $CI_COMMIT_SHA
src/countries/gb/homemcr.js
src/countries/gb/kinodigital.js
Run Code Online (Sandbox Code Playgroud)

  • 似乎没有对CI_COMMIT_BEFORE_SHA进行有用或严格的规定,以使其始终有效。例如,最初的问题是关于PR / MR何时升高的问题,所以您真正需要知道的是MR中的文件已更改,而不仅仅是自从上一次提交以来。 (4认同)
  • 警告:`CI_COMMIT_BEFORE_SHA` 是欺骗性的:假设您在经过长时间审核后刚刚提交了一系列版本 10。与版本 9 相比,版本 10 仅更改了一个文件。在这种情况下 CI_COMMIT_BEFORE_SHA 指向版本 9,基本上没有用(使用 gitlab 11.10.2 进行测试) (3认同)
  • 请注意,此功能仅适用于 gitlab 11.4 及以上版本,对于遇到此功能的人来说,值得一提 (2认同)

Rav*_*jha 8

有些人会发现有用的常见用例。提出合并请求时运行作业。具体来说,对目标分支上更改的所有文件运行 lint。

正如答案之一所建议的,我们可以通过CI_MERGE_REQUEST_TARGET_BRANCH_NAME变量(预定义变量列表)获取目标分支名称。我们可以用来git diff --name-only origin/$CI_MERGE_REQUEST_TARGET_BRANCH_NAME获取已更改的文件列表。然后通过 将它们传递给 linter xargs。示例配置可能如下所示。

code_quality:
  only:
    - merge_requests
  script:
    - git diff --name-only origin/$CI_MERGE_REQUEST_TARGET_BRANCH_NAME | xargs <LINT_COMMAND_FOR_FILE>
Run Code Online (Sandbox Code Playgroud)

  • 似乎返回一个错误,指出:“致命:不明确的参数‘origin/master’:未知修订版或路径不在工作树中。”知道如何解决这个问题吗?显然,跑步者不认识那条分支路径是什么。当我在本地运行它时工作正常 (2认同)
  • 在我的本地,一切正常,命令是: `git diff --name-only origin/$CI_MERGE_REQUEST_TARGET_BRANCH_NAME` (但显然我用字符串 `master` 替换了 gitlab CI 的东西)给出了文件列表。当我在 gitlab 的管道上运行它时,它只是按照我上面写的那样说。因此,在 CI 内部,术语 `origin/master` 无法识别,就好像 CI 不知道它有哪些分支,也不知道 `origin/master` 是什么意思 (2认同)
  • “致命:不明确的参数‘origin/master’:未知修订版或路径不在工作树中。”的原因也可能是您使用 git 浅克隆。这是自 Gitlab 12 以来的默认设置。使用 `variables: GIT_DEPTH: 0` 来修复它。请参阅 https://docs.gitlab.com/ee/ci/pipelines/settings.html#git-shallow-clone 了解更多信息。 (2认同)