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.

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>
