背景
ASP.NET で作ったサイトを Web Deploy パッケージを作成し、
バッチファイルによる展開をしている環境で、発行(デプロイ)時に値を設定したくなることがあると思います。
特によくあるのが次の2つのケースです
- パスワードを含むデータベース接続文字列・マシン鍵などはソースコード管理に入れたくない
- 一時的にIPアドレス制限をかけたい
この時役に立つ方法が
Web 配置パッケージで Web 配置パラメーターを使用する
です。
環境によって異なる値を設定する2つの方法
ビルド時に設定する Web.*.config
VisualStudio2013で ASP.NET MVC プロジェクトを作成すると
Web.config と一緒に Web.Debug.config , Web.Release.config の2つのファイルが生成されます。
どちらも Web.config に対する値変更を指示する XSLT ファイルです。
- Web.Debug.config は Debugビルドの時にのみ適用される
- Web.Release.config は Releaseビルドの時にのみ適用される
本番環境用のデータベース接続文字列を Web.Release.config に記述すれば、
環境による違いを吸収して自動化することができます。
デプロイ時に設定する SetParameters.xml
Web Deploy パッケージの作成をすると、5つのファイルが生成されます。
このうち SetParameters.xml にある値がデプロイ時に上書きされます。
すなわちここにパスワードを記述すれば、
本番環境のデプロイ担当者だけが、パスワードにアクセス可能で、
ビルド環境を触る開発者やソースコードリポジトリにパスワードを曝さなくて済むようになりました。
イヤッホウ!
Parameters.xml でデプロイ時に設定する対象を追加する
接続文字列についてはVisualStudioが自動的に判定して設定可能にしてくれますが、
それ以外の値を設定可能にするには Parameters.xml を ASP.NET プロジェクトの最上位フォルダ(Web.configの隣)に配置します。
例えば ipSecurity を Web.config に記述したとして、その allowUnlisted 属性の値を変更したいのであれば、
以下のようになります。
<?xml version="1.0" encoding="utf-8"?>
<configuration>
......
<system.webServer>
<security>
<ipSecurity allowUnlisted="false">
<add ipAddress="127.0.0.1" allowed="true" />
</ipSecurity>
</security>
</system.webServer>
......
```
````Parameters.xml
<?xml version="1.0" encoding="utf-8"?>
<parameters>
<parameter name="/configuration/system.webServer/security/ipSecurity/allowUnlisted" description="IPアドレス制限">
<parameterEntry kind="XmlFile"
defaultValue="false"
scope="\\Web.config$"
match="/configuration/system.webServer/security/ipSecurity/@allowUnlisted" />
</parameter>
</parameters>
```
ここで、WebDeplay パッケージの作成をすると、 Setparameters.xml に行が増えます
![QS_20141204-113615.png](https://qiita-image-store.s3.amazonaws.com/0/61535/4e76c0a7-4364-0b5b-200f-a191dd56a731.png)
WebDeploy パッケージのバッチファイルを利用してデプロイ実行すると
![QS_20141204-113704.png](https://qiita-image-store.s3.amazonaws.com/0/61535/4b322c2b-dc3f-dab1-8757-28547ff90439.png)
IISアプリケーションとして展開された先の Web.config の値が書き換わりました!
![QS_20141204-113734.png](https://qiita-image-store.s3.amazonaws.com/0/61535/fda30405-533f-e9f6-fb7a-ceffd6fc92ea.png)
## 最後に
この機能については、日本語の記事に全く当たらず、
pubxml ファイルに何か書けばいけるのではないか?など長らく悩んだ過去がありました。
CI、自動ビルドの結果を WebDeployパッケージの形で管理しているような環境であれば
役に立つのではないかと思います。