2012-04-26 2 views
3

J'écris un script qui exécutera une version uniquement s'il y a un changement dans le code source. J'ai besoin de savoir s'il y a un changement depuis la dernière exécution. Cela fonctionnait parce que le dossier ne serait pas supprimé, donc il était facile de déterminer s'il y avait un changement, mais maintenant tout est supprimé chaque fois que la construction est lancée. J'ai pensé à utiliser la commande TFS TF history pour interroger le dernier changeset ou les deux derniers changesets, mais j'ai eu des problèmes d'analyse du nombre de changeset depuis la sortie. J'ai également envisagé d'utiliser la commande changeset. Y a-t-il un paramètre de ligne de commande que je peux utiliser pour répondre à la question, y a-t-il eu un changement depuis une date ou un numéro de changeset?Utilisation de l'historique TFS TF pour déterminer le dernier ensemble de modifications

+0

Tout d'abord, Team Build dispose d'une fonctionnalité qui le fait déjà. Utilisez-vous autre chose? Deuxièmement, est-ce que _any_ change dans le dépôt est suffisant pour déclencher la construction, ou avez-vous besoin de voir s'il y a un changement dans un répertoire ou des répertoires spécifiques? – Andrew

+0

Ouais, j'utilise un système différent, buildforge spécifiquement. Nous utilisons un adaptateur TFS pour les versions CI, mais nous voulons seulement exécuter la construction s'il y a une mise à jour. Puisque la construction est spécifique à une branche, je veux seulement savoir s'il y a un changement dans cette branche/dossier. –

+0

La réponse de Guanghui Qin, fonctionne très bien, est très rapide et vous n'avez pas besoin d'un espace de travail pour cela. – Yogurtu

Répondre

2

Comme Andrew l'a mentionné, TFS possède une fonctionnalité d'intégration continue intégrée. Cependant, oui, il est facile d'interroger les changesets depuis un certain point, que ce soit une date ou un changeset. Vous voulez regarder l'histoire entre cette dernière et changeset:

tf history <folder> /version:C<changeset>~T /noprompt /recursive 

Si la sortie seule ligne est le changeset vous interrogé pour, il est évident que il n'y a eu aucun changement depuis cette checkin. Sinon, vous verrez les changesets supplémentaires, un par ligne.

+1

Ouais, cela me dit les changesets, y compris celui demandé. Comment pourrais-je analyser le nombre seul de la sortie? Existe-t-il un moyen d'analyser les commandes par lots? –

1

Il existe un adaptateur qui peut intégrer BuildForge et Microsoft Team Foundation Server. Voici l'URL si vous êtes intéressé ... http://www-304.ibm.com/partnerworld/gsd/solutiondetails.do?&solution=46360&lc=en

L'adaptateur Automatra TFS Forge Rational Build offre une intégration continue (CI) et de reporting.

L'adaptateur TFS active en outre les fonctions CI aux niveaux TFS Source (Change Set) et WorkItem. Les rapports prêts à l'emploi fournissent des rapports de nomenclature (BOM) clairs qui peuvent être transmis aux utilisateurs en aval de vos builds. Enfin, comme vous devez le savoir, la force de Build Forge réside dans sa capacité à créer des ponts avec le déploiement (et au-delà). De toute évidence, avec ces capacités d'intégration continue, vous pouvez ensuite aller de l'avant avec la capacité de livraison continue, je crois que vous souhaitez atteindre.

3

extrait de mon fichier séquentiel à construire.

set _aPath="f:\TFS\a" 
set _TFPath="c:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE" 

...

pushd %_aPath% 
%_TFPath%\TF.exe history . /r /noprompt /stopafter:1 /Version:W > temp 
FOR /f "tokens=1" %%a in ('findstr /R "^[0-9][0-9]*" temp') do set _BuildVersion=10.3.0.%%a 
del temp 
popd 

utilise un fichier temporaire, mais fonctionne bien.

+0

Notez que vous n'avez pas besoin du fichier intermédiaire, par exemple: 'tf vc info d: \ w \ code04 \ Server.sln | findstr/R "Dernière modification: [^ \ r \ n] + r \ n" ' –

0

Mon script PowerShell qui est appelé GetVcsRevision.ps1 et situé dans un sous-dossier de VCS Racine:

param (
    [string]$PathToTF='C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\TF.exe' 
    ,[Parameter(Mandatory=$true)][string]$Login 
    ,[Parameter(Mandatory=$true)][string]$Password 
) 
$result = &$PathToTF @("history","/stopafter:1","/recursive","..\*","/login:""$Login"",""$Password""") 2>&1 3>&1 

if ($result.GetType().Name -eq "Object[]") 
{ 
    <# $result format is: 
     Changeset User    Date  Comment 
     --------- ----------------- ---------- ---------------------------------------- 
     26038  user    24.06.2014 Sample commit comment 

     $result[2] is: 
     26038  user    24.06.2014 Sample commit comment 

     $result[2].Split(" ")[0] is: 
     26038 
    #> 

    $result[2].Split(" ")[0] 
} 
else 
{ 
    "0" 
} 

Il est l'envoi dernier numéro de changeset à sortir tuyau. Si quelque chose ne va pas, alors ce numéro est 0.

Vous pouvez créer une fonction à partir de ce script et l'appeler dans votre script de construction.

3

Pour le dernier numéro de changeset sans espace de travail local, s'il vous plaît utilisez cette commande:

tf history /collection:"http://server:8080/tfs/Collection" "$/Project" /recursive /stopafter:1 /noprompt /login:domain\user,password 
+0

Je t'aime tellement. – Yogurtu

1

Ma commande d'une ligne:

for /f "usebackq tokens=*" %%a in (`tf history . /recursive /noprompt /stopafter:1 /version:T ^| powershell -Command "$input | ? { $_ -imatch '^(\d+)\s+' } | %% { $matches[0].Trim() } | Select-Object -First 1"`) do set TIP_CHANGESET=%%a 

après l'exécution env TIP_CHANGESET. variable contient un ensemble de modifications de pointe

Questions connexes