Как выполнить автоматическое развертывание K2 и интегрировать его с инструментом непрерывной интеграции (TeamCity)? - PullRequest
2 голосов
/ 18 сентября 2011

Я работаю над проектом K2 blackpearl ( Visual Studio 2010 + K2 blackpearl + SQL Server 2008 ).Весь исходный код в SVN, и я использую TeamCity в качестве инструмента непрерывной интеграции.Я завершил автоматическое развертывание Интернета и базы данных.Когда я работаю над автоматическим развертыванием K2, я использую MSBuild для развертывания пакета K2 на сервере K2 Рабочая папка проекта Msbuild \ obj \ Debug \ Deployment \ WorkflowName.msbuild "/ p: TestOnly = True / p: Среда = Разработка

Перед запуском MSBuild мне нужно сначала создайте пакет развертывания K2 , теперь возникает проблема:1. Я не обнаружил, что команда имеет ту же функцию с «Создать пакет развертывания K2» Visual Studio;2. Я обнаружил, что могу использовать кодирование для создания пакета, поэтому я пытаюсь создать консольное приложение для создания пакета развертывания K2.Код должен ссылаться на Microsoft.Build DLL, но он не поддерживает добавление ссылки Microsoft.Build в консольный проект.Поэтому я пытаюсь создать проект класса и поместить нижеприведенный код в класс, класс успешно усложняется, но когда я пытаюсь добавить этот проект класса или DLL в консольный проект, у него все еще остается та же проблема.Я получил 4 предупреждения о System.Design, Microsoft.Build, Microsoft.Build.Framework и Microsoft.Build.Utilities.Я не нашел способа запустить метод создания пакета с помощью консоли.

У вас есть идея или решение для решения проблем автоматического развертывания K2?

Информация об ошибке: Ссылочная сборка «… \ bin \ Debug \ DeployPackageCreator.dll» не может быть решена, поскольку она зависит от «System.Design, Version = 4.0.0.0, Culture = нейтральный, PublicKeyToken = b03f5f7f11d50a3a», которого нет в текущей целевойфреймворк ".NETFramework, версия = v4.0, профиль = клиент".Удалите ссылки на сборки, не входящие в целевую среду, или рассмотрите возможность перенастройки вашего проекта.

Код по умолчанию:

using Microsoft.Build.Framework;
using Microsoft.Build.Utilities;
using SourceCode.ProjectSystem;
using SourceCode.Workflow.Authoring;
using SourceCode.Framework.Deployment;
using System.IO; 
using SourceCode.EnvironmentSettings.Client;



public string K2ConnectionString { get; set; }
public string SelectedEnvironment { get; set; }
public string OutputFolder { get; set; }
public string KPRXLocation { get; set; }
public string FolderName { get; set; }



private void SavePackage(string folderName, string kprxLocation, string outputFolder)
    {
        //Create a project to use for deployment, the project is the folder/solution
        string tmpPath = Path.Combine(Path.GetTempPath(), Path.GetFileNameWithoutExtension(Path.GetTempFileName()));
        Project project = new Project(folderName, tmpPath);

        //Add the process as a projectfile.
        Process processToDeploy = Process.Load(kprxLocation);

        // Log load problems.
        foreach (SourceCode.Framework.ObjectLoadException loadExceptions in processToDeploy.LoadErrors)
        {
            //Log.LogWarning("Load exception: {0}", loadExceptions.Message);
        }

        // Add process to the project.
        AddProcess(project, processToDeploy);

        //Do a test-compile
        if (!TestCompile(project))
        {
            throw new Exception("First compile test; Project did not compile.");
        }

        // create a deployment package
        DeploymentPackage package = project.CreateDeploymentPackage();

        // Add environment stuff
        AddEnvironment(package, this.SelectedEnvironment);

        //Set other connections. The K2 deployment package uses a reference. This does the same but does not use the reference!
        package.SmartObjectConnectionString = this.K2ConnectionString;
        package.WorkflowManagementConnectionString = this.K2ConnectionString;

        //Do a test-compile
        if (!TestCompile(project))
        {
            throw new Exception("Second compile test; Project did not compile.");
        }

        //Finaly, save the deployment package
        package.Save(outputFolder, folderName);
    }


   private bool TestCompile(Project project)
    {
       // project.Environment.AuthoringMode = SourceCode.Framework.AuthoringMode.CodeOnly;
        //Log.LogMessage("Project.environment: {0}", project.Environment.Name);
        DeploymentResults compileResult = project.Compile();

        if (!compileResult.Successful)
        {
            foreach (System.CodeDom.Compiler.CompilerError error in compileResult.Errors)
            {
                string errString = string.Format("Error compiling: {0} - {1}", error.ErrorNumber, error.ErrorText);
                //Log.LogWarning(errString);
                Console.WriteLine(errString);
            }
        }

        return compileResult.Successful;
    }



private void AddProcess(Project project, Process process)
    {
        // Create the ProjectFile
        ProjectFile file = (ProjectFile)project.CreateNewFile();

        // Set information on the file.
        file.FileName = process.FileName;
        file.Content = process;

        // Add the file to the project
        project.Files.Add(file);

        // Save the project to the temp location.
        project.SaveAll();
    }



    private void AddEnvironment(DeploymentPackage package, string SelectedEnvironment)
    {
        // Since there's no documentation on connecting to the environment server. This seems to work....
        EnvironmentSettingsManager envManager = new EnvironmentSettingsManager(true);
        envManager.ConnectToServer(this.K2ConnectionString);
        envManager.InitializeSettingsManager(true);
        envManager.Refresh();

        // Add environments + environment properties.
        foreach (EnvironmentTemplate envTemp in envManager.EnvironmentTemplates)
        {
            foreach (EnvironmentInstance envInst in envTemp.Environments)
            {
                //Add an environment to the package.
                DeploymentEnvironment env = package.AddEnvironment(envInst.EnvironmentName);
                foreach (EnvironmentField field in envInst.EnvironmentFields)
                {
                    env.Properties[field.FieldName] = field.Value;
                }

                // Make sure the environment we select actually exists.
                if (envInst.EnvironmentName == SelectedEnvironment)
                {
                    package.SelectedEnvironment = envInst.EnvironmentName;
                }
            }
        }

        //Cleanup
        envManager.Disconnect();
        envManager = null;

        //Final check of the selected environment 
        if (package.SelectedEnvironment == null || package.SelectedEnvironment == string.Empty)
        {
            throw new Exception(string.Format("Could not find the environment you wanted to select ({0})", SelectedEnvironment));
        }
    }

1 Ответ

2 голосов
/ 19 сентября 2011

Эта ошибка, по-видимому, вызвана тем, что вы строите свой пакет развертывания (который зависит от System.Design) с использованием «.Net 4.0 Профиль клиента » (не полная версия платформы), котораяне включает библиотеку фреймворков System.Design .

Можно ли создать полную версию .Net 4 вместо профиля клиента ?

Хотя я не полностью осознаю, на какой платформе работает K2, если это библиотека / пакет Sharepoint, я бы предположил, что на сервере, на котором он работал, установлена ​​полная версия .net 4.

Информация об ограничениях профиля клиента в MSDN:

http://msdn.microsoft.com/en-us/library/cc656912.aspx

...