Jenkins
jenkins中的bulk size text參數報錯
我在 Jenkins 中有一個帶有文本參數的建構,當我將大數據輸入文本區域並嘗試建構時,它來了
[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:錯誤=7,參數列表太長 在 java.lang.ProcessBuilder.start(未知來源) 在 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: error=7, Argument list too long 在 java.lang.UNIXProcess.(未知來源) 在 java.lang.ProcessImpl.start(未知來源) ... 17 更多 建構步驟“執行 shell”將建構標記為失敗 完成:失敗
有什麼解決方法嗎?謝謝!
我的環境:
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 中,一旦您讀取/讀取超出此值的變數,您將遇到此錯誤。就我而言,我有一個 github webhook,它啟動了 Jenkins 作業並將有效負載參數設置為某個字元串 > 超過此限制。嘗試讀取此參數將引發此錯誤。
為了解決這個問題,我有一個使用 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)