Upgrade to Pro — share decks privately, control downloads, hide ads and more …

ぼくの考えた割と普通(c)なデプロイ戦略

 ぼくの考えた割と普通(c)なデプロイ戦略

こみゅぷらすで話したMSBuild, MSDeploy のお話。

227313c3533b7f887e1eccb63a291b23?s=128

tanaka_733

July 27, 2013
Tweet

More Decks by tanaka_733

Other Decks in Technology

Transcript

  1. ぼくの考えた 割と普通©な デプロイ戦略 とある企業でのMSBuild, MSDeploy のユースケース 2013/07/27 @tanaka_733

  2. 自己紹介 @tanaka_733  最近C# になったソーシャルゲームの会社「グラニ」に勤務  Windows Serverなインフラなお話もいつかしたいですね  Microsoft

    MVP for Visual C# になりました (2013.7-)  とはいえ、業務経験的には Java >> Ruby > C#  めとべや東京  ブログ「銀の光と碧い空」  http://techblog.hilife-jp.info/  「コードから触るIIS8」という連載、Build Insiderで始めました  http://www.buildinsider.net/web/iis8  お仕事はインフラ担当  Windows Server2012/IIS8/ARRv3/ASP.NET MVC 4 な環境  AWS上で、RDSとかもろもろ使ってます
  3. そんな企業でのデプロイ事情  1日数回デプロイすることもある  ×デプロイ担当がデプロイ、◦開発者はみんなデプロイできる  開発者がgit push したらお仕事終わり!ではない 

    ASP.NET なので当然ビルドしたものを配布する  PHPやRubyならリポジトリにあるソース配布=> (bundle ほげもげ) ですけど  LB (Load Balancer)配下に3桁ほどのサーバーたち  グループに分けて、1グループずつLBから外してアップデート (ローリングアップデート方式)
  4. というわけで今日のテーマ  MSBuild や MSDeploy を現場でどう使って居るか  MSDNにリファレンスはあるものの  どう使いこなすかはあまり見当たらない

     そのあたりの情報を共有したい  おことわり  これがベストプラクティスだとは思っていません  現状でも改善したいところあるし  つっこみ歓迎
  5. ビルド~デプロイの流れ Git コミット 開発者 CI Server Deploy Server ソース取得 タグつけ

    パッケージ取得 デプロイ
  6. MSBuildでやっていること  GitのコミットハッシュをDLLに埋め込む  CIでビルドすると環境変数でコミットハッシュが渡されるので、 それをDLLに埋め込む処理をビルド前に行う  ターゲットは Package を指定

     後述するWeb配置ツール(MSDeploy)で 配布元となる圧縮ファイルを作成してくれる  Batファイルも作ってくれるので、 単体のデプロイはそこからも可能  Visual Studioからは「Webのパッケージ化/発行」で設定  デバッグシンボルを含めるか、などの設定が可能
  7. MSBuild /p の指定  ASP.NET MVC 4なのでViewもビルドしよう  Viewまで静的型チェックできるなんてC#すばらし 

    MvcBuildViews=true  デフォルトのcsprojですでに作られている  Viewをプリコンパイルしておきましょう  PrecompileBeforePublish=true  接続先、ログ設定などはビルド構成をわけて設定  Configuration=Release  Web.config変換を使用  Deploy先のWebサイトの名前を指定  MSDeploy時に変更することも可能  DeployIisPath=Deploy
  8. MvcBuildViewsで MachineToApplicationとかいう エラーが出た時は…  こんなエラーが出ることがあります  allowDefinition='MachineToApplication' として登録されているセクション を使うことはできません。 

    csproj のMvcBuildViews のところにToolPathを指定しましょう <Target Name="MvcBuildViews" AfterTargets="AfterBuild" Condition="'$(MvcBuildViews)'=='true'"> <AspNetCompiler ToolPath=“C:¥Windows¥Microsoft.NET¥Framework¥v4.0.30319” VirtualPath="temp" PhysicalPath="$(WebProjectOutputDir)" /> </Target>
  9. 軽くデモ  MVCApplication をMSBuild  >C:¥WINDOWS¥Microsoft.NET¥Framework64¥v4.0.30319¥MSBuild.exe MvcApplication4¥MvcApplication4.csproj /m /p:Configuration=Release,MvcBuildView=true,PrecompileBeforePubl ish=true

    /t:Clean,Package
  10. MSDeploy によるデプロイ  あらかじめDeploy対象のサーバーにはWeb配置ツールをインストール  {Project}.Deploy.cmd というバッチファイルを実行すると デプロイできます  Deploy先のComputer名、管理者権限のユーザーとパスワードを指定

     実体は MSDeployコマンドを実行 >"C:¥Program Files¥IIS¥Microsoft Web Deploy V3¥msdeploy.exe" -verb:sync -source:Package='C:¥temp¥MvcApplication4.zip' -dest:auto,computerName="http://bu ildinsider2.cloudapp.net/MSDeployAgentService",userName="tanaka733",password=“Password", includeAcls="False" -disableLink:AppPoolExtension -disableLink:ContentE xtension -disableLink:CertificateExtension -setParamFile:"C:¥temp¥MvcApplication 4.SetParameters.xml"
  11. Deploy Tool  1台Deployするだけならコマンドラインでも苦じゃないものの  グループにわけてDeployするとなるとめんどい  LB関連の作業もあるし  じゃあGUIから操作できるようにしよう

     WPF製Deploy Tool  MSDeploy はコマンドライン経由ではなく、 DLL参照してC#コードで記述  ブログ記事: http://techblog.hilife-jp.info/2013/07/msdeploy-from-csharp/  LB関連操作他はRunspace経由でPowerShellから実行  単純なScriptではなく、弊社エンジニアによるライブラリを使用
  12. 万一ロールバックしたいときは…  MSDeployというかWeb配置ツールに 指定した世代だけバックアップする仕組みあります  でも、デフォルトの挙動がデプロイ時の時刻で名前付け  複数台のサーバーがあると時刻がずれる  もしかすると想定している使い方ではないのかもしれない…

     リリースビルドごとにgitのタグをつけて、 ロールバック時はロールバックしたいタグを指定して デプロイし直し
  13. まとめ  MSBuild でパッケージングして、MSDeployで配布  MSDeployはコマンドライン、PowerShell、DLL参照のいずれでも 実行できる  リファレンスとしての情報はあるけど、 この方法でいいのか?的な悩みは尽きない…

     というわけで、勉強会とかあるといいなあと。  興味のある方はぜひ一緒に