0

在我的公司有一个应用程序存储库,我们希望将其部署到多个客户端。每个客户端都有不同的应用程序配置值 ( appsettings.json ),并且此设置可能会随着客户端的不同而改变。这就是为什么我们为每个客户端创建不同的 git 分支以执行 CICD。每个客户端服务器(本地)中都有多个 TeamCity 服务器,它们正在侦听其 git 分支以进行更改。我们担心的是这些客户数量会增长。git 分支的数量也会增加,我们不希望这种情况发生。

注意:每个客户端都有自己的登台和生产环境。所以我们将分支名称创建为“clientA-staging”、“clientA-production”、“clientB-staging”、“clientB-production”。我们这样做的另一个原因是,如果客户端配置发生变化。我们只想将此更改部署到该客户端。

有什么方法可以改善这一点吗?我们想要达到的目标是:-

  1. 将暂存和生产 git 分支的数量减少并保持为仅两个分支。
  2. 仅在特定客户端发生配置更改时才部署到特定客户端。
4

2 回答 2

0

我们遇到了与您相同的问题,每个客户只有一个分支机构,但随着我们的客户群开始增长,事实证明这真的很痛苦。我们最终做的是为所有客户(开发、登台、产品)建立一个分支,并创建一个appsettings.json层次结构:

appsettings.json                * config for all customers
  appsettings.Development.json  * config for all customers, for dev environment
  appsettings.Production.json   * config for all customers, for prod environment
  appsettings.client.json       * dummy file, just to have a proper hierarchy in VS
     appsettings.client.Customer1.json
        appsettings.client.Customer1.Development.json
        appsettings.client.Customer1.Production.json
     appsettings.client.Customer2.json
        appsettings.client.Customer2.Development.json
        appsettings.client.Customer2.Production.json

为了为每个客户加载正确的 appsettings,我们使用了一个环境变量,称为(ASPNETCORE_CustomerName任何前缀ASPNETCORE_Program.cs

public static class Program
{
    public static void Main(string[] args)
    {
        CreateHostBuilder(args).Build().Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args)
    {
        return Host
            .CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.ConfigureAppConfiguration((hostingContext, config) =>
                {
                    var env = hostingContext.HostingEnvironment;

                    // read the customer name from the env variable
                    // (note that the ASPNETCORE_ prefix is removed)
                    var customer = hostingContext.Configuration.GetValue<string>("CustomerName");

                    // only add our custom hierarchy, 
                    // the default json files are already loaded
                    config
                        .AddJsonFile($"appsettings.client.{customer}.json", optional: true, reloadOnChange: true)
                        .AddJsonFile($"appsettings.client.{customer}.{env.EnvironmentName}.json", optional: true, reloadOnChange: true)
                        .AddEnvironmentVariables()
                        ;
                })
                .UseStaticWebAssets()
                .UseStartup<Startup>();
            });
    }
}

最后,我们每个客户都有一个 CI/CD 管道,每个客户 Web 应用程序ASPNETCORE_CustomerName通过 Azure 门户设置自己的变量。

于 2021-06-22T08:05:42.597 回答
0

我已经通过在 TeamCity 中设置评论过滤器(git commit message)来解决这个问题。通过使用例如“[clientA]”配置过滤器,部署只会在 git 评论与过滤器匹配时触发。在这种情况下,它只会部署到客户端 A。

于 2021-06-24T11:26:32.280 回答