Jenkins

jenkins中的bulk size text參數報錯

  • June 8, 2015

我在 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)

引用自:https://serverfault.com/questions/533709