我在运行管道的git项目的根目录下有一个Jenkinsfile。我还用不同的Groovy文件(smp.gvy)编写了一些函数,我需要将这些参数传递给构建参数并在shell脚本的函数内部访问它们。我正在将我的整个mvn行作为一个arg传递给该函数,但似乎它为空。
在Jenkinsfile中,我有
properties([
parameters([
string(name: 'sshusername', defaultValue: 'testuser'),
string(name: 'sshpassword', defaultValue: 'p@ssw0rd!'),
string(name: 'featuretags', defaultValue: '@Regression')
])
])
stage("Regression and Progression Test on ${bddEnv}") {
commonToolsInfra.notifyBuildMap(
message:'SMP CD pipeline: functional tests started. ',
buildStatus:'IN-PROGRESS',
slackChannel:slackChannel, sandboxMode:SANDBOX_MODE)
node("${FUNCTIONAL_TEST_AGENT}") {
unstash 'tnd-smp'+"${BUILD_TAG}"
unstash 'TND-INFRA'+"${BUILD_TAG}"
dir ('tnd-functional-tests'){
unstash 'TND-FUNCTIONAL-TESTS'+"${BUILD_TAG}"
}
if("${SKIP_FUNCTIONAL}" == 'false')
smpTools.runSMPFunctionalTests("-Dbrowser=chrome \
-Dweb-driver=chromedriverlinux.bin \
-Dssh.username=${sshusername} \
-Dssh.password=${sshpassword} \
-Denv=${bddEnv} \
-Dcucumber.options='--tags ${featuretags}'", "Test Report")
}// this function is in smp.gvy see below
}
}
在smp.gvy中
def runSMPFunctionalTests (String arguments = "-Denv=Dev1", String reportLabel) {
dir ('tnd-functional-tests') {
withMaven(jdk: 'Java 8') {
try {
sh '''
if [ ! "$(docker ps -q -f name=tnd-chrome)" ]; then
if [ "$(docker ps -aq -f status=exited -f name=tnd-chrome)" ]; then
# cleanup
echo "Removing exited docker container..."
docker rm tnd-chrome
fi
echo "Running the docker container again..."
docker run -d -e JAVA_OPTS=-Xms512m -e JAVA_OPTS=-Xmx1024m \
-v /dev/shm:/dev/shm -e DBUS_SESSION_BUS_ADDRESS=/dev/null \
--name tnd-chrome csa-docker.apro.nbnco.net.au/tnd/tnd-chrome:v1
DO_SSH_TUNNEL="true"
else
echo "Running docker instance tnd-chrome found...Using it"
fi
sudo chmod a+rwx ./src/test/resources/webdriver/*
echo "Args for maven ${arguments}" //this prints null for arguments
mvn clean verify ${arguments}
'''
} catch(err) {
if (currentBuild.result == 'UNSTABLE')
currentBuild.result = 'FAILURE'
throw err
} finally {
publishHTML (target: [
allowMissing: true,
alwaysLinkToLastBuild: false,
keepAll: true,
reportDir: 'target/site/serenity',
reportFiles: 'index.html',
reportName: "${reportLabel} BUILD ${env.BUILD_NUMBER}"
])
}
}
}
这里有两个问题,如果我回显从我的jenkinsfile传递到第二个Groovy文件的参数,我将得到null。另外我在密码中有一个@字符,因此在使用它调用git clone之前有必要对其进行转义或替换。
谢谢...
答案 0 :(得分:1)
将'''
替换为"""
,以使Groovy进行字符串替换。
sh """
if [ ! "\$(docker ps -q -f name=tnd-chrome)" ]; then
if [ "\$(docker ps -aq -f status=exited -f name=tnd-chrome)" ]; then
# cleanup
echo "Removing exited docker container..."
docker rm tnd-chrome
fi
echo "Running the docker container again..."
docker run -d -e JAVA_OPTS=-Xms512m -e JAVA_OPTS=-Xmx1024m \
-v /dev/shm:/dev/shm -e DBUS_SESSION_BUS_ADDRESS=/dev/null \
--name tnd-chrome csa-docker.apro.nbnco.net.au/tnd/tnd-chrome:v1
DO_SSH_TUNNEL="true"
else
echo "Running docker instance tnd-chrome found...Using it"
fi
sudo chmod a+rwx ./src/test/resources/webdriver/*
echo "Args for maven ${arguments}" //this prints null for arguments
mvn clean verify ${arguments}
"""
然后以前缀$
前缀"$(docker ps -q -f name=tnd-chrome)"
和"$(docker ps -aq -f status=exited -f name=tnd-chrome)"
的{{1}}
\
更多细节可以阅读Groovy String
如果您不能100%确保更改正确,则可以使用此Groovy在线工具:https://groovy-playground.appspot.com/来验证更改是否符合预期。
右侧的字符串是字符串替换后的字符串,并将移交给"\$(docker ps -q -f name=tnd-chrome)"
"\$(docker ps -aq -f status=exited -f name=tnd-chrome)"
步骤函数来执行。