티스토리 뷰

반응형

ASP.NET 웹사이트를 간편하게 서버에 배포할 때 Web Deploy (MS Deploy) 도구를 주로 사용합니다. 여기에서는 Web Deploy도구를 사용할 때 사용할 수 있는 배포 프로파일(Publish Profile)에 대해 살펴봅니다. VisualStudio 2019와 ASP.NET Core 웹사이트를 기준으로 작성되었습니다.

Publish Profile 생성

Visual Sutido에서 웹사이트 배포를 위해서는 Publish Profile(배포 프로파일)을 생성해야합니다. Solution Explorer에서 웹사이트를 마우스 우클릭 하신 후 Publish를 클릭하시면 Publish Profile을 생성하실 수 있는 창이 나타납니다.

Publish Profile 생성

배포대상과 배포위치, 인증정보 등 웹사이트 배포에 필요한 정보를 입력하시면 배포를 진행하게 되는데요. 한번 이 작업이 진행되면 .pubxml 확장자를 가진 Publish Profile이 프로젝트의 /Properties/PublishProfiles 폴더에 생성됩니다. 이 후로는 Visual Studio에서 Publish를 클릭하시면 이 파일을 선택할 수 있게되며, 배포를 간편히 진행할 수 있게됩니다.

생성된 .pubxml파일

보안에 대한 주의사항

프로젝트의 /Properties/PublishProfiles 폴더에 생성된 .pubxml 파일에는 배포를 편리하게 만들어주는 다양한 정보가 포함되어 있습니다. 이 파일에는 배포를 위해 서버 위치, 아이디, 비밀번호 등의 인증정보 외에도 DBMS 연결정보, 환경변수 등이 포함될 수 있습니다.

	<Project>
	  <PropertyGroup>
		<PublishProtocol>Kudu</PublishProtocol>
		<PublishSiteName>website</PublishSiteName>
		<!-- [주의] .pubxml 파일에는 민감한 정보가 포함될 수 있으므로 허가되지 않은 사람에게 유출되어서는 안됩니다 -->
		<UserName>myuserid</UserName>
		<Password>mypassword1234</Password>
	  </PropertyGroup>
	</Project>

따라서 이 파일은 GitHub 등의 Source Control로 전송되지 않도록 해야하며 허가되지 않은 다른 사람에게 유출되지 않게 해야합니다. 

배포하지 않을 파일설정

특정 파일이나 폴더가 배포되지 않게 제외 할 수 있습니다. 이러한 설정은 .pubxml 파일을 직접 편집하여 추가할 수 있습니다. 여기에서는 <Content />를 이용한 방법과 <MsDeploySkipRules />를 이용한 방법 두 가지를 간단히 소개합니다.

방법1: <Content />를 이용한 제외

<Content />를 사용하여 서버에 배포되지 않을 대상을 지정 할 수 있습니다. 만약 해당 파일이 이미 서버에 업로드되어 있다면, 서버에서 해당 파일이 삭제됩니다. <Project /> 하위에 <ItemGroup />를 추가하고 <Content />를 추가하시면 됩니다. 아래는 ClientApp 하위의 모든 .config 파일을 제외하는 예제입니다.

<Project>
    <!-- 배포에서 제외할 파일 (서버에 업로드되어 있는 파일도 삭제함)-->
    <ItemGroup>
      <Content Update="ClientApp/**/*.config" CopyToPublishDirectory="Never" />
    </ItemGroup>
</Project>

파일의 경로는 Grunt의 Gobbing Pattern을 사용하여 표현할 수 있습니다. "ClientApp/**/*.config"는 ClientApp의폴더와 하위 폴더의 모든 .config파일을 의미합니다.

방법2: <MsDeploySkipRules />를 이용한 제외

<Content /> 외에도 <MsDeploySkipRules />를 사용하여 제외 설정을 할 수 있습니다. 폴더를 제외하려면 <ObjectName/>에 dirPath를 입력하고, 파일을 제외하려면 filePath를 설정해주세요. 대상 경로는 <AbsolutePath/>에 입력합니다.

<Project>
	<ItemGroup>
		<!-- ClientApp\src 폴더를 배포에서 제외합니다 -->
		<MsDeploySkipRules Include="CustomSkipFolder">
			<ObjectName>dirPath</ObjectName>
			<AbsolutePath>ClientApp\\src</AbsolutePath>
		</MsDeploySkipRules>
	</ItemGroup>
</Project>

<MsDeploySkipRules />는 <Content />와 달리 이미 서버에 업로드된 파일은 삭제하지 않습니다.

<Project>
	<ItemGroup>
		<!-- env.develop 파일은 배포되지 않음. 또한 서버에서 env.develop 파일이 삭제됨 -->
		<Content Update="ClientApp/env.develop" CopyToPublishDirectory="Never" />

		<!-- env.test 파일은 배포되지 않음. 이미 서버에 업로드된 env.test파일은 삭제하지 않음-->
		<MsDeploySkipRules Include="CustomSkipFolder">
			<ObjectName>filePath</ObjectName>
			<AbsolutePath>ClientApp/env.test</AbsolutePath>
		</MsDeploySkipRules>
	</ItemGroup>
