0

我正在构建一个通过 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

詹金斯工作:

mocha $JENKINS_HOME/../../run_test.js --brand=IBSD --country=UK --env=PROD
4

1 回答 1

1

在 Jenkins 中,作业的工作区被视为当前目录。无论您是否通过在 Jenkins 中指定相对路径来调用( ) 脚本,脚本中指定任何路径都将被视为相对于 Jenkins 作业的工作空间。因此,要解决您的问题,只需在 run_test.js 脚本中指定login.js的相对路径即可。$JENKINS_HOME/../../run_test.js

如果您不想将login.js脚本从现有位置移动到 Jenkins 工作区,那么您必须指定文件 wrt Jenkins 作业工作区的相对路径。但是,如果您想让它足够灵活以通过命令行和 Jenkins 两种方式工作,那么您可以尝试以下任何一种方法:

  • 在您的父脚本中,您可以检查是否设置了任何 Jenkins 环境变量(例如JOB_NAME)。目的是检查您的脚本是否作为某些 Jenkins 作业的一部分运行。如果是,则将父脚本中login.js的路径更改为相对路径 wrt 作业的工作区。

    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
    }
    
于 2014-09-23T06:51:00.103 回答