gpt4 book ai didi

build - 如何在多个 CruiseControl.NET 构建之间共享标签值?

转载 作者:行者123 更新时间:2023-12-04 16:41:47 25 4
gpt4 key购买 nike

我在 CruiseControl.NET 中设置了两个项目:CI 构建和夜间构建。

它们都执行相同的 NAnt 脚本,但参数不同。

CruiseControl.NET 标签(当前由 DefaultLabeler 生成)作为版本的构建部分嵌入到 AssemblyInfo 中(例如,MajorVersion.MinorVersion.CCNET_Label.SVN_Revision)。

为了更一致的版本控制,我希望两个项目共享相同的 CruiseControl.NET 标签值。

我调查了可作为 CruiseControl.NET 安装的一部分使用的标签器,但我找不到可以满足我需求的标签器。

如何在多个 CruiseControl.NET 构建之间共享标签值?
如果有更好的方法来做到这一点,我想知道。

我找到了一个方法。请看下面我的回答。

最佳答案

我找不到可以满足我需求的现有解决方案,因此我最终编写了一个自定义 CruiseControl.NET 贴标机。

这是如何完成的:

  • 创建一个新项目。这将被 CC.NET 用作插件库
  • 输出 DLL 的名称需要匹配 *ccnet.\*.CruiseControl.plugin*。前往项目
    属性并将“程序集名称”更改为 *ccnet.<在此处插入名称>.CruiseControl.plugin*
  • 在您的项目中,添加对 CC.NET 服务器安装目录中的三个程序集的引用(默认为:C:\Program Files\CruiseControl.NET\server):

  • NetReflector.dll
  • ThoughtWorks.CruiseControl.Core.dll
  • ThoughtWorks.CruiseControl.Remote.dll


  • 创建一个新的公共(public)类,例如:

    使用 ThoughtWorks.CruiseControl.Core;
    使用 ThoughtWorks.CruiseControl.Remote;

    //这是将在 ccnet.config 中使用的贴标机名称
    [ReflectorType("customLabeller")]
    公共(public)类 CustomLabeller : ILabeller
    {
    [ReflectorProperty("syncronisationFilePath", 必需 = true)]
    公共(public)字符串 SyncronisationFilePath { 获取;放; }

    #region ILabeller 成员

    公共(public)字符串生成(IIntegrationResult previousResult)
    {
    if (ShouldIncrementLabel(previousResult))
    返回增量标签();

    如果(previousResult.Status == IntegrationStatus.Unknown)
    返回“0”;

    返回上一个结果。标签;
    }

    公共(public)无效运行(IIntegrationResult 结果)
    {
    result.Label = 生成(结果);
    }

    #endregion

    私有(private)字符串 IncrementLabel()
    {
    如果(!File.Exists(同步文件路径))
    返回“0”;

    使用 (FileStream fileStream = File.Open(SyncronisationFilePath,
    FileMode.OpenOrCreate,
    FileAccess.ReadWrite,
    文件共享。无))
    {
    //从文件中读取最后的内部版本号
    var bytes = new byte[fileStream.Length];
    fileStream.Read(bytes, 0, bytes.Length);

    string rawBuildNumber = Encoding.ASCII.GetString(bytes);

    //解析最后的构建号
    int previousBuildNumber = int.Parse(rawBuildNumber);
    int newBuildNumber = previousBuildNumber + 1;

    //增加内部版本号并写回文件
    bytes = Encoding.ASCII.GetBytes(newBuildNumber.ToString());

    fileStream.Seek(0, SeekOrigin.Begin);
    fileStream.Write(bytes, 0, bytes.Length);

    返回 newBuildNumber.ToString();
    }
    }

    私有(private)静态 bool ShouldIncrementLabel(IIntegrationResult previousResult)
    {
    返回(previousResult.Status == IntegrationStatus.Success ||
    previousResult.Status == IntegrationStatus.Unknown)
    }
    }
  • 编译您的项目并将DLL复制到CC.NET服务器安装目录(默认为:C:\Program Files\CruiseControl.NET\server)
  • 重启CC.NET Windows服务

  • 创建一个文本文件来存储当前版本号

  • 将新标签器添加到 ccnet.config 文件中的项目定义中:


    C:\Program Files\CruiseControl.NET\server\shared\buildnumber.txt



  • 关于build - 如何在多个 CruiseControl.NET 构建之间共享标签值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1706601/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com