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

冉娃娃
  • 1.2k

业务背景

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

参考文档

回复
阅读 451
2 个回答
✓ 已被采纳

为啥要搞这么复杂,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)

解决方案

  • 在给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
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
你知道吗?

宣传栏