JUnit – the parameter list given by cobertura is too long

I'm trying to generate code coverage reports using the cobertura plugin

I'm in POM This dependency exists in XML

<plugin>
     <groupId>org.codehaus.mojo</groupId>
     <artifactId>cobertura-maven-plugin</artifactId>
     <version>2.6</version>
     <executions>
         <execution>
             <phase>test</phase>
             <goals>
              <goal>cobertura</goal>
             </goals>
             <configuration>
                 <formats>
                     <format>html</format>
                     <format>xml</format>
                  </formats>
             </configuration>
         </execution>
     </executions>
  <configuration>
      <formats>
          <format>html</format>
          <format>xml</format>
    </formats>
</configuration>

When I used this goal to build my project - U - B clean up and install cobertura: cobertura, I got the following error on my Jenkins CI

16:37:31 [ERROR] Failed to execute goal org.codehaus.mojo:cobertura-maven-plugin:2.6:instrument (default-cli) on project TestModule: Unable to execute Cobertura. Error while executing process. Cannot run program "/bin/sh": error=7,Argument list too long -> [Help 1]
16:37:31 org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.codehaus.mojo:cobertura-maven-plugin:2.6:instrument (default-cli) on project TestModule: Unable to execute Cobertura.
16:37:31    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:216)
16:37:31    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153)
16:37:31    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145)
16:37:31    at org.apache.maven.lifecycle.internal.MojoExecutor.executeForkedExecutions(MojoExecutor.java:364)
16:37:31    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:198)
16:37:31    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153)
16:37:31    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145)
16:37:31    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:84)
16:37:31    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:59)
16:37:31    at org.apache.maven.lifecycle.internal.LifecycleStarter.singleThreadedBuild(LifecycleStarter.java:183)
16:37:31    at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:161)
16:37:31    at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:317)
16:37:31    at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:152)
16:37:31    at org.apache.maven.cli.MavenCli.execute(MavenCli.java:555)
16:37:31    at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:214)
16:37:31    at org.apache.maven.cli.MavenCli.main(MavenCli.java:158)
16:37:31    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
16:37:31    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:76)
16:37:31    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
16:37:31    at java.lang.reflect.Method.invoke(Method.java:602)
16:37:31    at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:289)
16:37:31    at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:229)
16:37:31    at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:415)
16:37:31    at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:356)
16:37:31 Caused by: org.apache.maven.plugin.MojoExecutionException: Unable to execute Cobertura.
16:37:31    at org.codehaus.mojo.cobertura.tasks.AbstractTask.executeJava(AbstractTask.java:244)
16:37:31    at org.codehaus.mojo.cobertura.tasks.InstrumentTask.execute(InstrumentTask.java:139)
16:37:31    at org.codehaus.mojo.cobertura.CoberturaInstrumentMojo.execute(CoberturaInstrumentMojo.java:162)
16:37:31    at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:106)
16:37:31    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:208)
16:37:31    ... 23 more
16:37:31 Caused by: org.codehaus.plexus.util.cli.CommandLineException: Error while executing process.
16:37:31    at org.codehaus.plexus.util.cli.Commandline.execute(Commandline.java:656)
16:37:31    at org.codehaus.plexus.util.cli.CommandLineUtils.executeCommandLine(CommandLineUtils.java:144)
16:37:31    at org.codehaus.plexus.util.cli.CommandLineUtils.executeCommandLine(CommandLineUtils.java:107)
16:37:31    at org.codehaus.mojo.cobertura.tasks.AbstractTask.executeJava(AbstractTask.java:240)
16:37:31    ... 27 more
16:37:31 Caused by: java.io.IOException: Cannot run program "/bin/sh": error=7,Argument list too long
16:37:31    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1042)
16:37:31    at java.lang.Runtime.exec(Runtime.java:615)
16:37:31    at java.lang.Runtime.exec(Runtime.java:526)
16:37:31    at org.codehaus.plexus.util.cli.Commandline.execute(Commandline.java:636)
16:37:31    ... 30 more
16:37:31 Caused by: java.io.IOException: error=7,Argument list too long
16:37:31    at java.lang.UNIXProcess.<init>(UNIXProcess.java:139)
16:37:31    at java.lang.ProcessImpl.start(ProcessImpl.java:152)
16:37:31    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1023)
16:37:31    ... 33 more

The build succeeded on my windows machine, but failed on Jenkins When I downgraded the cobertura version to 2.5 1, but I got some parsing exceptions because cobertura for 2.5 1's parser and Java syntax are not up to date

Someone can help me make this applicable to 2.6 Cobertura version 0 and later

Solution

This borders on the relevant direction, but may help

This is caused by the limitation of Linux, where the size of the parameter cannot exceed 128KB. Please refer to the Linux kernel constant: max_ ARG_ STRLEN https://github.com/torvalds/linux/blob/master/include/uapi/linux/binfmts.h

In Jenkins, once you read / exceed a variable beyond this value, you will encounter this error In my example, I have a GitHub webhook that starts the Jenkins job and sets the payload parameter to a string > exceeding this limit Attempting to read this parameter raises this error

To solve this problem, I have a child job that uses rest API calls to read the parent value

You can fail the parent job, but you can start the child job in all cases Here is a slightly improved function I use to extract information (error checking and comments are removed for simplicity)

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)
The content of this article comes from the network collection of netizens. It is used as a learning reference. The copyright belongs to the original author.
THE END
分享
二维码
< <上一篇
下一篇>>