DSC를 사용하여 연속 통합 및 연속 배포 파이프라인 빌드Building a Continuous Integration and Continuous Deployment pipeline with DSC

이 예제에는 PowerShell, DSC, Pester 및 Visual Studio TFS(Team Foundation Server)를 사용하여 CI/CD(연속 통합/연속 배포) 파이프라인을 빌드하는 방법을 보여 줍니다.This example demonstrates how to build a Continuous Integration/Continuous Deployment (CI/CD) pipeline by using PowerShell, DSC, Pester, and Visual Studio Team Foundation Server (TFS).

빌드 및 구성한 파이프라인은 DNS 서버와 관련 호스트 레코드를 완전하게 배포, 구성 및 테스트하는 데 사용할 수 있습니다.After the pipeline is built and configured, you can use it to fully deploy, configure and test a DNS server and associated host records. 이 프로세스에서는 개발 환경에서 사용되는 파이프라인의 첫 부분을 시뮬레이션합니다.This process simulates the first part of a pipeline that would be used in a development environment.

자동화된 CI/CD 파이프라인을 사용하면 소프트웨어를 보다 안정적이며 빠르게 업데이트할 수 있으며, 모든 코드를 테스트하고 코드의 최신 빌드를 항상 제공할 수 있습니다.An automated CI/CD pipeline helps you update software faster and more reliably, ensuring that all code is tested, and that a current build of your code is available at all times.

필수 구성 요소Prerequisites

이 예제를 사용하려면 다음에 대해 잘 알고 있어야 합니다.To use this example, you should be familiar with the following:

필요한 사항What you will need

이 예제를 빌드하고 실행하려면 여러 컴퓨터 및/또는 가상 컴퓨터가 포함된 환경이 필요합니다.To build and run this example, you will need an environment with several computers and/or virtual machines.

ClientClient

예제를 설정하고 실행하는 모든 작업을 수행할 컴퓨터입니다.This is the computer where you'll do all of the work setting up and running the example.

클라이언트 컴퓨터는 다음 항목이 설치된 Windows 컴퓨터여야 합니다.The client computer must be a Windows computer with the following installed:

TFSSrv1TFSSrv1

빌드와 릴리스를 정의할 TFS 서버를 호스트하는 컴퓨터입니다.The computer that hosts the TFS server where you will define your build and release. 이 컴퓨터에는 Team Foundation Server 2017이 설치되어 있어야 합니다.This computer must have Team Foundation Server 2017 installed.

BuildAgentBuildAgent

프로젝트를 빌드하는 Windows 빌드 에이전트를 실행할 컴퓨터입니다.The computer that runs the Windows build agent that builds the project. 이 컴퓨터에는 빌드 에이전트가 설치되어 있으며 실행 중이어야 합니다.This computer must have a Windows build agent installed and running. Windows 빌드 에이전트를 설치하고 실행하는 방법에 대한 지침은 Windows에서 에이전트 배포를 참조하세요.See Deploy an agent on Windows for instructions on how to install and run a Windows build agent.

또한 이 컴퓨터에는 xDnsServerxNetworking DSC 모듈을 둘 다 설치해야 합니다.You also need to install both the xDnsServer and xNetworking DSC modules on this computer.

TestAgent1TestAgent1

이 예제에서 DSC 구성을 통해 DNS 서버로 구성하는 컴퓨터입니다.This is the computer that is configured as a DNS server by the DSC configuration in this example. 이 컴퓨터에서는 Windows Server 2016을 실행해야 합니다.The computer must be running Windows Server 2016.

TestAgent2TestAgent2

이 예제에서 구성하는 웹 사이트를 호스트하는 컴퓨터입니다.This is the computer that hosts the website this example configures. 이 컴퓨터에서는 Windows Server 2016을 실행해야 합니다.The computer must be running Windows Server 2016.

TFS에 코드 추가Add the code to TFS

먼저 TFS에서 Git 리포지토리를 만들고 클라이언트 컴퓨터의 로컬 리포지토리에서 코드를 가져옵니다.We'll start out by creating a Git repository in TFS, and importing the code from your local repository on the client computer. 클라이언트 컴퓨터에 Demo_CI 리포지토리를 아직 복제하지 않은 경우 다음 git 명령을 실행하여 지금 복제합니다.If you have not already cloned the Demo_CI repository to your client computer, do so now by running the following git command:

