Как получить подробности сборки в пользовательском рабочем процессе? - PullRequest
2 голосов
/ 31 мая 2011

Мне нужно добавить настраиваемое действие в шаблон рабочего процесса по умолчанию, чтобы увеличить версии сборок как можно раньше в процессе сборки.

Чего я хотел бы добиться, так это создать и отобразить точно такое же рабочее пространство (которое будет создано далее в рабочем процессе) внутри моего пользовательского действия, чтобы я мог извлечь файл XML, увеличить номер версии, хранящейся внутри, запишите его обратно в xml-файл и верните xml-файл обратно.

Я знаю, что это рабочее пространство будет создано позже в рабочем процессе, но это будет слишком поздно в процессе сборки для того, чего я пытаюсь достичь, поэтому вместо того, чтобы перемещать какие-либо действия или дублировать их в Положение выше моей пользовательской активности (это должно быть в порядке, так как это рабочее пространство будет удалено и заново создано позже)

Я думаю, что мне нужны детали BuildDirectory, WorkspaceName и SourcesDirectory. Может кто-нибудь сказать мне, как добиться создания рабочей области или как получить эти данные в коде?

сборка будет выполняться на сервере сборки, и я использую TFS 2010 и c #.

Заранее спасибо

1 Ответ

3 голосов
/ 31 мая 2011

Я последовал за серией статей в блоге Эвальдом Хофманом в качестве учебного пособия и создал пользовательское действие, которое выполняет извлечение, обновление и регистрацию файла GlobalAssemblyInfo, который я анализирую из текущей версии , Моя задача вставляется в верхнюю часть «Расположение удаления обновления», которое находится сразу после выполнения части «Получить сборку» рабочего процесса. Я просто использую требование IBuildDetail и File Mask в качестве аргументов, из которых вы можете извлечь VersionControlServer для доступа к TFS. Мой код ниже:

protected override string Execute(CodeActivityContext context)
    {
        // Obtain the runtime value of the input arguments.
        string assemblyInfoFileMask = context.GetValue(AssemblyInfoFileMask);
        IBuildDetail buildDetail = context.GetValue(BuildDetail);

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

        Regex regex = new Regex(AttributeKey + VersionRegex);

        // Iterate of the folder mappings in the workspace and find the AssemblyInfo files 
        // that match the mask.
        foreach (var folder in workspace.Mappings)
        {
            string path = Path.Combine(folder.ServerItem, assemblyInfoFileMask);
            context.TrackBuildMessage(string.Format("Checking for file: {0}", path));
            ItemSet itemSet = versionControl.GetItems(path, RecursionType.Full);

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

                try
                {
                    // Download the file and try to extract the version.
                    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("Version found {0}", newVersion));

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

        return null;
    }
...