다음을 통해 공유


Azure Pipelines를 사용하여 App Service에 사용자 지정 컨테이너 배포

Azure DevOps를 사용하면 무료 워크플로를 통해 코드를 호스트, 빌드, 계획 및 테스트할 수 있습니다. Azure Pipelines를 이러한 워크플로 중 하나로 사용하면 모든 플랫폼 및 클라우드에서 작동하는 CI/CD를 사용하여 애플리케이션을 배포할 수 있습니다. 파이프라인은 리포지토리의 루트 디렉터리에서 YAML 파일로 정의됩니다.

이 문서에서는 Azure Pipelines를 사용하여 Azure DevOps의 Git 리포지토리에서 App Service에 Windows 컨테이너 애플리케이션을 배포합니다. 여기서는 Azure DevOps에 지원 dockerfile이 포함된 .NET 애플리케이션이 이미 있다고 가정합니다.

필수 조건

서비스 연결 추가

템플릿을 만들 때 연결을 선택하고 확인하라는 메시지가 표시되므로 파이프라인을 만들기 전에 먼저 서비스 연결을 만들어야 합니다. 서비스 연결을 사용하면 작업 템플릿을 사용할 때 선택한 레지스트리(ACR 또는 Docker Hub)에 연결할 수 있습니다. 새 서비스 연결을 추가할 때 Docker 레지스트리 옵션을 선택합니다. 다음 양식에서는 관련 정보와 함께 Docker Hub 또는 Azure Container Registry를 선택하도록 요청합니다. 이 자습서를 진행하려면 Azure Container Registry를 사용합니다. 여기 지침에 따라 새 서비스 연결을 만들 수 있습니다.

비밀 보호

Microsoft에서는 다른 사람의 액세스를 방지하려는 중요한 정보를 사용하고 있으므로, 변수를 사용하여 정보를 보호합니다. 여기 지침에 따라 변수를 만듭니다.

변수를 추가하려면 파이프라인 편집 보기 오른쪽 상단에 있는 저장 단추 옆에 있는 변수 단추를 클릭합니다. 새 변수 단추를 선택하고 정보를 입력합니다. 각 리소스에 적절한 고유한 비밀을 사용하여 아래 변수를 추가합니다.

  • vmImageName: 'windows-latest'
  • imageRepository: '이미지 리포지토리 이름'
  • dockerfilePath: '$(Build.SourcesDirectory)/path/to/Dockerfile'
  • dockerRegistryServiceConnection: '서비스 연결 번호'

새 파이프라인 만들기

.NET 애플리케이션 및 지원 dockerfile을 사용하여 리포지토리가 만들어지면 다음 단계에 따라 파이프라인을 만들 수 있습니다.

  1. 왼쪽 메뉴 모음에서 파이프라인으로 이동하여 파이프라인 만들기 단추 클릭
  2. 다음 화면에서 리포지토리 옵션으로 Azure Repos Git을 선택하고 코드가 있는 리포지토리 선택
  3. 구성 탭에서 시작 파이프라인 옵션 선택
  4. 다음 검토 탭에서 저장 단추 클릭

Azure Container Registry에 이미지 빌드 및 푸시

파이프라인을 만들고 저장한 후에는 파이프라인을 편집하여 컨테이너 빌드, 레지스트리에 푸시 및 이미지를 App Service에 배포하는 단계를 실행해야 합니다. 시작하려면 파이프라인 메뉴로 이동하여 만든 파이프라인을 선택한 다음 편집 단추를 클릭합니다.

먼저 이미지를 빌드할 수 있도록 docker 작업을 추가해야 합니다. 다음 코드를 추가하고 Dockerfile: app/Dockerfile을 Dockerfile 경로로 바꿉니다.

trigger:
 - main

 pool:
   vmImage: 'windows-latest' 

 variables:
   vmImageName: 'windows-latest'
   imageRepository: 'your-image-repo-name'
   dockerfilePath: '$(Build.SourcesDirectory)/path/to/Dockerfile'
   dockerRegistryServiceConnection: 'your-service-connection-number'

- stage: Build
  displayName: Build and push stage
  jobs:  
  - job: Build
    displayName: Build job
    pool:
      vmImage: $(vmImageName)
    steps:
    - task: Docker@2
      displayName: Build and push an image to container registry
      inputs:
        command: buildAndPush
        repository: $(imageRepository)
        dockerfile: $(dockerfilePath)
        containerRegistry: $(dockerRegistryServiceConnection)
        tags: |
          $(tag)

App Service 배포 작업 추가

다음으로 배포 작업을 설정해야 합니다. 이를 위해서는 구독 이름, 애플리케이션 이름 및 컨테이너 레지스트리가 필요합니다. 아래 코드를 붙여넣어 yaml 파일에 새 단계를 추가합니다.

- stage: Deploy
  displayName: Deploy to App Service
  jobs:
  - job: Deploy
    displayName: Deploy
    pool:
      vmImage: $(vmImageName)
    steps:

그런 다음 오른쪽 상단에 있는 도우미 표시 탭으로 이동하여 Azure App Service 배포 작업을 찾아 다음 양식을 작성합니다.

  • 연결 형식: Azure Resource Manager
  • Azure 구독: 구독 이름
  • App Service 형식: Web App for Containers(Windows)
  • App Service 이름: 앱 이름
  • 레지스트리 또는 네임스페이스: Azure 컨테이너 레지스트리 네임스페이스
  • 이미지: Azure 컨테이너 레지스트리 이미지 이름

항목을 모두 작성한 후 추가 단추를 클릭하여 아래 작업을 추가합니다.

- task: AzureRmWebAppDeployment@4
  inputs:
    ConnectionType: 'AzureRM'
    azureSubscription: 'my-subscription-name'
    appType: 'webAppHyperVContainer'
    WebAppName: 'my-app-name'
    DockerNamespace: 'myregsitry.azurecr.io'
    DockerRepository: 'dotnetframework:12'

작업을 추가하면 파이프라인을 실행할 준비가 됩니다. 유효성 검사 및 저장 단추를 클릭하고 파이프라인을 실행합니다. 파이프라인은 Windows 컨테이너 이미지를 빌드하여 Azure Container Registry에 푸시하고 이미지를 App Service에 배포하는 단계를 거칩니다.

다음은 전체 yaml 파일의 예입니다.

trigger:
 - main

 pool:
   vmImage: 'windows-latest' 

 variables:
   vmImageName: 'windows-latest'
   imageRepository: 'your-image-repo-name'
   dockerfilePath: '$(Build.SourcesDirectory)/path/to/Dockerfile'
   dockerRegistryServiceConnection: 'your-service-connection-number'

- stage: Build
  displayName: Build and push stage
  jobs:  
  - job: Build
    displayName: Build job
    pool:
      vmImage: $(vmImageName)
    steps:
    - task: Docker@2
      displayName: Build and push an image to container registry
      inputs:
        command: buildAndPush
        repository: $(imageRepository)
        dockerfile: $(dockerfilePath)
        containerRegistry: $(dockerRegistryServiceConnection)
        tags: |
          $(tag)

- stage: Deploy
  displayName: Deploy to App Service
  jobs:
  - job: Deploy
    displayName: Deploy
    pool:
      vmImage: $(vmImageName)
    steps:
    - task: AzureRmWebAppDeployment@4
		  inputs:
		    ConnectionType: 'AzureRM'
		    azureSubscription: 'my-subscription-name'
		    appType: 'webAppHyperVContainer'
		    WebAppName: 'my-app-name'
		    DockerNamespace: 'myregsitry.azurecr.io'
		    DockerRepository: 'dotnetframework:12'