git clone https://github.com/PowerShell/Demo_CI

  1. 클라이언트 컴퓨터의 웹 브라우저에서 TFS 서버로 이동합니다.On your client computer, navigate to your TFS server in a web browser.

  2. TFS에서 Demo_CI라는 새 팀 프로젝트를 만듭니다.In TFS, Create a new team project named Demo_CI.

    버전 제어Git으로 설정되어 있는지 확인합니다.Make sure that Version control is set to Git.

  3. 클라이언트 컴퓨터에서 다음 명령을 사용하여 방금 TFS에서 만든 리포지토리에 remote를 추가합니다.On your client computer, add a remote to the repository you just created in TFS with the following command:

    git remote add tfs <YourTFSRepoURL>

    여기서 <YourTFSRepoURL>은 이전 단계에서 만든 TFS 리포지토리의 복제 URL입니다.Where <YourTFSRepoURL> is the clone URL to the TFS repository you created in the previous step.

    이 URL을 확인할 수 있는 위치를 모르는 경우 기존 Git 리포지토리 복제를 참조하세요.If you don't know where to find this URL, see Clone an existing Git repo.

  4. 다음 명령을 사용하여 로컬 리포지토리의 코드를 TFS 리포지토리로 푸시합니다.Push the code from your local repository to your TFS repository with the following command:

    git push tfs --all

  5. TFS 리포지토리에 Demo_CI 코드가 채워집니다.The TFS repository will be populated with the Demo_CI code.

참고

이 예제에서는 Git 리포지토리의 ci-cd-example 분기에 있는 코드를 사용합니다.This example uses the code in the ci-cd-example branch of the Git repo. TFS 프로젝트에서, 그리고 작성하는 CI/CD 트리거에 대해 이 분기를 기본 분기로 지정해야 합니다.Be sure to specify this branch as the default branch in your TFS project, and for the CI/CD triggers you create.

코드 파악Understanding the code

빌드 및 배포 파이프라인을 만들기 전에 몇 가지 코드를 확인하여 수행되는 작업을 파악해 보겠습니다.Before we create the build and deployment pipelines, let's look at some of the code to understand what is going on. 클라이언트 컴퓨터에서 자주 사용하는 텍스트 편집기를 열고 Demo_CI Git 리포지토리의 루트로 이동합니다.On your client computer, open your favorite text editor and navigate to the root of your Demo_CI Git repository.

DSC 구성The DSC configuration

로컬 Demo_CI 리포지토리의 루트에서 DNSServer.ps1 파일을 엽니다(./InfraDNS/Configs/DNSServer.ps1).Open the file DNSServer.ps1 (from the root of the local Demo_CI repository, ./InfraDNS/Configs/DNSServer.ps1).

이 파일에는 DNS 서버를 설정하는 DSC 구성이 포함되어 있습니다.This file contains the DSC configuration that sets up the DNS server. 전체 구성은 다음과 같습니다.Here it is in its entirety:

configuration DNSServer
{
    Import-DscResource -module 'xDnsServer','xNetworking', 'PSDesiredStateConfiguration'

    Node $AllNodes.Where{$_.Role -eq 'DNSServer'}.NodeName
    {
        WindowsFeature DNS
        {
            Ensure  = 'Present'
            Name    = 'DNS'
        }

        xDnsServerPrimaryZone $Node.zone
        {
            Ensure    = 'Present'
            Name      = $Node.Zone
            DependsOn = '[WindowsFeature]DNS'
        }

        foreach ($ARec in $Node.ARecords.keys) {
            xDnsRecord $ARec
            {
                Ensure    = 'Present'
                Name      = $ARec
                Zone      = $Node.Zone
                Type      = 'ARecord'
                Target    = $Node.ARecords[$ARec]
                DependsOn = '[WindowsFeature]DNS'
            }
        }

        foreach ($CName in $Node.CNameRecords.keys) {
            xDnsRecord $CName
            {
                Ensure    = 'Present'
                Name      = $CName
                Zone      = $Node.Zone
                Type      = 'CName'
                Target    = $Node.CNameRecords[$CName]
                DependsOn = '[WindowsFeature]DNS'
            }
        }
    }
}

