2 Stimmen

Wie erhalte ich Build-Details in einer benutzerdefinierten Workflow-Aktivität?

Ich muss eine benutzerdefinierte Aktivität zur Standard-Workflow-Vorlage hinzufügen, um die Zusammenbauversionen so früh wie möglich im Build-Prozess zu erhöhen.

Was ich erreichen möchte, ist, den genau gleichen Arbeitsbereich zu erstellen und zu verknüpfen (der weiter unten im Workflow erstellt wird) innerhalb meiner benutzerdefinierten Aktivität, damit ich eine XML-Datei auschecken, die darin enthaltene Versionsnummer erhöhen, sie wieder in die XML-Datei schreiben und die XML-Datei wieder einchecken kann.

Ich bin mir bewusst, dass dieser Arbeitsbereich später im Workflow erstellt wird, aber das wird für das, was ich erreichen möchte, zu spät im Build-Prozess sein. Anstatt also irgendwelche Aktivitäten zu verschieben oder sie oberhalb meiner benutzerdefinierten Aktivität zu duplizieren (das sollte in Ordnung sein, da dieser Arbeitsbereich später gelöscht und erneut erstellt wird)

Ich glaube, die Details, die ich brauche, sind BuildDirectory, WorkspaceName und SourcesDirectory. Kann mir jemand sagen, wie ich die Erstellung des Arbeitsbereichs erreichen oder diese Daten im Code erhalten kann?

Der Build wird auf einem Build-Server durchgeführt und ich verwende TFS 2010 und C#.

Vielen Dank im Voraus

3voto

Adam Gritt Punkte 2624

Ich habe die Serie von Blog-Artikeln von Ewald Hofman als Einführung verfolgt und eine benutzerdefinierte Aktivität erstellt, die das Auschecken, Aktualisieren und Einchecken einer GlobalAssemblyInfo-Datei durchführt, aus der ich die aktuelle Version parsen. Meine Aufgabe wird oben in der "Update-Drop Location" eingefügt, die direkt nach dem "Get the build"-Teil des Workflows erfolgt. Ich benötige nur das IBuildDetail und ein Dateimaskenargument, aus dem Sie den VersionControlServer abrufen können, um auf TFS zuzugreifen. Mein Code sieht wie folgt aus:

protected override string Execute(CodeActivityContext context)
    {
        // Den Laufzeitwert der Eingabeargumente abrufen.
        string assemblyInfoFileMask = context.GetValue(AssemblyInfoFileMask);
        IBuildDetail buildDetail = context.GetValue(BuildDetail);

        var workspace = buildDetail.BuildDefinition.Workspace;
        var versionControl = buildDetail.BuildServer.TeamProjectCollection.GetService();

        Regex regex = new Regex(AttributeKey + VersionRegex);

        // Über die Ordnerzuordnungen im Workspace iterieren und die AssemblyInfo-Dateien finden,
        // die zur Maske passen.
        foreach (var folder in workspace.Mappings)
        {
            string path = Path.Combine(folder.ServerItem, assemblyInfoFileMask);
            context.TrackBuildMessage(string.Format("Datei wird überprüft: {0}", path));
            ItemSet itemSet = versionControl.GetItems(path, RecursionType.Full);

            foreach (Item item in itemSet.Items)
            {
                context.TrackBuildMessage(string.Format("Herunterladen von {0}", item.ServerItem));
                string localFile = Path.GetTempFileName();

                try
                {
                    // Datei herunterladen und versuchen, die Version zu extrahieren.
                    item.DownloadFile(localFile);
                    string text = File.ReadAllText(localFile);
                    Match match = regex.Match(text);

                    if (match.Success)
                    {
                        string versionNumber = match.Value.Substring(AttributeKey.Length + 2, match.Value.Length - AttributeKey.Length - 4);
                        Version version = new Version(versionNumber);
                        Version newVersion = new Version(version.Major, version.Minor, version.Build + 1, version.Revision);

                        context.TrackBuildMessage(string.Format("Gefundene Version {0}", newVersion));

                        return newVersion.ToString();
                    }
                }
                finally
                {
                    File.Delete(localFile);
                }
            }
        }

        return null;
    }

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X