다음을 통해 공유


“가상 시나리오” 배포 수행

작성자 : Jason Lee

이 항목에서는 IIS(인터넷 정보 서비스) 웹 배포 도구(웹 배포) 및 VSDBCMD를 사용하여 "what if"(또는 시뮬레이션된) 배포를 수행하는 방법에 대해 설명합니다. 이렇게 하면 애플리케이션을 실제로 배포하기 전에 배포 논리가 특정 대상 환경에 미치는 영향을 확인할 수 있습니다.

이 항목은 Fabrikam, Inc.라는 가상 회사의 엔터프라이즈 배포 요구 사항을 기반으로 하는 일련의 자습서의 일부를 구성합니다. 이 자습서 시리즈에서는 샘플 솔루션인 Contact Manager 솔루션을 사용하여 ASP.NET MVC 3 애플리케이션, WCF(Windows Communication Foundation) 서비스 및 데이터베이스 프로젝트를 포함하여 현실적인 수준의 복잡성을 가진 웹 애플리케이션을 나타냅니다.

이 자습서의 핵심인 배포 방법은 프로젝트 파일 이해에 설명된 분할 프로젝트 파일 접근 방식을 기반으로 합니다. 이 방법은 빌드 및 배포 프로세스가 모든 대상 환경에 적용되는 빌드 지침이 포함된 프로젝트 파일과 환경별 빌드 및 배포 설정을 포함하는 두 개의 프로젝트 파일에 의해 제어됩니다. 빌드 시 환경별 프로젝트 파일이 환경에 구애받지 않은 프로젝트 파일로 병합되어 전체 빌드 지침 집합을 형성합니다.

웹 패키지에 대한 "What If" 배포 수행

웹 배포에는 "what if" (또는 평가판) 모드에서 배포를 수행할 수 있는 기능이 포함되어 있습니다. "what if" 모드에서 아티팩트 배포 시 Web Deploy는 배포를 수행한 것처럼 로그 파일을 생성하지만 실제로 대상 서버에서 아무것도 변경되지 않습니다. 로그 파일을 검토하면 배포가 대상 서버에 미치는 영향을 이해하는 데 도움이 될 수 있습니다. 특히 다음을 수행합니다.

  • 추가되는 항목입니다.
  • 업데이트할 내용입니다.
  • 삭제되는 항목입니다.

"what if" 배포는 실제로 대상 서버에서 아무것도 변경하지 않으므로 항상 수행할 수 없는 작업은 배포가 성공할지 여부를 예측하는 것입니다.

웹 패키지 배포에 설명된 대로 MSDeploy.exe 명령줄 유틸리티를 직접 사용하거나 빌드 프로세스에서 생성하는 .deploy.cmd 파일을 실행하여 두 가지 방법으로 웹 배포를 사용하여 웹 패키지를 배포할 수 있습니다.

MSDeploy.exe 직접 사용하는 경우 명령에 –whatif 플래그를 추가하여 "what if" 배포를 실행할 수 있습니다. 예를 들어 스테이징 환경에 ContactManager.Mvc.zip 패키지를 배포한 경우 어떤 일이 발생하는지 평가하려면 MSDeploy 명령은 다음과 유사해야 합니다. 다음 예제에서는 $CREDENTIAL_PLACEHOLDER$를 암호 키-값 쌍의 자리 표시자로 사용합니다.

MSDeploy.exe
  -whatif
  -source:package="[path]\ContactManager.Mvc.zip"
  -dest:auto,
        computerName="https://stageweb1:8172/MSDeploy.axd?site=DemoSite",
        username="FABRIKAM\stagingdeployer",
        password=$CREDENTIAL_PLACEHOLDER$,
        authtype="Basic",
        includeAcls="False"
  -verb:sync
  -disableLink:AppPoolExtension
  -disableLink:ContentExtension
  -disableLink:CertificateExtension
  -setParamFile:"[path]\ContactManager.Mvc.SetParameters.xml"
  -allowUntrusted

"what if" 배포의 결과에 만족하는 경우 –whatif 플래그를 제거하여 라이브 배포를 실행할 수 있습니다.

참고

MSDeploy.exe 대한 명령줄 옵션에 대한 자세한 내용은 웹 배포 작업 설정을 참조하세요.

.deploy.cmd 파일을 사용하는 경우 명령에 /y 플래그("예" 또는 업데이트 모드) 대신 /t 플래그(평가판 모드) 플래그를 포함하여 "what if" 배포를 실행할 수 있습니다. 예를 들어 .deploy.cmd 파일을 실행하여 ContactManager.Mvc.zip 패키지를 배포한 경우 어떤 일이 발생하는지 평가하려면 명령이 다음과 유사해야 합니다.

