2016-05-12 15 views
0

Ich habe eine Spring-Boot-App und ich möchte eine Seite haben, die sowohl die aktuelle Build-Nummer, als auch die Liste der darin enthaltenen Änderungen auflistet. Ich benutze Rally, git und Jenkins, aber bevor ich manuell eine HTML- oder db-Tabelle aktualisiere, frage ich mich, ob es nicht eine automatisierte Möglichkeit gibt, diese Informationen abzurufen.Wie kann ich eine Liste mit Änderungen für meine Java Web App abrufen?

Kann jemand seinen Ansatz teilen, diese Informationen auf einer Webseite innerhalb einer App aufzuführen?

Antwort

1

Sie können erfolgreich verfolgen und gescheiterte Jenkins baut von git CA AgileCentral (Rally) Artefakte im Zusammenhang verpflichtet sich durch Git connector und Jenkins plugin solange beide auf dem gleichen Repository, und ein in git commit erwähnt FormattedID verwandter Artefakt.

Hier ist ein Java-Beispiel basierend auf Rally API Toolkit For Java. Unabhängig von der Wahl des Toolkits, der Sprache usw. ist es das zugrunde liegende WS API Objektmodell, das Zugriff auf diese Daten bietet. Ich beschränkte die Build-Abfrage nach CreationDate. Neben anderen Feldern im Build-Objekt lade ich die Changesets-Sammlung ab. Jedes Element dieser Sammlung ist eine Referenz auf ein Changeset-Objekt. Der Git-Connector erstellt Changeset-Objekte in CA Agile Central (Rally). Jedes Changeset-Objekt verfügt über das Artfacts-Sammlungsfeld und das Changes-Sammlungsfeld. Jedes Element der Artifacts-Sammlung ist ein Verweis auf ein Rally-Artefakt, z. User Story, Defekt. Durch Abrufen von PathAndFilename für jedes Change-Objekt erhalten Sie die zugehörige Quelldatei. Jetzt können wir einen fehlgeschlagenen Build auf einen bestimmten Commit, eine Datei und eine User Story zurückverfolgen.

Dies ist ein Screenshot von der Konsolenausgabe, die mit dem folgenden Java-Code erstellt wurde. Eventuell möchten Sie Daten auf eine optisch ansprechende Weise darstellen. Dieses Beispiel zeigt nur, dass Builds und Commits über die WS-API zu User Stories oder Defects zurückverfolgt werden können.

Oft werden separate Anforderungen benötigt, um collections in WS API zu hydratisieren. Da Build- und Cansetsets-Daten groß sein können, binden diese Abfragen nach bestimmten Kriterien, z. CreationDate wird es schneller machen.

enter image description here

public class GetBuildData { 

    public static void main(String[] args) throws Exception { 

     String host = "https://rally1.rallydev.com"; 
     String apiKey = "_abc123"; 
     String applicationName = "NickM:GetBuildData"; 
     String workspaceRef = "/workspace/12345"; 
     String projectRef = "/project/1346"; 

     RallyRestApi restApi = null; 
     try { 
      String dateString = "2016-05-12"; 
      restApi = new RallyRestApi(new URI(host),apiKey); 
      restApi.setApplicationName(applicationName); 
      QueryRequest buildRequest = new QueryRequest("Build"); 
      buildRequest.setFetch(new Fetch("Status,Message,Start,Uri,Changesets")); 
      buildRequest.setQueryFilter(new QueryFilter("CreationDate", ">", dateString)); 
      buildRequest.setWorkspace(workspaceRef); 
      buildRequest.setProject(projectRef); 
      QueryResponse buildResponse = restApi.query(buildRequest); 
      for (int i=0; i<buildResponse.getTotalResultCount();i++){ 
       JsonObject buildObj = buildResponse.getResults().get(i).getAsJsonObject(); 
       System.out.println("Build Status: " + buildObj.get("Status") + 
         "\n Build Message: " + buildObj.get("Message") + 
         "\n Build Start: " + buildObj.get("Start") + 
         "\n Build Uri:  " + buildObj.get("Uri")); 
       JsonObject changesetsCollection = buildObj.get("Changesets").getAsJsonObject(); 
       QueryRequest changesetsRequest = new QueryRequest(changesetsCollection); 
       changesetsRequest.setFetch(new Fetch("Artifacts","Changes", "Revision")); 
       changesetsRequest.setLimit(1000); 
       QueryResponse changesetsResponse = restApi.query(changesetsRequest); 
       for (int j=0; j<changesetsResponse.getTotalResultCount();j++) { 
        JsonObject changesetObj = changesetsResponse.getResults().get(j).getAsJsonObject(); 
        System.out.println("\nChangeset Revision: " + changesetObj.get("Revision")); 
        JsonObject artifactsCollection = changesetObj.get("Artifacts").getAsJsonObject(); 
        QueryRequest artifactsRequest = new QueryRequest(artifactsCollection); 
        artifactsRequest.setFetch(new Fetch("FormattedID")); 
        QueryResponse artifactsResponse = restApi.query(artifactsRequest); 
        for (int k=0; k<artifactsResponse.getTotalResultCount();k++) { 
         JsonObject artifactObj = artifactsResponse.getResults().get(k).getAsJsonObject(); 
         System.out.println("\nArtifact FormattedID: " + artifactObj.get("FormattedID")); 
        } 
        JsonObject changesCollection = changesetObj.get("Changes").getAsJsonObject(); 
        QueryRequest changesRequest = new QueryRequest(changesCollection); 
        changesRequest.setWorkspace(workspaceRef); 
        changesRequest.setProject(projectRef); 
        changesRequest.setFetch(new Fetch("PathAndFilename")); 
        QueryResponse changesResponse = restApi.query(changesRequest); 
        for (int l=0; l<changesResponse.getTotalResultCount();l++) { 
         JsonObject changeObj = changesResponse.getResults().get(l).getAsJsonObject(); 
         System.out.println("Change PathAndFilename: " + changeObj.get("PathAndFilename")); 
        } 

       } 
       System.out.println("--------------------------------"); 
      } 
     } finally { 
      if (restApi != null) { 
       restApi.close(); 
      } 
     } 
    } 
} 