아래의 Node 문을 살펴보세요.Notice the Node statement:

Node $AllNodes.Where{$_.Role -eq 'DNSServer'}.NodeName

이 문은 DevEnv.ps1 스크립트를 통해 작성되는 구성 데이터에서 역할이 DNSServer로 정의된 노드를 찾습니다.This finds any nodes that were defined as having a role of DNSServer in the configuration data, which is created by the DevEnv.ps1 script.

about_arraysWhere 메서드에 대해 자세히 알아볼 수 있습니다.You can read more about the Where method in about_arrays

CI 수행 시에는 구성 데이터를 사용하여 노드를 정의해야 합니다. 노드 정보는 환경 간에 변경될 가능성이 높은데, 구성 데이터를 사용하면 구성 코드를 변경하지 않고도 노드 정보를 쉽게 변경할 수 있기 때문입니다.Using configuration data to define nodes is important when doing CI because node information will likely change between environments, and using configuration data allows you to easily make changes to node information without changing the configuration code.

첫 번째 리소스 블록에서 구성은 WindowsFeature를 호출하여 DNS 기능이 사용하도록 설정되어 있는지 확인합니다.In the first resource block, the configuration calls the WindowsFeature to ensure that the DNS feature is enabled. 그 다음 리소스 블록은 xDnsServer 모듈의 리소스를 호출하여 주 영역 및 DNS 레코드를 구성합니다.The resource blocks that follow call resources from the xDnsServer module to configure the primary zone and DNS records.

xDnsRecord 블록은 구성 데이터의 배열에서 반복되는 foreach 루프에 래핑됩니다.Notice that the two xDnsRecord blocks are wrapped in foreach loops that iterate through arrays in the configuration data. 이 구성 데이터 역시 DevEnv.ps1 스크립트를 통해 작성됩니다. 다음으로는 구성 데이터에 대해 살펴보겠습니다.Again, the configuration data is created by the DevEnv.ps1 script, which we'll look at next.

구성 데이터Configuration data

로컬 Demo_CI 리포지토리의 DevEnv.ps1 파일(./InfraDNS/DevEnv.ps1)은 해시 테이블에서 환경별 구성 데이터를 지정한 다음 DscPipelineTools.psm(./Assets/DscPipelineTools/DscPipelineTools.psm1)에 정의된 New-DscConfigurationDataDocument 함수 호출로 해당 해시 테이블을 전달합니다.The DevEnv.ps1 file (from the root of the local Demo_CI repository, ./InfraDNS/DevEnv.ps1) specifies the environment-specific configuration data in a hashtable, and then passes that hashtable to a call to the New-DscConfigurationDataDocument function, which is defined in DscPipelineTools.psm (./Assets/DscPipelineTools/DscPipelineTools.psm1).

DevEnv.ps1 파일은 다음과 같습니다.The DevEnv.ps1 file:

param(
    [parameter(Mandatory=$true)]
    [string]
    $OutputPath
)

Import-Module $PSScriptRoot\..\Assets\DscPipelineTools\DscPipelineTools.psd1 -Force

# Define Unit Test Environment
$DevEnvironment = @{
    Name                        = 'DevEnv';
    Roles = @(
        @{  Role                = 'DNSServer';
            VMName              = 'TestAgent1';
            Zone                = 'Contoso.com';
            ARecords            = @{'TFSSrv1'= '10.0.0.10';'Client'='10.0.0.15';'BuildAgent'='10.0.0.30';'TestAgent1'='10.0.0.40';'TestAgent2'='10.0.0.50'};
            CNameRecords        = @{'DNS' = 'TestAgent1.contoso.com'};
        }
    )
}

Return New-DscConfigurationDataDocument -RawEnvData $DevEnvironment -OutputPath $OutputPath

\Assets\DscPipelineTools\DscPipelineTools.psm1에 정의된 New-DscConfigurationDataDocument 함수는 RawEnvDataOtherEnvData 매개 변수로 전달되는 해시 테이블(노드 데이터) 및 배열(비노드 데이터)에서 구성 데이터 문서를 프로그래밍 방식으로 작성합니다.The New-DscConfigurationDataDocument function (defined in \Assets\DscPipelineTools\DscPipelineTools.psm1) programmatically creates a configuration data document from the hashtable (node data) and array (non-node data) that are passed as the RawEnvData and OtherEnvData parameters.

