簡體   English   中英

在 GitLab 中運行 PMD CI 腳本不起作用,除非在腳本運行后添加 echo 命令

[英]Running PMD in GitLab CI Script doesn't work unless echo command is added after the script runs

這是一個有趣的問題。 我有一個 GitLab 項目,我創建了一個.gitlab-ci.yml來運行PMD ,它會在每次提交后掃描我的代碼。 ci.yml 文件如下所示:

image: "node:latest"

stages:
  - preliminary-testing

apex-code-scan:
  stage: preliminary-testing
  allow_failure: false
  script:
    - install_java
    - install_pmd
  artifacts:
    paths:
      - pmd-reports/

####################################################
# Helper Methods
####################################################

.sfdx_helpers: &sfdx_helpers |

  function install_java() {
    local JAVA_VERSION=11
    local JAVA_INSTALLATION=openjdk-$JAVA_VERSION-jdk
    echo "Installing ${JAVA_INSTALLATION}"
    apt update && apt -y install $JAVA_INSTALLATION
  }

  function install_pmd() {
    local PMD_VERSION=6.52.0
    local RULESET_PATH=ruleset.xml
    local OUTPUT_DIRECTORY=pmd-reports
    local SOURCE_DIRECTORY=force-app
    local URL=https://github.com/pmd/pmd/releases/download/pmd_releases%2F$PMD_VERSION/pmd-bin-$PMD_VERSION.zip
    
    # Here I would download and unzip the PMD source code. But for now I have the PMD source already in my project for testing purposes

    # apt update && apt -y install unzip
    # wget $URL
    # unzip -o pmd-bin-$PMD_VERSION.zip
    # rm pmd-bin-$PMD_VERSION.zip
    echo "Installed PMD!"

    mkdir -p $OUTPUT_DIRECTORY
    echo "Going to run PMD!"
    ls
    echo "Start"
    pmd-bin-$PMD_VERSION/bin/run.sh pmd -d $SOURCE_DIRECTORY -R $RULESET_PATH -f xslt -P xsltFilename=pmd_report.xsl -r $OUTPUT_DIRECTORY/pmd-apex.html
    echo "Done"
    rm -r pmd-bin-$PMD_VERSION
    echo "Remove pmd"
  }

before_script:
  - *sfdx_helpers

當我嘗試運行此管道時,它會在啟動 PMD 后失敗: 在此處輸入圖像描述

但是,如果我對 PMD 的.sh文件做一個小改動並在最后添加一個echo命令。 然后管道成功:

PMD /bin/run.sh之前(不起作用):

...
java ${HEAPSIZE} ${PMD_JAVA_OPTS} $(jre_specific_vm_options) -cp "${classpath}" "${CLASSNAME}" "$@"

PMD /bin/run.sh之后(有效):

...
java ${HEAPSIZE} ${PMD_JAVA_OPTS} $(jre_specific_vm_options) -cp "${classpath}" "${CLASSNAME}" "$@"
echo "Done1" // This is the last line in the file

在此處輸入圖像描述

我完全不知道為什么會這樣。 有誰知道為什么在 .sh 文件末尾添加此 echo 命令會導致管道成功? 我可以使用 echo 命令保持原樣,但我想了解它為什么會這樣。 我不想成為那個只留下評論說Hey don't touch this line of code, I don't know why, but without it the whole thing fails 謝謝!

PMD 以特定的退出代碼退出,具體取決於它是否發現了一些違規行為,請參閱https://pmd.github.io/latest/pmd_userdocs_cli_reference.html#exit-status

我想,您的 PMD 運行發現了一些違規行為,並且 PMD 以退出代碼 4 退出——這不是成功退出代碼。

通常,這用於使 CI 構建失敗,以防出現任何 PMD 違規 - 在獲得綠色構建之前強制修復違規。

如果這不是您想要的,例如您只想報告違規但不想使構建失敗,那么您需要添加以下命令行選項:

--fail-on-violation false

然后 PMD 將以退出代碼 0 退出,即使存在違規也是如此。

因此,PMD 出於某種原因運行的java命令似乎返回了非零退出代碼(即使腳本成功)。 因為我在那個 bash 腳本的末尾添加了一個echo命令,腳本的最后一行返回了一個success的退出代碼,這就是為什么當echo命令在那里時 GitLab CI 管道成功的原因。

為了解決java PMD 命令返回的非零退出代碼,我更改了.gitlab-ci.yml文件中的這一行以捕獲非零退出代碼並繼續。

function install_pmd() {
// ... For brevity I'm just including the line that was changed in this method
pmd-bin-$PMD_VERSION/bin/run.sh pmd -d $SOURCE_DIRECTORY -R $RULESET_PATH -f xslt -P xsltFilename=pmd_report.xsl -r $OUTPUT_DIRECTORY/pmd-apex.html || echo "PMD Returned Exit Code"
// ...
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM