2015-04-08 7 views
7

Ich versuche Code Coverage-Berichte mit Cobertura-Plugin zu generieren.Cobertura gibt Argumentliste zu lang

Ich habe diese Abhängigkeit in meinem pom.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> 

Wenn ich mein Projekt mit diesem Ziel bauen -U -B saubere Installation cobertura: cobertura, erhalte ich die folgenden Fehler auf meinem 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 

Der Build ist erfolgreich auf meinem Windows-Rechner aber nicht auf jenkins. Wenn ich die Cobertura-Version auf 2.5.1 herabsetze, verschwindet dieser Fehler, aber ich erhalte einige parse-Ausnahmen, da der Parser für cobertura für 2.5.1 mit Java-Syntax nicht auf dem neuesten Stand ist.

Kann mir jemand helfen, diese Funktion erhalten für 2.6.0 Versionen und höher für cobertura

+0

befestigen pls einen Screenshot mit den Einstellungen? – stanjer

+0

Welche Einstellungen benötigen Sie? Ich habe die Cobertura Plugin Einstellungen in die Fragen eingefügt. In lokalen (Windows-Maschine) mit diesen Einstellungen erzeugt es Coverage.xml-Datei, aber in Jenkins schlägt es fehl – user2973475

+0

Bitte lesen Sie meine Antwort und geben Sie uns die Debug-Traces, damit ich Ihnen helfen kann – jfcorugedo

Antwort

1

Alle Shell eine Grenze für die Länge Befehlszeile haben. UNIX/Linux/BSD System hat eine Begrenzung für wie viele Bytes für das Befehlszeilenargument und die Umgebungsvariablen verwendet werden können.

Wenn Sie einen neuen Vorgang starten oder einen Befehl eingeben diese Einschränkungen angewendet werden und Sie erhalten eine Fehlermeldung angezeigt, wie auf dem Bildschirm folgt:

Argument list too long

Cobertura versucht, einen Shell-Befehl auszuführen:

getLog().debug("Working Directory: " + cl.getWorkingDirectory()); 
getLog().debug("Executing command line:"); 
getLog().debug(cl.toString()); 

int exitCode; 
try 
{ 
    exitCode = CommandLineUtils.executeCommandLine(cl, stdout, stderr); 
} 
catch (CommandLineException e) 
{ 
    throw new MojoExecutionException("Unable to execute Cobertura.", e); 
} 

In der Tat ist das Plugin versucht, ein Java-Prozess auszuführen cobertura auszuführen:

Commandline cl = new Commandline(); 
File java = new File(SystemUtils.getJavaHome(), "bin/java"); 
cl.setExecutable(java.getAbsolutePath()); 
cl.addEnvironment("CLASSPATH", createClasspath()); 

String log4jConfig = getLog4jConfigFile(); 
if (log4jConfig != null) 
{ 
    cl.createArg().setValue("-Dlog4j.configuration=" + log4jConfig); 
} 

cl.createArg().setValue("-Xmx" + maxmem); 

cl.createArg().setValue(taskClass); 

if (cmdLineArgs.useCommandsFile()) 
{ 
    String commandsFile; 
    try 
    { 
      commandsFile = cmdLineArgs.getCommandsFile(); 
    } 
    catch (IOException e) 
    { 
      throw new MojoExecutionException("Unable to obtain CommandsFile location.", e); 
    } 
    if (FileUtils.fileExists(commandsFile)) 
    { 
      cl.createArg().setValue("--commandsfile"); 
      cl.createArg().setValue(commandsFile); 
     } 
     else 
     { 
      throw new MojoExecutionException("CommandsFile doesn't exist: " + commandsFile); 
     } 
} 
else 
{ 
     Iterator<String> it = cmdLineArgs.iterator(); 
     while (it.hasNext()) 
     { 
      cl.createArg().setValue(it.next()); 
     } 
} 

Aktivieren Sie also zunächst coberta- DEBUG-Traces, um den ausgeführten Shell-Befehl anzuzeigen.

Ich denke, das Problem wäre der Klassenpfad in der Version 2.6 im Vergleich zu dem in Version 2.5.1 verwendet.

Bitte, Debug Traces aktivieren und poste das Ergebnis:

https://wiki.jenkins-ci.org/display/JENKINS/Logging

2

Diese Grenzen auf den Linien von Relevanz, sondern kann Hilfe anbieten

Dies wird durch eine Linux-Beschränkung verursacht wird, wobei die Argumente‘ t überschreiten 128kb groß Siehe Linux Kernel konstante: MAX_ARG_STRLEN https://github.com/torvalds/linux/blob/master/include/uapi/linux/binfmts.h

Innerhalb Jenkins, wenn Sie aus lesen/zu einer Variablen, bei der dieser Wert überschritten wird, treffen Sie diesen Fehler. In meinem Fall hatte ich einen GitHub-Webhook, der einen Jenkins-Job startete und einen Payload-Parameter auf eine Zeichenkette> als diese Grenze setzte. Der Versuch, diesen Parameter zu lesen, würde diesen Fehler auslösen.

Um das Problem zu umgehen, habe ich ein Kind Job, der einen Rest-API-Aufruf verwendet den Wert von den Eltern zu lesen

Sie die übergeordnete Job einen Fehler werfen lassen kann, aber lassen das Kind Job in allen Fällen gestartet werden. Unten finden Sie eine leicht verfeinert Funktion ich verwendet, um die Informationen zu ziehen (gezupft Fehlerprüfung und Kommentare der Kürze halber)

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)