이 예제에서는 RawEnvData 매개 변수만 사용합니다.In our case, only the RawEnvData parameter is used.

psake 빌드 스크립트The psake build script

Demo_CI 리포지토리 루트(./InfraDNS/Build.ps1)의 Build.ps1에 정의된 psake 빌드 스크립트는 빌드의 일부분인 작업을 정의합니다.The psake build script defined in Build.ps1 (from the root of the Demo_CI repository, ./InfraDNS/Build.ps1) defines tasks that are part of the build. 또한 각 작업이 사용하는 다른 작업도 정의합니다.It also defines which other tasks each task depends on. psake 스크립트는 호출 시 지정된 작업(작업이 지정되지 않은 경우 이름이 Default인 작업)이 실행되는지와 모든 종속성도 실행되는지를 확인합니다. 즉, 재귀적인 방식으로 종속성, 종속성의 종속성 등이 모두 실행되는지를 순차적으로 확인합니다.When invoked, the psake script ensures that the specified task (or the task named Default if none is specified) runs, and that all dependencies also run (this is recursive, so that dependencies of dependencies run, and so on).

이 예제에서 Default 작업은 다음과 같이 정의됩니다.In this example, the Default task is defined as:

Task Default -depends UnitTests

Default 작업 자체의 구현은 없으며 CompileConfigs 작업에 대한 종속성만 포함되어 있습니다.The Default task has no implementation itself, but has a dependency on the CompileConfigs task. 작업 종속성의 결과 체인은 빌드 스크립트의 모든 작업이 실행되는지 확인합니다.The resulting chain of task dependencies ensures that all tasks in the build script are run.

이 예제에서는 Demo_CI 리포지토리의 루트에 있는 Initiate.ps1 파일에서 Invoke-PSake를 호출하여 psake 스크립트를 호출합니다.In this example, the psake script is invoked by a call to Invoke-PSake in the Initiate.ps1 file (located at the root of the Demo_CI repository):

param(
    [parameter()]
    [ValidateSet('Build','Deploy')]
    [string]
    $fileName
)

#$Error.Clear()

Invoke-PSake $PSScriptRoot\InfraDNS\$fileName.ps1

<#if($Error.count)
{
    Throw "$fileName script failed. Check logs for failure details."
}
#>

TFS에서 예제용 빌드 정의를 작성할 때 이 스크립트의 fileName 매개 변수로 psake 스크립트 파일을 제공할 것입니다.When we create the build definition for our example in TFS, we will supply our psake script file as the fileName parameter for this script.

빌드 스크립트는 다음과 같은 작업을 정의합니다.The build script defines the following tasks:

GenerateEnvironmentFilesGenerateEnvironmentFiles

구성 데이터 파일을 생성하는 DevEnv.ps1을 실행합니다.Runs DevEnv.ps1, which generates the configuration data file.

InstallModulesInstallModules

구성 DNSServer.ps1에 필요한 모듈을 설치합니다.Installs the modules required by the configuration DNSServer.ps1.

ScriptAnalysisScriptAnalysis

PSScriptAnalyzer를 호출합니다.Calls the PSScriptAnalyzer.

UnitTestsUnitTests

Pester 단위 테스트를 실행합니다.Runs the Pester unit tests.

CompileConfigsCompileConfigs

GenerateEnvironmentFiles 작업을 통해 생성된 구성 데이터를 사용하여 구성(DNSServer.ps1)을 MOF 파일로 컴파일합니다.Compiles the configuration (DNSServer.ps1) into a MOF file, using the configuration data generated by the GenerateEnvironmentFiles task.

정리Clean

예제에 사용되는 폴더를 만들고 이전 실행의 테스트 결과, 구성 데이터 파일 및 모듈을 제거합니다.Creates the folders used for the example, and removes any test results, configuration data files, and modules from previous runs.

psake 배포 스크립트The psake deploy script

