[已解决]如何在gitlib-ci.yml中把本次提交改变的文件赋值给一个变量(20210928)

发布于 2022-09-30 23:11:03 字数 1223 浏览 22 评论 0

业务背景

prettier在ci的过程中做增量检测.需要以下几个步骤

  1. 声明一个gitlab变量xxx
  2. 执行git命令拿到当前改变的文件名
  3. 将git命令的结果赋值给$xxx
  4. 运行yarn prettier --check $xxx

尝试了好几种方式,都无法赋值成功.

示例代码

image: node:latest

stages:
  - test

test:
  stage: test
  tags:
    - global-ci
  variables:
    COMMIT_FILES: git diff-tree --no-commit-id --name-only -r $CI_COMMIT_SHA
  script:
    - echo $COMMIT_FILES
    # -> git diff-tree --no-commit-id --name-only -r 02e80f41c21ab51d26b98988fbdb9fffae2f69bf
    - $COMMIT_FILES = $(git diff-tree --no-commit-id --name-only -r $CI_COMMIT_SHA)
    - echo $COMMIT_FILES
    # fatal: ambiguous argument '=': unknown revision or path not in the working tree.
    - yarn prettier --check git diff-tree --no-commit-id --name-only -r $CI_COMMIT_SHA

参考文档

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

未蓝澄海的烟 2022-10-07 23:11:03

为啥要搞这么复杂,gitlab-ci本来就会把前一次sha1和本次sha1分别以环境变量形式注入进来,根本不需要自己去判断这么复杂。参考我以前写的commitlint判断部分:

commitlint:
  stage: lint
  image: node:lts
  script: |
    npm install -g @commitlint/cli @commitlint/config-conventional
    if git rev-list --quiet "${CI_COMMIT_BEFORE_SHA}..HEAD"; then
      echo "commitlint from ${CI_COMMIT_BEFORE_SHA}"
      npx commitlint -x @commitlint/config-conventional -f "${CI_COMMIT_BEFORE_SHA}"
    else
      echo "commitlint from HEAD^"
      npx commitlint -x @commitlint/config-conventional -f HEAD^
    fi
  dependencies: []
  tags:
    - docker

特别注意CI_COMMIT_BEFORE_SHA这个变量需要特殊判断,因为可能会因为你是初次提交(会被赋值成0000000000000000),或者用push -f回退过(此时由于强行回退,导致你的CI_COMMIT_BEFORE_SHA已经不存在了),导致这个变量可能不符合你的期望。具体你可以参考我的脚本部分使用git rev-list --quiet "${CI_COMMIT_BEFORE_SHA}..HEAD"确保这个变量确实可用的。

最后就是根据你的需求,列出哪些文件发生了改变:

... --check $(git diff --name-only ${CI_COMMIT_BEFORE_SHA} HEAD)
中性美 2022-10-07 23:11:03

解决方案

  • 在给gitlab变量赋值的时候,前面不要加$符号
  • 请参照一楼的答案,更加详细和全面

    image: node:latest
    
    variables:
    COMMIT_FILES: git diff-tree --no-commit-id --name-only -r $CI_COMMIT_SHA
    
    test:
    stage: test
    tags:
      - global-ci
    script:
      - COMMIT_FILES=$(git diff-tree --no-commit-id --name-only -r $CI_COMMIT_SHA)
      - yarn prettier --check $COMMIT_FILES
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文