[英]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 的.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.