Demo_CI 리포지토리 루트(./InfraDNS/Deploy.ps1)의 Deploy.ps1에 정의된 psake 배포 스크립트는 구성을 배포하고 실행하는 작업을 정의합니다.The psake deployment script defined in Deploy.ps1 (from the root of the Demo_CI repository, ./InfraDNS/Deploy.ps1) defines tasks that deploy and run the configuration.

Deploy.ps1은 다음 작업을 정의합니다.Deploy.ps1 defines the following tasks:

DeployModulesDeployModules

TestAgent1에서 PowerShell 세션을 시작하고 구성에 필요한 DSC 리소스가 포함된 모듈을 설치합니다.Starts a PowerShell session on TestAgent1 and installs the modules containing the DSC resources required for the configuration.

DeployConfigsDeployConfigs

Start-DscConfiguration cmdlet을 호출하여 TestAgent1에서 구성을 실행합니다.Calls the Start-DscConfiguration cmdlet to run the configuration on TestAgent1.

IntegrationTestsIntegrationTests

Pester 통합 테스트를 실행합니다.Runs the Pester integration tests.

AcceptanceTestsAcceptanceTests

Pester 수용 테스트를 실행합니다.Runs the Pester acceptance tests.

정리Clean

이전 실행에서 설치된 모듈을 제거하고 테스트 결과 폴더가 있는지 확인합니다.Removes any modules installed in previous runs, and ensures that the test result folder exists.

테스트 스크립트Test scripts

수용, 통합 및 단위 테스트는 Demo_CI 리포지토리 루트의 Tests 폴더(./InfraDNS/Tests)에서 정의되며 각각 해당 폴더의 DNSServer.tests.ps1 파일에 포함되어 있습니다.Acceptance, Integration, and Unit tests are defined in scripts in the Tests folder (from the root of the Demo_CI repository, ./InfraDNS/Tests), each in files named DNSServer.tests.ps1 in their respective folders.

테스트 스크립트는 PesterPoshSpec 구문을 사용합니다.The test scripts use Pester and PoshSpec syntax.

단위 테스트Unit tests

단위 테스트에서는 DSC 구성 자체를 테스트하여 구성을 실행하면 필요한 작업이 수행되는지를 확인합니다.The unit tests test the DSC configurations themselves to ensure that the configurations will do what is expected when they run. 단위 테스트 스크립트는 Pester를 사용합니다.The unit test script uses Pester.

통합 테스트Integration tests

통합 테스트에서는 시스템 구성을 테스트하여 다른 구성 요소와 통합하는 경우 시스템이 올바르게 구성되는지를 확인합니다.The integration tests test the configuration of the system to ensure that when integrated with other components, the system is configured as expected. 이러한 테스트는 DSC를 통해 구성된 대상 노드에서 실행됩니다.These tests run on the target node after it has been configured with DSC. 통합 테스트 스크립트는 PesterPoshSpec 구문을 함께 사용합니다.The integration test script uses a mixture of Pester and PoshSpec syntax.

수용 테스트Acceptance tests

수용 테스트에서는 시스템을 테스트하여 정상적으로 동작하는지를 확인합니다.Acceptance tests test the system to ensure that it behaves as expected. 예를 들어 웹 페이지 쿼리 시 올바른 정보가 반환되는지를 테스트하여 확인합니다.For example, it tests to ensure a web page returns the right information when queried. 이러한 테스트는 실제 시나리오를 테스트하기 위해 대상 노드에서 원격으로 실행됩니다.These tests run remotely from the target node in order to test real world scenarios. 통합 테스트 스크립트는 PesterPoshSpec 구문을 함께 사용합니다.The integration test script uses a mixture of Pester and PoshSpec syntax.

빌드 정의Define the build

지금까지 코드를 TFS에 업로드하고 코드가 수행하는 작업을 살펴보았습니다. 그러면 이제 빌드를 정의해 보겠습니다.Now that we've uploaded our code to TFS and looked at what it does, let's define our build.

여기서는 빌드에 추가할 빌드 단계에 대해서만 설명합니다.Here, we'll cover only the build steps that you'll add to the build. TFS에서 빌드 정의를 작성하는 방법에 대한 지침은 빌드 정의 만들기 및 큐에 넣기를 참조하세요.For instructions on how to create a build definition in TFS, see Create and queue a build definition.

