如何仅在 Gitlab 中更改的文件上运行 pylint?

qat*_*ulu 5 python pylint gitlab gitlab-ci devops

我试图仅在更改的 python 文件上运行 pylint,但我的构建始终失败。我已经通过 git diff 提取了更改的文件并将它们保存在变量中,但是当我将变量注入 pylint 调用时,它失败了。然而,它对于硬编码的文件名工作得很好。这是我的 yaml:

pylint:
stage: test
  before_script:
    - pip install pylint pylint-exit anybadge
  script:
      - echo CI_COMMIT_SHA=${CI_COMMIT_SHA}
      - echo CI_MERGE_REQUEST_TARGET_BRANCH_NAME=${CI_MERGE_REQUEST_TARGET_BRANCH_NAME}
      - git fetch origin ${CI_MERGE_REQUEST_TARGET_BRANCH_NAME}
      - FILES=$(git diff --name-only ${CI_COMMIT_SHA} origin/${CI_MERGE_REQUEST_TARGET_BRANCH_NAME} | grep '\.py'$)
      - echo "Changed files are $FILES"
      - pylint --output-format=text $(find -type f -name "$FILES" ! -path "**/.venv/**") | tee ./pylint/pylint.log || pylint-exit $?
      - PYLINT_SCORE=$(sed -n 's/^Your code has been rated at \([-0-9.]*\)\/.*/\1/p' ./pylint/pylint.log)
      - anybadge --label=Pylint --file=pylint/pylint.svg --value=$PYLINT_SCORE 2=red 4=orange 8=yellow 10=green
      - echo "Pylint score is $PYLINT_SCORE"
  artifacts:
    paths:
      - ./pylint/
    when: always
  only:
      refs:
          - merge_requests
      changes:
          - "**/*.py"
Run Code Online (Sandbox Code Playgroud)

onu*_*ore 3

虽然 qathulu 答案足够了,但如果没有更改 python 文件,它就不起作用。下面打印所有更改的文件,然后使用 grep 查找更改的 python 文件。

不幸的是 gitlab 上有一个错误,从 grep 分配空输出会结束管道。为了解决这个问题,除非我们确定至少有一个 python 文件发生了更改,否则 grep 不会分配给变量。

- echo CI_COMMIT_SHA=${CI_COMMIT_SHA}
- echo CI_MERGE_REQUEST_TARGET_BRANCH_NAME=${CI_MERGE_REQUEST_TARGET_BRANCH_NAME}
- git fetch origin ${CI_MERGE_REQUEST_TARGET_BRANCH_NAME}
- tmp_files=$(git diff --name-only ${CI_COMMIT_SHA} origin/${CI_MERGE_REQUEST_TARGET_BRANCH_NAME})
- echo "Changed files are $tmp_files"
- if [ -z "$(echo "$tmp_files" | grep "\.py")" ]; then exit 0; else echo "Python files are found"; fi
- tmp_pfiles=$(echo "$tmp_files" | grep "\.py")
- echo "Python files are $tmp_pfiles"
- mkdir ./pylint
- pylint --output-format=text $tmp_pfiles | tee ./pylint/pylint.log || pylint-exit $?
Run Code Online (Sandbox Code Playgroud)