Wenn Sie Daten in Agile Central (Rally) AppSDK2.1 Erstellen angezeigt werden soll Javascript App kann in einer benutzerdefinierten Seite eingesetzt werden. Hier ist schnelles Beispiel beginnen mit:

<!DOCTYPE html> 
<html> 
<head> 
    <title>Builds by Date</title> 
    <script type="text/javascript" src="/apps/2.1/sdk.js"></script> 
    <script type="text/javascript"> 
     Rally.onReady(function() { 
       Ext.define('CustomApp', { 
    extend: 'Rally.app.App', 
    componentCls: 'app', 
    launch: function() { 
     this.add({ 
      xtype: 'component', 
      itemId: 'datepick', 
      html: 'pick a date:', 
      width: 100, 
      margin: 10 
     }, 
     { 
      xtype: 'rallydatepicker', 
      showToday: false, 
      contentEl: Ext.ComponentQuery.query('#datepick')[0], 
      margin: 10, 
      handler: function(picker, date) { 
       this.getBuilds(date); 
      }, 
      scope:this 
     }, 
     { 
      xtype: 'container', 
      itemId: 'gridContainer' 
     }); 
    }, 
    getBuilds:function(date){ 
     var formattedDate = Rally.util.DateTime.formatWithDefault(date, this.getContext()); 
     Ext.ComponentQuery.query('#datepick')[0].update((formattedDate) + '<br /> selected'); 
     if (this.down('rallygrid')) { 
      Ext.ComponentQuery.query('#gridContainer')[0].remove(Ext.ComponentQuery.query('#buildsGrid')[0], true); 
     } 
     this.down('#gridContainer').add({ 
      xtype: 'rallygrid', 
      itemId: 'buildsGrid', 
      columnCfgs: [ 
       'Status', 
       'Message', 
       'Start', 
       'Uri', 
       'Changesets' 
      ], 
      storeConfig: { 
       model: 'build', 
       filters:[ 
        { 
         property: 'CreationDate', 
         operator: '>=', 
         value: Rally.util.DateTime.toIsoString(date,true) 
        } 
       ] 
      } 
     }); 
    } 
}); 
      Rally.launchApp('CustomApp', { 
       name:"Builds by Date", 
       parentRepos:"" 
      }); 
     }); 
    </script> 
    <style type="text/css"> 
     .app { 
    /* Add app styles here */ 
} 
    </style> 
</head> 
<body> 
</body> 
</html> 

enter image description here

1

Wenn Sie /api/json?pretty=true an das Ende der URL Ihres Jobs in Jenkins anhängen, können Sie eine JSON-Ausgabe des Jobs selbst sehen, die Sie zur letzten Build-Nummer führen kann. Außerdem führt Sie dies zur URL des letzten Builds, der Sie (wiederum mit dem Anhang /api/json?pretty=true) zu einer JSON-Liste von Changesets (und entsprechenden Commit-Nachrichten) führen kann.

Sie müssen nicht einmal auf Rallye tippen! :-)

Sie können dieses JSON von Ihrer Spring-Anwendung mit JSON-Marshalling und der Spring-Klasse RestTemplate verwenden.