服务器特定配置的自动部署

发布于 2024-10-02 23:39:51 字数 839 浏览 4 评论 0原文

我有一些使用 Apache Commons Configuration 的 Java 项目,它们被部署到多个环境(开发/测试/生产)中的多个服务器。

所有代码都是相同的,但一些配置项发生了变化,例如 JMS URL(dev 应该指向 dev 等)以及服务器名称和环境(我使用这些配置项进行调试)。

示例:

<config>
    <!-- environment can be dev|test|prod -->
    <environment>dev</environment>

    <serverName>myServer1</serverName>

    <jmsUrl>http://my-jms-url-dev1,http://my-jms-url-dev2</jmsUrl>
</config>

目前,我手动部署、构建然后编辑文件以提供特定于服务器的配置。当我将其部署到单独的服务器时,我想要一种自动执行此操作的方法,但我考虑过的所有方法都需要同样的痛苦来设置。

  • ANT - 使用 SVN 检查项目并使用 ANT 在每台服务器上构建它。 ANT 从两个静态文件(.servername 和 .environment)读取服务器名称和环境,并将特定于服务器的配置复制到通用配置。这样做的问题是,我仍然必须为每台服务器创建一个配置文件(我有 24 台服务器,而且这可能会增加,因此可扩展性不好)。

  • SVN - 将我的每个项目分支到特定于服务器的发行版。在这里,可扩展性更差,并且维护起来成为一场噩梦。

有人可以给我一些建议吗?

I have some Java projects that use Apache Commons Configuration and they get deployed to multiple servers in multiple environments (dev/test/prod).

All code is the same, but some config items change, such as JMS URLs (dev should point to dev, etc) as well as the server name and environment (I use these config items for debugging).

Example:

<config>
    <!-- environment can be dev|test|prod -->
    <environment>dev</environment>

    <serverName>myServer1</serverName>

    <jmsUrl>http://my-jms-url-dev1,http://my-jms-url-dev2</jmsUrl>
</config>

Currently, I deploy, build, then edit the files manually to provide the server-specific configurations. I want a way to automate this when I deploy it to individual servers, but all the ways I've considered require an equal amount of pain to setup.

  • ANT - Check out the project with SVN and build it on each server with ANT. ANT reads the server name and the environment from two static files - .servername and .environment - and copies a server-specific config to the generic config. The problem with this is, I still have to create a config file for each server (I have 24 servers, and this may increase, so scalability is not good).

  • SVN - Branch each of my projects to a server-specific distribution. Here, scalability is worse and it becomes a nightmare to maintain.

Does anybody have any tips for me?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

成熟的代价 2024-10-09 23:39:51

我明白了这一点。

步骤 1.

获取主机名:

<target name="getHostname" description="Stores the current machines hostname in a property named 'hostname'">
    <property environment="env" />
    <condition property="hostname" value="${env.HOSTNAME}">
        <os family="unix" />
    </condition>

    <!-- Execute hostname command on Linux systems -->
    <exec executable="hostname"
          osfamily="unix"
          failifexecutionfails="false"
          outputproperty="env.COMPUTERNAME"/>

    <!-- On Windows, the hostname is an environment variable -->
    <condition property="hostname" value="${env.COMPUTERNAME}">
        <os family="windows" />
    </condition>

    <echo message="${env.COMPUTERNAME}" />

</target>

步骤二,创建一个模板文件并用于复制该文件并对其进行查找/替换:

    <copy file="${scripts}/.servername.template"
          tofile="${scripts}/.servername">
        <filterchain>
            <replacetokens>
                <token key="SERVER_NAME"
                       value="${env.COMPUTERNAME}" />
            </replacetokens>
        </filterchain>
    </copy>

.servername.template 文件包含此字符串:

@SERVER_NAME@

然后,我使用 Web 服务来获取JSON 字符串告诉我所处的环境。我使用该任务来处理 JSON 并获取环境。

对于如此简单的任务来说,相当繁重,但它确实有效!

I figured this out.

Step 1.

Get the host name:

<target name="getHostname" description="Stores the current machines hostname in a property named 'hostname'">
    <property environment="env" />
    <condition property="hostname" value="${env.HOSTNAME}">
        <os family="unix" />
    </condition>

    <!-- Execute hostname command on Linux systems -->
    <exec executable="hostname"
          osfamily="unix"
          failifexecutionfails="false"
          outputproperty="env.COMPUTERNAME"/>

    <!-- On Windows, the hostname is an environment variable -->
    <condition property="hostname" value="${env.COMPUTERNAME}">
        <os family="windows" />
    </condition>

    <echo message="${env.COMPUTERNAME}" />

</target>

Step two, create a template file and use to copy the file and do a find/replace on it:

    <copy file="${scripts}/.servername.template"
          tofile="${scripts}/.servername">
        <filterchain>
            <replacetokens>
                <token key="SERVER_NAME"
                       value="${env.COMPUTERNAME}" />
            </replacetokens>
        </filterchain>
    </copy>

The .servername.template file contains this string:

@SERVER_NAME@

Then, I use a web service to get a JSON string to tell me what environment I'm in. And I use the task to process the JSON and get the environment.

Pretty heavy-duty for such a simple task, but it works!

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文