템플릿을 선택하여 새 빌드 정의 "InfraDNS"를 만들고Create a new build definition (select the Empty template) named "InfraDNS". 빌드 정의에 다음 단계를 추가합니다.Add the following steps to you build definition:

  • PowerShell 스크립트PowerShell Script
  • 테스트 결과 게시Publish Test Results
  • 파일 복사Copy Files
  • 아티팩트 게시Publish Artifact

이러한 빌드 단계를 추가한 후에 다음과 같이 각 단계의 속성을 편집합니다. After adding these build steps, edit the properties of each step as follows:

PowerShell 스크립트PowerShell Script

  1. 형식 속성을 File Path로 설정합니다.Set the Type property to File Path.
  2. 스크립트 경로 속성을 initiate.ps1로 설정합니다.Set the Script Path property to initiate.ps1.
  3. -fileName build인수 속성에 추가합니다.Add -fileName build to the Arguments property.

이 빌드 단계는 psake 빌드 스크립트를 호출하는 initiate.ps1 파일을 실행합니다.This build step runs the initiate.ps1 file, which calls the psake build script.

테스트 결과 게시Publish Test Results

  1. 테스트 결과 형식NUnit으로 설정합니다.Set Test Result Format to NUnit
  2. 테스트 결과 파일InfraDNS/Tests/Results/*.xml로 설정합니다.Set Test Results Files to InfraDNS/Tests/Results/*.xml
  3. 테스트 실행 제목Unit으로 설정합니다.Set Test Run Title to Unit.
  4. 제어 옵션 사용항상 실행이 둘 다 선택되어 있는지 확인합니다.Make sure Control Options Enabled and Always run are both selected.

이 빌드 단계는 앞에서 살펴본 Pester 스크립트에서 단위 테스트를 실행하고 결과를 InfraDNS/Tests/Results/*.xml 폴더에 저장합니다.This build step runs the unit tests in the Pester script we looked at earlier, and stores the results in the InfraDNS/Tests/Results/*.xml folder.

파일 복사Copy Files

  1. 다음 각 줄을 내용에 추가합니다.Add each of the following lines to Contents:

    initiate.ps1
    **\deploy.ps1
    **\Acceptance\**
    **\Integration\**
    
  2. TargetFolder$(Build.ArtifactStagingDirectory)\로 설정합니다.Set TargetFolder to $(Build.ArtifactStagingDirectory)\

이 단계는 다음 단계에서 빌드 아티팩트로 게시할 수 있도록 빌드 및 테스트 스크립트를 스테이징 디렉터리에 복사합니다.This step copies the build and test scripts to the staging directory so that the can be published as build artifacts by the next step.

아티팩트 게시Publish Artifact

  1. 게시할 경로$(Build.ArtifactStagingDirectory)\로 설정합니다.Set Path to Publish to $(Build.ArtifactStagingDirectory)\
  2. 아티팩트 이름Deploy로 설정합니다.Set Artifact Name to Deploy
  3. 아티팩트 형식Server로 설정합니다.Set Artifact Type to Server
  4. 제어 옵션에서 Enabled를 선택합니다.Select Enabled in Control Options

연속 통합을 사용하도록 설정Enable continuous integration

이제 git 리포지토리의 ci-cd-example 분기에 변경 내용을 체크 인할 때마다 프로젝트가 빌드되도록 하는 트리거를 설정하겠습니다.Now we'll set up a trigger that causes the project to build any time a change is checked in to the ci-cd-example branch of the git repository.

  1. TFS에서 빌드 및 릴리스 탭을 클릭합니다.In TFS, click the Build & Release tab
  2. DNS Infra 빌드 정의를 선택하고 편집을 클릭합니다.Select the DNS Infra build definition, and click Edit
  3. 트리거 탭을 클릭합니다.Click the Triggers tab
  4. 연속 통합(CI) 을 선택하고 분기 드롭다운 목록에서 refs/heads/ci-cd-example을 선택합니다.Select Continuous integration (CI), and select refs/heads/ci-cd-example in the branch drop-down list
  5. 저장, 확인을 차례로 클릭합니다.Click Save and then OK

이제 TFS git 리포지토리에서 변경을 수행하면 자동화된 빌드가 트리거됩니다.Now any change in the TFS git repository triggers an automated build.

릴리스 정의 만들기Create the release definition

다음으로는 코드를 체크 인할 때마다 개발 환경에 프로젝트가 배포되도록 릴리스 정의를 만들어 보겠습니다.Let's create a release definition so that the project is deployed to the development environment with every code check-in.

이렇게 하려면 앞에서 만든 InfraDNS 빌드 정의와 연결된 새 릴리스 정의를 추가합니다.To do this, add a new release definition associated with the InfraDNS build definition you created previously. 새 빌드를 완료할 때마다 새 릴리스가 트리거되도록 연속 배포를 선택해야 합니다.Be sure to select Continuous deployment so that a new release will be triggered any time a new build is completed. 해당 방법은 방법: 릴리스 정의 작업을 참조하세요. 다음과 같이 새 릴리스 정의를 구성합니다.(How to: Work with release definitions) and configure it as follows:

릴리스 정의에 다음 단계를 추가합니다.Add the following steps to the release definition:

  • PowerShell 스크립트PowerShell Script
  • 테스트 결과 게시Publish Test Results
  • 테스트 결과 게시Publish Test Results

다음과 같이 단계를 편집합니다.Edit the steps as follows:

PowerShell 스크립트PowerShell Script

  1. 스크립트 경로 필드를 $(Build.DefinitionName)\Deploy\initiate.ps1"로 설정합니다.Set the Script Path field to $(Build.DefinitionName)\Deploy\initiate.ps1"
  2. 인수 필드를 -fileName Deploy로 설정합니다.Set the Arguments field to -fileName Deploy

테스트 결과 첫 번째 게시First Publish Test Results

  1. 테스트 결과 형식 필드에서 NUnit을 선택합니다.Select NUnit for the Test Result Format field
  2. 테스트 결과 파일 필드를 $(Build.DefinitionName)\Deploy\InfraDNS\Tests\Results\Integration*.xml로 설정합니다.Set the Test Result Files field to $(Build.DefinitionName)\Deploy\InfraDNS\Tests\Results\Integration*.xml
  3. 테스트 실행 제목Integration로 설정합니다.Set the Test Run Title to Integration
  4. 제어 옵션에서 항상 실행을 선택합니다.Under Control Options, check Always run

테스트 결과 두 번째 게시Second Publish Test Results

  1. 테스트 결과 형식 필드에서 NUnit을 선택합니다.Select NUnit for the Test Result Format field
  2. 테스트 결과 파일 필드를 $(Build.DefinitionName)\Deploy\InfraDNS\Tests\Results\Acceptance*.xml로 설정합니다.Set the Test Result Files field to $(Build.DefinitionName)\Deploy\InfraDNS\Tests\Results\Acceptance*.xml
  3. 테스트 실행 제목Acceptance로 설정합니다.Set the Test Run Title to Acceptance
  4. 제어 옵션에서 항상 실행을 선택합니다.Under Control Options, check Always run

결과 확인Verify your results

이제 ci-cd-example 분기에서 TFS에 변경 내용을 푸시할 때마다 새 빌드가 시작됩니다.Now, any time you push changes in the ci-cd-example branch to TFS, a new build will start. 빌드가 정상적으로 완료되면 새 배포가 트리거됩니다.If the build completes successfully, a new deployment is triggered.

클라이언트 컴퓨터에서 브라우저를 열고 www.contoso.com으로 이동하면 배포 결과를 확인할 수 있습니다.You can check the result of the deployment by opening a browser on the client machine and navigating to www.contoso.com.

다음 단계Next steps

이 예제에서는 www.contoso.com URL이 TestAgent2로 확인되도록 DNS 서버 TestAgent1을 구성하지만 웹 사이트가 실제로 배포되지는 않습니다.This example configures the DNS server TestAgent1 so that the URL www.contoso.com resolves to TestAgent2, but it does not actually deploy a website. 웹 사이트 배포를 위한 코드 구조는 리포지토리의 WebApp 폴더에서 제공됩니다.The skeleton for doing so is provided in the repo under the WebApp folder. 제공된 스텁을 사용하여 psake 스크립트, Pester 테스트 및 DSC 구성을 만들어서 웹 사이트를 직접 배포할 수 있습니다.You can use the stubs provided to create psake scripts, Pester tests, and DSC configurations to deploy your own website.