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

5

我正在尝试仅对更改的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"
4个回答

3

虽然 qathulu 的回答足够好,但如果没有更改任何 Python 文件,则其无法正常工作。以下代码将打印出所有更改的文件,然后使用 grep 查找更改的 Python 文件。

不幸的是,gitlab 存在一个错误,当 grep 输出为空时会终止 pipeline。为了解决这个问题,在确保至少有一个 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 $?

将此设置为新答案,谢谢! - qathulu

2

我找到了一种方法。我使用GitLab变量获取合并请求中更改的文件,并将其输入到pylint命令中。

 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"
      - mkdir ./pylint
      - pylint --output-format=text $FILES | tee ./pylint/pylint.log || pylint-exit $?

如果没有更改*.py文件,则会失败。 - onurtore

2

Darker允许这样做。它在2021年2月支持black、isort、mypy、pylint和flake8。

该工具可重新格式化和检查Git存储库中的Python源代码文件。但是,它仅对自上次提交以来Git工作树中已更改的区域应用重新格式化并报告错误。


0

以下是你可以做的事情

.gitlab-ci.yml

stages:
  - Lint

Lint:
  stage: Lint
  allow_failure: true
  script:
  - chmod +x lint.sh
  - ./lint.sh

lint.sh

#! /bin/sh

pip install pycodestyle
current_branch="$CI_BUILD_REF_NAME" 
echo $current_branch
all_changed_files=$(git diff --name-only origin/master origin/$current_branch)
echo "Checking changes!"
for each_file in $all_changed_files
do
# Checks each newly added file change with pycodestyle
pycodestyle $each_file
error_count=$(pycodestyle $each_file --count | wc -l)
if [ $error_count -ge 1 ]; then
    exit 1
fi
if [ $error_count -eq 0 ]; then
    exit 0
fi
done
echo "Completed checking"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接