2015-04-08 10 views
7

Sto provando a generare report di copertura del codice usando il plugin di cobertura.Cobertura fornisce una lista di argomenti troppo lunga

ho questa dipendenza nel mio 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> 

quando costruire il mio progetto utilizzando questo obiettivo -U -B installazione pulita cobertura: Cobertura, ottengo l'errore qui sotto sul mio 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 

La build è successo sulla mia macchina Windows, ma non riesce a Jenkins. Quando eseguo il downgrade della versione di cobertura alla 2.5.1 questo errore va via ma ottengo alcune eccezioni di analisi poiché il parser per cobertura per 2.5.1 non è aggiornato con la sintassi java.

Qualcuno può aiutarlo ad ottenere questo lavoro per le versioni 2.6.0 e superiore per cobertura

+0

allegare pls uno screenshot con le impostazioni? – stanjer

+0

Quali impostazioni sono necessarie. Ho incollato le impostazioni del plugin di cobertura nelle domande. In locale (Windows Machine) con queste impostazioni genera il file coverage.xml ma in jenkins fallisce – user2973475

+0

Per favore, leggi la mia risposta e dacci le tracce di debug in modo da poterti aiutare – jfcorugedo

risposta

1

Tutto guscio avere un limite per la lunghezza della linea di comando. Il sistema UNIX/Linux/BSD ha un limite sul numero di byte che possono essere utilizzati per l'argomento della riga di comando e le variabili di ambiente.

Quando si avvia un nuovo processo o digita un comando vengono applicate queste limitazioni e verrà visualizzato un messaggio di errore come segue sullo schermo:

Argument list too long

Cobertura sta cercando di eseguire un comando di shell:

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); 
} 

infatti, il plugin sta cercando di eseguire un processo Java per eseguire cobertura:

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()); 
     } 
} 

Quindi, prima di tutto, abilitare le tracce DEBUG di cobertura per mostrare il comando della shell eseguito.

Penso che il problema sarebbe il classpath utilizzato nella versione 2.6 rispetto a quello utilizzato nella versione 2.5.1.

Si prega di attivare tracce di debug e inserisci il risultato:

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

2

Questa confina con le linee di rilevanza, ma può offrire assistenza

Questo è causato da una limitazione di Linux in cui gli argomenti can' t superare 128KB dimensioni See Linux kernel costante: MAX_ARG_STRLEN https://github.com/torvalds/linux/blob/master/include/uapi/linux/binfmts.h

All'interno Jenkins una volta letto da/a una variabile in cui viene superato questo valore, verrà visualizzato questo errore. Nel mio caso, ho avuto un github webhook che ha lanciato un lavoro Jenkins e impostato un parametro payload su una stringa> oltre questo limite. Il tentativo di leggere questo parametro genera questo errore.

Per aggirare il problema, ho un lavoro figlio che utilizza una chiamata di riposo-API per leggere il valore dal genitore

È possibile lasciare che il processo principale gettare un fallimento, ma permettono il lavoro bambino essere lanciato in tutti i casi. Qui di seguito è una funzione un po 'raffinato che ho usato per tirare le informazioni (Stripped fuori controllo degli errori e commenti per brevità)

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) 
Problemi correlati