Posting a question and the answer.

The existing Coverity pluggin does not have any pipeline support.

Background: A Coverity scan involves 3 activities: "processing source code" , 
"analyzing the results", "committing" results to the Coverity Connect server. 
The first if these is often in the context of a wrapper around a 'normal' 
build. The first and second steps are both time consuming - suggesting a 
pipeline.

The following is an outline of how to structure this in the pipeline and then, 
most importantly, how to recover the results in a useful fashion. The Coverity 
Connect server is used to create a 'view' that presents 'issues of interest' 
for this build. The rules for the build & analysis are in 'build' scripts 
following the 'use pipelines for orchestration mantra.'

I am new to both Groovy and Jenkins so any suggestions are welcome - but it 
does work, so I don't need any help with that.



Grab(group='org.codehaus.groovy.modules.http-builder', module='http-builder', 
version='0.6')
import static groovyx.net.http.ContentType.TEXT
import groovyx.net.http.HTTPBuilder
import groovy.json.JsonSlurper
import groovy.json.JsonParserType

class uriHelper implements java.io.Serializable {
    private String ccUrl;
    private String project;
    public uriHelper(String ccUrl, String project) {
        this.ccUrl = ccUrl;
        this.project = project.replaceAll(" ","%20");
    }
    public String GetReqUrl(String view) {
       return 
String.format("http://%s/api/viewContents/issues/v1/%s?projectId=%s&rowCount=-1";,
           ccUrl, view.replaceAll(" ","%20"),  project);
        }
    public String GetCidUrl(Integer cid) {
        return String.format("http://%s/query/defects.htm?project=%s&cid=%d";,
            ccUrl, project, cid);

    }
}

def ShortenPath(String path) {
    // customize...
    path=path.replaceFirst(".*/foobar/","foobar/")
    return path
}

def covProject = "NameOfCoverityProject"
def covView="NameOfCovertyView"
def ccUrl = "Coverity-Connect-URL:8080"

def helper = new uriHelper(ccUrl, covProject)

stage("Stage 1 - Build with cov-build wrapper") {
    //
    // Build activities to create the coverity intermediate directory
    //
    //node("somenode1") { 'invoke build with cov-build wrapper' }
}

stage("Stage 2 - Coverity Analyze & commit") {
    parallel(
        'Coverity' : {
            //
            // Run cov-analyze on the intermediate directory and then cov-commit
            //
            //node("somenode2") { 'invoke cov-analyze/commit' }
            node {
            def s = "admin:password"
            String encoded = s.bytes.encodeBase64().toString()
            def request = helper.GetReqUrl(covView)
            def client = new HTTPBuilder(request)

            def headers = [ Authorization: " Basic " + encoded,
                    Accept: "application/json" ]
            client.setHeaders(headers)

            def json = client.get(contentType: TEXT)
            def slurper = new 
JsonSlurper().setType(JsonParserType.INDEX_OVERLAY)
            def parsed = slurper.parse( json )
            //
            // The JSON output will consist of a single top-level map.
            // Use the outer loop to step into it. Note that we use 'for'
            // loops instead of 'each' since 'each' is broken in Jenkins 
pipeline
            //
            for (values in parsed) {
                def rows = values.getValue().get('rows')
                if (rows.size() > 0) {
                    def summary = manager.createSummary("warning.gif")
                    summary.appendText("<b>Coverity Issues:</b><table>",false)
                    for (row in rows) {
                        def cidUrl = helper.GetCidUrl(row.cid)
                        def path = ShortenPath(row.displayFile)
                        summary.appendText("<tr><td><a><a href=\"${cidUrl}\"> 
${row.cid}</a></td><td>$row.displayType</td><td>$path</td></tr>", false)
                    }
                    summary.appendText("</table>", false)
                }
            }
        }})
}

-- 
You received this message because you are subscribed to the Google Groups 
"Jenkins Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/jenkinsci-users/CY1PR0301MB1996E96BE9F9430FE01E5DF8B8B30%40CY1PR0301MB1996.namprd03.prod.outlook.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to