It is possible to combine the configuration features that you use in your deployments. One scenario where this is useful is if you need to provide environment specific configuration that includes sensitive values.
This can be achieved using both the Substitute Variables in Templates feature and the .NET Configuration Transforms features.
One transform and variable replacement
For example, let’s assume we have a web application that’s being deployed to Development, Staging, and Production environments, and you want to change your Web file to reflect environment-specific values.
To achieve this you would have a single configuration transformation file in your project. If it’s named Web, the transformation will be applied to your Web file automatically, however you can have your own filename and apply it to any config file you like.
This transform file can contain #{variable} values. Because your config will only get transformed on deployment, you can safely work with your Web file during development, and you can keep sensitive variables like production passwords out of source control.
The process
It’s important to note that variable substitution occurs before the configuration transformation. This means you need to target your transform files for variable substitution by adding them to the Target files setting.
For example, let’s assume our Web file has a MyDatabaseConnection connection string and a special MyCustomSettingsSection element. Something like this:
<?xml version="1.0"?>
<configuration>
<connectionStrings>
<add name="MyDatabaseConnection" connectionString="Server=(local)\SQLExpress;Database=OctoFX;Trusted_connection=SSPI"/>
</connectionStrings>
<MyCustomSettingsSection>
<TestMode>True</TestMode>
</MyCustomSettingsSection>
</configuration>We also have a Web transform file with the following contents:
<?xml version="1.0"?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
<connectionStrings>
<add name="MyDatabaseConnection" connectionString="#{OctoFXDatabase}" xdt:Transform="SetAttributes" xdt:Locator="Match(name)"/>
</connectionStrings>
<MyCustomSettingsSection>
<TestMode xdt:Transform="Replace">#{RunTestMode}</TestMode>
</MyCustomSettingsSection>
</configuration>Finally, we have the following variables configured in Octopus:
| Name | Value | Scope |
|---|---|---|
| OctoFXDatabase | server=staging-server;Database=OctoFX;Trusted_connection=SSPI | Staging |
| OctoFXDatabase | server=(local)\SQLEXPRESS;Database=OctoFX-Development;Trusted_connection=SSPI | Development |
| OctoFXDatabase | server=prod-server;Database=OctoFx;Trusted_connection=SSPI | Production |
| RunTestMode | False | Production, Staging |
| RunTestMode | True | Development |
On deployment to your Staging environment, your process would go like this:
- Your package, complete with your original
Weband your.Config Webtransform file, will be extracted to the target..Release .Config - Variable Substitution will run against your
Webfile (assuming it’s been listed in the Target files setting). This will change the.Release .Config #{OctoFXDatabase}string to the Staging connection string, and will insertFalseinto theTestModeelement. - Then, the .NET configuration transformation feature will run and apply this new transform file to your
Web..Config
The end result is a correctly transformed configuration for your staging environment. All without a specific Staging transform file, and while keeping your Web file clean for development.
Help us continuously improve
Please let us know if you have any feedback about this page.
Page updated on Sunday, January 1, 2023