Ho svolto alcune ricerche e ho giocato con ciò che offre TFS di default. Per essere onesti, copre praticamente lo scenario base che ho descritto.
Il modello di generazione di default per Git contiene un argomento di compilazione chiamato Checkout override
:
Questo campo accetta sia nome del tag, o semplicemente ID della revisione che desideri costruire da:
La cosa buona è che questa impostazione ha la precedenza (proprio come suggerisce il nome :)) il ramo predefinito. Voglio dire, se hai creato un tag dal ramo principale, ma hai specificato un altro ramo nella scheda Origine della definizione di build, non importa: il Checkout override
ha la preferenza.
Proverò a indagare sullo scenario avanzato (descritto nella mia domanda). Suppongo che ci sarà una certa quantità di codice personalizzato ... pubblicheremo l'aggiornamento qui.
UPDATE 23 DIC 2013 Come previsto, per poter scegliere il tag da cui creare, è necessario un codice personalizzato. Ho finito per creare un editor personalizzato e assegnarlo al campo Checkout override
. Di conseguenza, non c'è alcuna possibilità di incollare alcun id di revisione lì, solo scegliere un tag dall'elenco - ma per il mio caso va bene.
Quindi, per prima cosa è necessario creare un editor personalizzato per un campo. Fondamentalmente, creare una classe, ereditarla dalla classe System.Drawing.Design.UITypeEditor
e sovrascrivere un paio di metodi. This walkthrough ha aiutato molto, nonché this book (capitolo 18 "Personalizzazione del processo di creazione").
Il codice utile che ottiene l'elenco dei tag da una specifica repo Git di uno specifico progetto di squadra TFS è qui:
private List<string> GetAvailableTags(IServiceProvider provider)
{
// obtain the current build definition object
var buildDefinition = (IBuildDefinition)provider.GetService(typeof(IBuildDefinition));
// obtain the current source provider for the build definition (Git or TFVC)
var sourceProvider = buildDefinition.GetDefaultSourceProvider();
// obtain the project collection
var teamProjectCollection = buildDefinition.BuildServer.TeamProjectCollection;
// obtain a service object to communicate with Git repo
var gitRepoService = teamProjectCollection.GetService<GitRepositoryService>();
// this will get the partial URL of the Git repo (in a form <teamproject>/<repo>)
var repoUrl = sourceProvider.Fields[BuildSourceProviders.GitProperties.RepositoryName];
string projectName;
string repoName;
// this is the way to parse the partial URL obtained above, into project name and repo name
if (BuildSourceProviders.GitProperties.ParseUniqueRepoName(repoUrl, out projectName, out repoName))
{
// this will get all Git repos of the current team project
var source = gitRepoService.QueryRepositories(projectName);
// this will take the current Git repo we work with
var repo = source.First(x => x.Name.Equals(repoName, StringComparison.OrdinalIgnoreCase));
// this will get all the tags in this Git repo
var tags = gitRepoService.QueryRefs(repo.Id, "tags");
// and finally, the list of pure tag names is returned
return tags.Select(gitRef => gitRef.Name.Substring("refs/tags/".Length)).ToList();
}
return new List<string>();
}
La DLL con l'editor personalizzato deve essere reso visibile a VS (nel mio caso , Ho appena messo il gruppo nella cartella Common7\IDE\PrivateAssemblies\
della mia installazione VS).Poi, nel editor di campo di metadati è necessario specificare l'editor personalizzato per il campo desiderato:
E ora se modificare la definizione di compilazione, o coda di una nuova build, siamo in grado di selezionare l'etichetta necessaria dalla discesa:
Spero che questo ti consente di risparmiare un po 'di tempo.
ti dispiacerebbe contribuire con questo frammento agli ALM Rangers Build Community Extensions? http://tfsbuildextensions.codeplex.com/ – jessehouwing
Questa è una buona idea. Potresti per favore indicare la posizione esatta in cui si inserisce? –
Ho avvisato il team Ranger che lo sta mantenendo. Se si potesse usare la funzione "Carica patch" per caricare un file zip con i sorgenti, penso di poter impostare il processo in movimento per averli inclusi ... http://tfsbuildextensions.codeplex.com/SourceControl/latest – jessehouwing