zoukankan      html  css  js  c++  java
  • Creating a K2 Deployment Package from code

    下面这篇文章介绍了如何通过编程的方式生成K2的部署包

    http://cyclops.nettrends.nl/blog/2008/05/creating-a-k2-deployment-package-from-code/

    In our current project, we are using Tean Foundation Server to automate our build process. This also means MSI’s are created for every artifact to deploy, eventually using TFS’s functionality to deploy a new msi when the build quality is changed. MSI’s are build in a way so they can be installed from command line without user actions required (unattended installation). So, when we change the build quality of a build it can fully automatically be deployed to a testing environment.

    Most of our software that needs to be deployed are webservices, websites or web parts. K2 however, is somewhat harder to deploy. Since BlackPearl it has become a lot easier because you can use a MSBUILD command to deploy a process. For those of you who don’t know about this. Check out KB000188 at the K2 Knowledge base. In general, it comes down to this command:

    MSBUILD DeploymentPackage.msbuild /p: Environment=Development

    It’s easy to create a MSI or (PowerShell) script that starts the MSBUILD command and installs the process. But how do we automate the creation of the deployment package? Since this is normally done from VS2005.

     

    实际上,主要用到了两个方法

    Sourcecode.Framework.ProjectSystem.Project.CreateDeploymentPackage

    Project.Save

    完整的代码如下

    http://cyclops.nettrends.nl/blog/wp-content/uploads/2008/05/deploypackagecreator.cs

    using System;
    using System.Collections.Generic;
    using System.Text;
    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;
    
    namespace CreateK2DeploymentPackage
    {
        public class DeployPackageCreator : Task
        {
    
            private string folderName;
            private string kprxLocation;
            private string outputFolder;
            private string selectedEnvironment;
            private string  k2ConnectionString;
    
            public string  K2ConnectionString
            {
                get { return k2ConnectionString; }
                set { k2ConnectionString = value; }
            }
    	
    
            public string SelectedEnvironment
            {
                get { return selectedEnvironment; }
                set { selectedEnvironment = value; }
            }
    	
    
    
            public string OutputFolder
            {
                get { return outputFolder; }
                set { outputFolder = value; }
            }
    	
            public string KPRXLocation
            {
                get { return kprxLocation; }
                set { kprxLocation = value; }
            }
    	
            public string FolderName
            {
                get { return folderName; }
                set { folderName = value; }
            }
    	
    
            public override bool Execute()
            {
                try
                {
                    this.SavePackage(this.FolderName, this.KPRXLocation, this.OutputFolder);
                }
                catch (Exception ex)
                {
                    //Log.LogError(ex.Message);
                    throw ex;
                    return false;
                }
                return true;
            }
            
    
    
            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);
            }
    
    
    
            /// <summary>
            /// 
            /// </summary>
            /// <param name="project"></param>
            /// <returns></returns>
            ///TODO: Method needs expanding to output the errors (etc..)
            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));
                }
    
            }
    
    
    
        }
    }
    
  • 相关阅读:
    简述at和crontab命令
    自建yum仓库,分别为网络源和本地源
    简述rpm与yum命令的常见选项
    用户目录权限管理.手动添加用户.截取用户信息
    总结描述用户和组管理类命令的使用方法,系统用户相关信息,取出主机IP地址
    Android独立交叉编译环境搭建
    Python编程总结之常用三方模块
    GDB常用命令简介
    linux内核中task_struct与thread_info及stack三者的关系
    在Linux-PC上建立kdump调试环境
  • 原文地址:https://www.cnblogs.com/chenxizhang/p/1577814.html
Copyright © 2011-2022 走看看