</Project>

배포에 포함될 파일설정

WebDeploy는 기본적으로 프로젝트에 포함된 파일만 배포 합니다. 프로젝트 외부에 존재하거나 프로젝트에 포함되지 않는 파일은 배포에 포함되지 않습니다. 이 경우 <Content /> 또는 <ResolvedFileToPublish />를 사용하여 배포 대상에 포함 할 수 있습니다.

방법1: <Content />를 통한 배포대상 추가

특정 파일이나 폴더를 배포하기 위해 <Content Include="대상경로" />를 사용할 수 있습니다. 아래 예제는 /ClientApp/dist 폴더를 배포대상에 포함합니다.

<Project>
	...
	<!-- 배포에서 제외할 파일 (서버에 업로드되어 있는 파일도 삭제함)-->
	<ItemGroup>
	  <Content Include="ClientApp\dist\**\*" />
	</ItemGroup>
</Project>

방법2: <ResolvedFileToPublish />를 통한 배포대상 추가

<ResolvedFileToPublish />를 사용하면 특정 경로의 파일을 지정한 위치에 배포되도록 할 수 있습니다. 아래 예제는 프로젝트 외부에 존재하는 ReadMe.md 파일을 ClientApp\dist\ReadMe.md 위치에 배포되도록 합니다.

<Project>
    <ItemGroup>
        <ResolvedFileToPublish Include="..\ReadMe.md">
            <RelativePath>ClientApp\dist\ReadMe.md</RelativePath>
        </ResolvedFileToPublish>
    </ItemGroup>
</Project>

배포 전후로 실행

배포 시작 전이나 배포 후에 특정한 동작을 수행해야할 때가 있습니다. ASP.NET Core프로젝트에서는 BeforePublishAfterPublish를 통해 명령을 실행할 수 있습니다. 반면에 .NET Framework 기반 ASP.NET 프로젝트는 이 기능들을 지원하지 않기 때문에 MSBuild.Extension.Pack 패키지 설치를 통해 명령을 실행해야합니다.

ASP.NET Core 프로젝트의 경우

BeforePublishAfterPublish 내부에 <Message />를 사용하여 콘솔에 필요한 메시지를 내보낼 수 있습니다. 또한 <Exec />를 통해 파일을 실행할 수 있습니다. 아래 코드는 배포를 시작하기 전에 지정된 Message를 콘솔에 출력합니다. 배포가 종료된 후에는 echo 명령을 통해 afterPublish.txt 파일을 프로젝트 루트에 생성합니다.

<Project>
	<Target Name="custom before publish" BeforeTargets="BeforePublish">
		<Message Text="Message - BeforePublish" Importance="high" />
	</Target>
	<Target Name="custom after publish" AfterTargets="AfterPublish">
		<Exec Command="echo &quot;publish completed&quot; >> afterPublish.txt" />
	</Target>
</Project>

ASP.NET (.NET Framework) 프로젝트의 경우

.NET Framework 기반 ASP.NET 프로젝트의 경우 MSBuild.Extension.Pack 패키지를 통해 빌드 전이나 이후에 필요한 명령을 실행할 수 있습니다.

  1. 먼저 Nuget Package Manager를 통해 MSBuild.Extension.Pack를 설치해주세요.
    PM> Install-Package MSBuild.Extension.Pack -Version 1.9.1
  2. .pubxml 파일에 아래와 같은 코드를 추가해주세요. GatherAllFilesToPublish는 배포 시작 전에 실행됩니다. 배포 종료 후에 실행하고자 할 때에는 조금 더 복잡합니다. 배포 종료 시점에 실행을 지원하지 않기 때문에 직접 이를 구현해야합니다. 예를들어 PowerShell 스크립트를 작성하여 프로젝트의 bin 폴더에 생성된 파일의 날짜를 유추하여 배포가 종료되었다고 판단되었을 때 특정 명령을 실행하는 방법도 있고, 100초 대기 후 명령을 실행하는 간단한 방법도 있습니다.
    			<Project>
    				<!-- GatherAllFilesToPublish는 배포 전에 실행됨. 아래는 100초간 대기하여 배포가 종료되었을 때 명령을 실행하는 예제 -->
    				<Target Name="before publsih" AfterTargets="GatherAllFilesToPublish">
    					<AsyncExec Command="powershell.exe sleep 100;powershell.exe echo &quot;publish completed&quot; >> afterPublish.txt"></AsyncExec>
    				</Target>
    			</Project>
    			

'Web > ASP.NET Core' 카테고리의 다른 글

ASP.NET Core에 Vue앱 추가하기  (0) 2023.11.15
Application State vs 전역 Static 변수  (0) 2019.08.19
ASP.NET Core Identity 에러 지역화  (0) 2019.04.08
댓글