ContactManager.Mvc.deploy.cmd /t /m:TESTWEB1 /a:NTLM

"평가판 모드" 배포의 결과에 만족하는 경우 /t 플래그를 /y 플래그로 바꿔 라이브 배포를 실행할 수 있습니다.

ContactManager.Mvc.deploy.cmd /y /m:TESTWEB1 /a:NTLM

참고

.deploy.cmd 파일의 명령줄 옵션에 대한 자세한 내용은 방법: deploy.cmd 파일을 사용하여 배포 패키지 설치를 참조하세요. 플래그를 지정하지 않고 .deploy.cmd 파일을 실행하면 명령 프롬프트에 사용 가능한 플래그 목록이 표시됩니다.

데이터베이스에 대한 "What If" 배포 수행

이 섹션에서는 VSDBCMD 유틸리티를 사용하여 증분 스키마 기반 데이터베이스 배포를 수행한다고 가정합니다. 이 방법은 데이터베이스 프로젝트 배포에 자세히 설명되어 있습니다. 여기에 설명된 개념을 적용하기 전에 이 항목을 숙지하는 것이 좋습니다.

배포 모드에서 VSDBCMD를 사용하는 경우 /dd(또는 /DeployToDatabase) 플래그를 사용하여 VSDBCMD가 실제로 데이터베이스를 배포하는지 아니면 배포 스크립트를 생성하는지 제어할 수 있습니다. .dbschema 파일을 배포하는 경우 동작은 다음과 같습니다.

  • /dd+ 또는 /dd를 지정하는 경우 VSDBCMD는 배포 스크립트를 생성하고 데이터베이스를 배포합니다.
  • /dd-를 지정하거나 스위치를 생략하면 VSDBCMD는 배포 스크립트만 생성합니다.

참고

.dbschema 파일이 아닌 .deploymanifest 파일을 배포하는 경우 /dd 스위치의 동작은 훨씬 더 복잡합니다. 기본적으로 VSDBCMD는 .deploymanifest 파일에 값이 TrueDeployToDatabase 요소가 포함된 경우 /dd 스위치의 값을 무시합니다. 데이터베이스 프로젝트 배포에서는 이 동작을 전체적으로 설명합니다.

예를 들어 실제로 데이터베이스를 배포하지 않고 ContactManager 데이터베이스에 대한 배포 스크립트를 생성하려면 VSDBCMD 명령이 다음과 유사해야 합니다.

vsdbcmd.exe /a:Deploy
            /manifest:"…\ContactManager.Database.deploymanifest"
            /cs:"Data Source=TESTDB1;Integrated Security=true"
            /p:TargetDatabase=ContactManager
            /dd-
            /script:"…\Publish-ContactManager-Db.sql"

VSDBCMD는 차등 데이터베이스 배포 도구이므로 현재 데이터베이스(있는 경우)를 지정된 스키마로 업데이트하는 데 필요한 모든 SQL 명령을 포함하도록 배포 스크립트가 동적으로 생성됩니다. 배포 스크립트를 검토하는 것은 배포가 현재 데이터베이스 및 포함된 데이터에 미칠 영향을 결정하는 유용한 방법입니다. 예를 들어 다음을 확인할 수 있습니다.

  • 기존 테이블을 제거할지 여부와 이로 인해 데이터가 손실될지 여부입니다.
  • 작업 순서가 데이터 손실의 위험을 수반하는지 여부(예: 테이블을 분할하거나 병합하는 경우).

배포 스크립트에 만족하는 경우 /dd+ 플래그를 사용하여 VSDBCMD를 반복하여 변경할 수 있습니다. 또는 요구 사항을 충족하도록 배포 스크립트를 편집한 다음 데이터베이스 서버에서 수동으로 실행할 수 있습니다.

사용자 지정 프로젝트 파일에 "What If" 기능 통합

더 복잡한 배포 시나리오에서는 프로젝트 파일 이해에 설명된 대로 MSBuild(사용자 지정 Microsoft Build Engine) 프로젝트 파일을 사용하여 빌드 및 배포 논리를 캡슐화하려고 합니다. 예를 들어 Contact Manager 샘플 솔루션에서 Publish.proj 파일은 다음과 같습니다.

  • 솔루션을 빌드합니다.
  • 웹 배포를 사용하여 ContactManager.Mvc 애플리케이션을 패키지하고 배포합니다.
  • 웹 배포를 사용하여 ContactManager.Service 애플리케이션을 패키지하고 배포합니다.
  • ContactManager 데이터베이스를 배포합니다.

