在 Octopus 中,如何在 NServiceBus 实例上进行变量替换-mapping.xml

In Octopus, how to do variable substitution on an NServiceBus instance-mapping.xml

在 C# 项目中使用 NServiceBus 时,一个名为 instance-mapping.xml 的文件用于指定每个队列托管在哪台机器上。像这样:

<?xml version="1.0" encoding="utf-8" ?>
<endpoints>
    <endpoint name="QueueName1">
        <instance machine="localhost"/>
    </endpoint>

    <endpoint name="QueueName2">
        <instance machine="localhost"/>
    </endpoint>
</endpoints>

在 Octopus 中,如何对这样的文件进行变量替换?因此,QueueName1 中的 "machine" 属性更改为 "server1",而 QueueName2 中的属性更改为 "server2"。像这样:

<?xml version="1.0" encoding="utf-8" ?>
<endpoints>
    <endpoint name="QueueName1">
        <instance machine="server1"/>
    </endpoint>

    <endpoint name="QueueName2">
        <instance machine="server2"/>
    </endpoint>
</endpoints>

Octopus 具有内置功能,可以对例如 key/value 进行简单的替换。应用程序设置和连接字符串。但是上面的文件有点复杂,因为封闭元素标识了键。

我可能过于简化了您的问题,但为了得到所需的 instance-mapping.xml 我会使用配置转换。 instance-mappings.transform.xml 文件示例为:

<?xml version="1.0" encoding="utf-8" ?>
<endpoints xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
    <endpoint name="QueueName1" xdt:Locator="Match(name)">
        <instance machine="server1" xdt:Transform="SetAttributes" />
    </endpoint>

    <endpoint name="QueueName2" xdt:Locator="Match(name)">
        <instance machine="server2" xdt:Transform="SetAttributes" />
    </endpoint>
</endpoints>

然后在 Octopus 中添加一个配置转换 instance-mapping.transform.xml => instance-mapping.xml

如果您希望将机器值配置为八达通变量,您可以添加一个变量替换。指定变量:machine[QueueName1] 值为 machine1machine[QueueName2] 值为 machine2 并修改转换文件:

<?xml version="1.0" encoding="utf-8" ?>
<endpoints xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
    <endpoint name="QueueName1" xdt:Locator="Match(name)">
        <instance machine="#{machine[QueueName1]}" xdt:Transform="SetAttributes" />
    </endpoint>

    <endpoint name="QueueName2" xdt:Locator="Match(name)">
        <instance machine="#{machine[QueueName2]}" xdt:Transform="SetAttributes" />
    </endpoint>
</endpoints>

如果在开发过程中添加本地端点时遇到困难,而这在其他环境中没有意义,您可以使用 Octopus 作为端点的真实来源。为此,请将每个端点的变量添加到您的 Octopus 项目中:

然后您可以根据 Octopus 中的值在转换文件中设置端点:

<?xml version="1.0" encoding="utf-8" ?>
<endpoints xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform" xdt:Transform="Replace">
#{each e in endpoint}
    <endpoint name="#{e.Name}">
        <instance machine="#{e.Machine}"/>
    </endpoint>
#{/each}
</endpoints>

给定示例变量和转换文件,在 Octopus 中使用变量替换和配置转换,您最终将得到所需的 instance-mapping.xml:

<?xml version="1.0" encoding="utf-8"?>
<endpoints>
    <endpoint name="QueueName1">
        <instance machine="Machine1"/>
    </endpoint>
    <endpoint name="QueueName2">
        <instance machine="Machine2"/>
    </endpoint>
</endpoints>

希望对您有所帮助。