如何在发布管道中更改Appsettings和Config信息

时间:2020-11-10 20:56:38

标签: c# visual-studio azure-devops devops

我对于通过Azure DevOps实施CI / CD还是相当陌生,我不确定如何解决典型的情况。我发现有关文件转换的大多数文章都涉及IIS Deploy,但我目前正在使用.Net Framework控制台应用程序。

在我的控制台应用程序中,我们具有某些设置(通常是文件路径),这些设置会根据我们所处的环境(Dev,Stage,Prod)以及每个环境中的数据库连接字符串而有所不同。

向我展示了如何使用变量ex: __connectionstring__,该变量可以使用Tokenizer应用在Azure DevOps发布管道中进行设置和替换。但是,在我的开发环境中使用该变量无效。当我在Visual Studio中进行调试时,它仍然会看到上面的变量名,并且没有像令牌生成器之类的东西来在我的开发计算机上本地填充该变量。

有人可以为我提供一篇文章或示例,以一种很好的方式为我所处的每种环境提供特定的应用程序设置,使我仍然可以在本地调试,还可以更改ADO发布管道中的设置吗?

2 个答案:

答案 0 :(得分:1)

您可以使用任务File transform替换Azure DevOps发布管道中的某些设置。

在构建或发布管道中定义的变量将与任何配置文件和parameters.xml的appSettings,applicationSettings和connectionStrings部分中的“ key”或“ name”条目匹配。在配置转换后运行变量替换。

例如,您在下面的appsetting.json文件中。并且您想要将默认日志级别更改为“错误”。

{
  "Logging": {
    "IncludeScopes": false,
    "LogLevel": {
      "Default": "Warning"
    }
  }
}

1,首先,您需要在发布管道编辑页面的Logging.LogLevel.Default部分中定义一个发布变量Variables,并为其分配值Error。见下文

enter image description here

2,在发布管道中添加文件转换任务。 enter image description here

有关XML变量替换的更多信息,请查看here

也有第三方替换工具(即Magic Chunks / RegEx Find & Replace),可以非常方便地用来替换azure管道中的设置文件中的值。请查看this thread中的示例。

答案 1 :(得分:0)

要转换非Web应用程序的.config文件,我总是使用 SlowCheetah

它的工作原理类似于@EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override public void configure(WebSecurity web) { web.ignoring() .antMatchers("/css/**", "/js/**") .antMatchers("/public/healthcheck/status") .antMatchers("/app/rest/endpoint**");//this is one of the rest endpoint I was trying to protect via client credential flow, for now I have it bypass security or else it lives behind the oidc login } @Override protected void configure(HttpSecurity http) throws Exception { http .csrf().disable() .authorizeRequests(authorize -> authorize .antMatchers("/app/**").authenticated() ) .oauth2Login(oauth2 -> oauth2 .redirectionEndpoint(redirection -> redirection .baseUri("/login/oauth2/code/okta") ) ); } @Bean public ClientRegistrationRepository clientRegistrationRepository() { return new InMemoryClientRegistrationRepository(this.oktaClientRegistration()); } @Bean public OAuth2AuthorizedClientService authorizedClientService( ClientRegistrationRepository clientRegistrationRepository) { return new InMemoryOAuth2AuthorizedClientService(clientRegistrationRepository); } @Bean public OAuth2AuthorizedClientRepository authorizedClientRepository( OAuth2AuthorizedClientService authorizedClientService) { return new AuthenticatedPrincipalOAuth2AuthorizedClientRepository(authorizedClientService); } private ClientRegistration oktaClientRegistration() { return ClientRegistrations .fromIssuerLocation("https://company-dev.oktapreview.com") .clientId("xxxx") .clientSecret("yyyyy-cccc") .scope("openid", "email", "profile") .registrationId("okta") .clientName("myappname") .redirectUriTemplate("{baseUrl}/login/oauth2/code/okta").build(); } 转换,但适用于web.config