이러한 방식으로 여러 웹 패키지 및/또는 데이터베이스의 배포를 단일 단계 프로세스에 통합하는 경우 전체 배포를 "what if" 모드로 수행하는 옵션을 원할 수도 있습니다.

Publish.proj 파일은 이 작업을 수행하는 방법을 보여 줍니다. 먼저 "what if" 값을 저장할 속성을 만들어야 합니다.

<PropertyGroup>
  <WhatIf Condition=" '$(WhatIf)'=='' ">false</WhatIf>
</PropertyGroup>

이 경우 기본값이 falseWhatIf라는 속성을 만들었습니다. 사용자는 명령줄 매개 변수에서 속성을 true 로 설정하여 이 값을 재정의할 수 있습니다.

다음 단계는 플래그가 WhatIf 속성 값을 반영하도록 웹 배포 및 VSDBCMD 명령을 매개 변수화하는 것입니다. 예를 들어 Publish.proj 파일에서 가져온 다음 대상은 .deploy.cmd 파일을 실행하여 웹 패키지를 배포합니다. 기본적으로 명령에는 /Y 스위치("예" 또는 업데이트 모드)가 포함됩니다. WhatIftrue로 설정된 경우 /T 스위치(평가판 또는 "what if" 모드)로 바뀝니다.

<Target Name="PublishWebPackages" Outputs="%(PublishPackages.Identity)">
  <PropertyGroup>
    <_WhatIfSwitch>/Y</_WhatIfSwitch>
    <_WhatIfSwitch Condition=" '$(WhatIf)'=='true' ">/T</_WhatIfSwitch>
    <_Cmd>%(PublishPackages.FullPath) $(_WhatifSwitch)  
         /M:$(MSDeployComputerName) 
         /U:$(MSDeployUsername) 
         /P:$(MSDeployPassword) 
         /A:$(MSDeployAuth) 
         %(PublishPackages.AdditionalMSDeployParameters)
    </_Cmd>
  </PropertyGroup>
  <Exec Command="$(_Cmd)"/>
</Target>

마찬가지로 다음 대상은 VSDBCMD 유틸리티를 사용하여 데이터베이스를 배포합니다. 기본적으로 /dd 스위치는 포함되지 않습니다. 즉, VSDBCMD는 배포 스크립트를 생성하지만 데이터베이스를 배포하지 않습니다. 즉, "what if" 시나리오입니다. WhatIf 속성이 true로 설정되지 않은 경우 /dd 스위치가 추가되고 VSDBCMD가 데이터베이스를 배포합니다.

<Target Name="PublishDbPackages" Outputs="%(DbPublishPackages.Identity)">
  <PropertyGroup>
    <_DbDeployOrScript></_DbDeployOrScript>
    <_DbDeployOrScript Condition=" '$(Whatif)'!='true' ">/dd</_DbDeployOrScript>
    <_Cmd>"$(VsdbCmdExe)" /a:Deploy 
           /cs:"%(DbPublishPackages.DatabaseConnectionString)" 
           /p:TargetDatabase=%(DbPublishPackages.TargetDatabase) 
           /manifest:"%(DbPublishPackages.FullPath)" 
           /script:"$(_CmDbScriptPath)" 
           $(_DbDeployOrScript)
    </_Cmd>
  </PropertyGroup>
  <Exec Command="$(_Cmd)"/>
</Target>

동일한 방법을 사용하여 프로젝트 파일의 모든 관련 명령을 매개 변수화할 수 있습니다. "what if" 배포를 실행하려는 경우 명령줄에서 WhatIf 속성 값을 간단히 제공할 수 있습니다.

MSBuild.exe Publish.proj /p:WhatIf=true;TargetEnvPropsFile=EnvConfig\Env-Dev.proj

이러한 방식으로 단일 단계에서 모든 프로젝트 구성 요소에 대해 "what if" 배포를 실행할 수 있습니다.

결론

이 항목에서는 웹 배포, VSDBCMD 및 MSBuild를 사용하여 "what if" 배포를 실행하는 방법을 설명했습니다. "what if" 배포를 사용하면 대상 환경을 실제로 변경하기 전에 제안된 배포의 영향을 평가할 수 있습니다.

추가 정보

웹 배포 명령줄 구문에 대한 자세한 내용은 웹 배포 작업 설정을 참조하세요. .deploy.cmd 파일을 사용하는 경우 명령줄 옵션에 대한 지침은 방법: deploy.cmd 파일을 사용하여 배포 패키지 설치를 참조하세요. VSDBCMD 명령줄 구문에 대한 지침은 VSDBCMD.EXE 대한 명령줄 참조(배포 및 스키마 가져오기)를 참조하세요.