我正在构建一个通过Jenkins运行Mocha + WebDriverIO的小型测试框架。由于某种原因,相对路径没有按预期显示。结果,fs.js抛出错误:
错误:
错误:ENOENT,没有这样的文件或目录' C:\ workspaces \ nodejstest \ jenkins \ JENKINS_HOME \ jobs \ browse_test \ workspace \ login.js'
路径应该是:' C:\ workspaces \ nodejstest \ login.js' (执行脚本的绝对位置)。任何人,即使我从同一目录执行脚本,也不知道Jenkins工作区目录作为错误状态,对目标路径错误的原因有任何了解。当我从cli运行它时,它工作正常。怪异。
测试脚本(run_test.js):
var common = require('./common/common.js'), // INCLUDES FS LIBRARY
scriptList = ['login', 'browse_price_ascending'];
// ITERATE THROUGH SCRIPT NAMES AND EXECUTE
for(var currentScript in scriptList){
// BUILD SCRIPT PATH
var scriptPath = './' + scriptList[currentScript] + '.js';
// EVAL IS NOT ALWAYS EVIL ;)
eval(common.fs.readFile(scriptPath) + '');
}
启动Jenkins(run.sh):
#!/bin/bash
export JENKINS_HOME=./jenkins/JENKINS_HOME
java -jar ./jenkins/jenkins.war
Jenkins工作:
mocha $JENKINS_HOME/../../run_test.js --brand=IBSD --country=UK --env=PROD
答案 0 :(得分:1)
在Jenkins中,作业的工作空间被视为当前目录。无论您是通过指定相对路径wrt Jenkins来调用父($JENKINS_HOME/../../run_test.js
)脚本,在脚本中指定的任何路径都将被视为相对于Jenkins& #39;工作的工作空间。因此,要解决您的问题,只需在run_test.js脚本中指定 login.js 的相对路径。
如果您不想将 login.js 脚本从现有位置移动到Jenkins工作区,则必须指定文件的相对路径w.r.t Jenkins'工作的工作空间。但是,如果你想让它足够灵活,可以通过命令行和Jenkins两种方式工作,那么你可以尝试以下任何一种方法:
在父脚本中,您可以检查是否设置了任何Jenkins环境变量(例如JOB_NAME
)。目的是检查您的脚本是否作为某些Jenkins作业的一部分运行。如果是,则将父脚本中 login.js 的路径更改为相对路径w.r.t job的工作区。
path_to_login.js = default_location
if (jenkins_env_variable is set) {
path_to_login.js = ../../../../../../login.js
}
就像您传递给父脚本的其他参数(--brand=IBSD --country=UK --env=PROD
)一样,您可以传递一个(例如--jenkins = yes)来检查脚本是通过Jenkins运行还是命令线。
path_to_login.js = default_location
if (jenkins_arg_passed is yes) {
path_to_login.js=../../../../../../login.js
}