jenkins中的批量大小文本参数报告错误

我在Jenkins有一个带有文本参数的构build,当我将大数据input到文本区域并尝试构build时,就出现了

 [TEST-save_txt_to_file] $ / bin / sh -xe /tmp/hudson3834163952953567847.sh
致命:命令执行失败
 java.io.IOException:无法运行程序“/ bin / sh”(目录“/ var / lib / jenkins / workspace / TEST-save_txt_to_file”):java.io.IOException:error = 7,参数列表太长
    在java.lang.ProcessBuilder.start(Unknown Source)
    在hudson.Proc $ LocalProc。(Proc.java:244)
    在hudson.Proc $ LocalProc。(Proc.java:216)
    在hudson.Launcher $ LocalLauncher.launch(Launcher.java:763)
    在hudson.Launcher $ ProcStarter.start(Launcher.java:353)
    在hudson.Launcher $ ProcStarter.join(Launcher.java:360)
    在hudson.tasks.CommandInterpreter.perform(CommandInterpreter.java:91)
    在hudson.tasks.CommandInterpreter.perform(CommandInterpreter.java:60)
    在hudson.tasks.BuildStepMonitor $ 1.perform(BuildStepMonitor.java:19)
    在hudson.model.AbstractBuild $ AbstractBuildExecution.perform(AbstractBuild.java:814)
    在hudson.model.Build $ BuildExecution.build(Build.java:199)
    在hudson.model.Build $ BuildExecution.doRun(Build.java:160)
    在hudson.model.AbstractBuild $ AbstractBuildExecution.run(AbstractBuild.java:593)
    在hudson.model.Run.execute(Run.java:1568)
    在hudson.model.FreeStyleBuild.run(FreeStyleBuild.java:46)
    在hudson.model.ResourceController.execute(ResourceController.java:88)
    在hudson.model.Executor.run(Executor.java:237)
导致:java.io.IOException:java.io.IOException:错误= 7,参数列表太长
    在java.lang.UNIXProcess。(Unknown Source)
    在java.lang.ProcessImpl.start(未知来源)
     ... 17更多
构build步骤'Execute shell'标记为失败
完成:失败

有没有解决办法? 谢谢!

我的ENV:

java.runtime.version 1.6.0_41-b02 org.jenkins-ci.main:jenkins-war:1.502

这是由于Linux的限制,参数的大小不能超过128kb请参见Linux内核常量:MAX_ARG_STRLEN https://github.com/torvalds/linux/blob/master/include/uapi/linux/binfmts.h

在Jenkins中,一旦你读取/写入超过这个值的variables,你将会遇到这个错误。 在我的情况下,我有一个github webhook启动了一个Jenkins作业,并将一个有效负载参数设置为大于此限制的string>。 试图读取这个参数会抛出这个错误。

为了解决这个问题,我有一个使用rest-api调用来从父级读取值的子作业

您可以让父作业失败,但允许在任何情况下启动子作业。 下面是我用来提取信息的一个稍微精致的函数(为简洁起见,删除了错误检查和注释)

def get_parameter_value_from_parent(): host = 'https://[YOUR_COMPANY].ci.cloudbees.com' this_build_url = os.environ.get('BUILD_URL') request_auth = (JENKINS_USER, JENKINS_TOKEN) url = '{0}/api/json'.format(this_build_url) parameter_name = 'payload' payload = '' # # Get the upstreamBuild number, and the upstreamUrl # so we can put together a link to the upstream job # response = requests.get(url, auth=request_auth) this_build = json.loads(response) build_number = '' short_url = '' actions = this_build['actions'] for action in actions: if action.get('causes'): for cause in action.get('causes'): build_number = cause['upstreamBuild'] short_url = cause['upstreamUrl'] parent_url = '{host}/{short_url}{build}/api/json'.format(host=host, short_url=short_url, build=build_number) # # Now get the payload from the parent job by making REST api call # response = requests.get(parent_url, auth=request_auth) upstream_build = json.loads(response) actions = upstream_build['actions'] for action in actions: if action.get('parameters'): for parameter in action.get('parameters'): if parameter['name'] == parameter_name: value = parameter['value'] payload = value return payload print 'Error: Unable to return payload from parent jenkins job: {0}'.format(parent_url) sys.exit(1) 

我可以通过首先将参数值回显到一个文件来达到我的目的,例如:

 echo "${BIG_TEXT_PARAM}" > ${WORKSPACE}/BIG_TEXT_PARAM.txt cat ${WORKSPACE}/BIG_TEXT_PARAM.txt 

请注意在'echo'命令中使用双引号。