연습 - 클라우드 네이티브 앱을 배포하는 Azure DevOps 파이프라인 만들기

완료됨

관리자는 회사 eShop 앱에서 Azure Pipelines를 사용하도록 CI/CD를 변경하려고 합니다. 이제 제품 서비스를 빌드하고 배포하는 Azure DevOps 파이프라인을 만듭니다.

Azure DevOps 파이프라인 만들기

Important

시작하기 전에 Azure DevOps 계정이 있어야 합니다. 없는 경우 dev.azure.com 무료로 만들 수 있습니다.

  1. dev.azure.com 로그인합니다.
  2. + 새 프로젝트를 선택합니다.
  3. 프로젝트 이름에 eShop 배포를 입력합니다.
  4. 표시 유형을 비공개로 설정한 상태로 두고 만들기선택합니다.
  5. 왼쪽에서 파이프라인을 선택한 다음, 파이프라인 만들기를 선택합니다.
  6. 커넥트 페이지의 코드는 어디에 있나요?에서 GitHub를 선택합니다.
  7. 메시지가 표시되면 GitHub에 로그인하고 Azure Pipelines에 GitHub 계정에 액세스하도록 권한을 부여합니다.
  8. 리포지토리 선택에서 포크된 리포지토리를 선택합니다.
  9. 구성 페이지에서 Azure Kubernetes Service배포 옵션을 선택합니다.
  10. Azure Kubernetes Service에 배포 창에서 Azure 구독을 선택한 다음, 계속을 선택합니다.
  11. 메시지가 표시되면 Azure 구독에 로그인합니다.
  12. 클러스터경우 이전 단원 aks-eshop에서 만든 AKS 클러스터를 선택합니다.
  13. 네임스페이스의 경우 기존 항목이 선택된 상태로 두고 기본값을 선택합니다.
  14. 컨테이너 레지스트리경우 이전 단원에서 만든 Azure Container Registry(예: acseshop186748394)를 선택합니다.
  15. 이미지 이름으로 productservice를 입력합니다.
  16. 서비스 포트경우 8080을 입력합니다.
  17. 유효성 검사 및 구성을 선택합니다.

파이프라인 YAML 파일 검토

Azure Pipelines는 YAML 파일을 사용하여 앱을 빌드하고 배포하는 단계를 정의합니다. YAML 파일은 GitHub 리포지토리에 저장되며 사용자가 제공한 정보에 따라 자동으로 생성됩니다.

YAML 파일을 검토해 보겠습니다.

trigger:
- main

resources:
- repo: self

variables:

  # Container registry service connection established during pipeline creation
  dockerRegistryServiceConnection: '3bcbb23c-6fca-4ff0-8719-bfbdb64a89b1'
  imageRepository: 'productservice'
  containerRegistry: 'acseshop186748394.azurecr.io'
  dockerfilePath: '**/Dockerfile'
  tag: '$(Build.BuildId)'
  imagePullSecret: 'acseshop18674839414442d34-auth'

  # Agent VM image name
  vmImageName: 'ubuntu-latest'


stages:
- stage: Build
  displayName: Build stage
  jobs:
  - job: Build
    displayName: Build
    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)

    - upload: manifests
      artifact: manifests

- stage: Deploy
  displayName: Deploy stage
  dependsOn: Build

  jobs:
  - deployment: Deploy
    displayName: Deploy
    pool:
      vmImage: $(vmImageName)
    environment: 'PhilStollerymod9cloudnativeexercisecode-1959.default'
    strategy:
      runOnce:
        deploy:
          steps:
          - task: KubernetesManifest@0
            displayName: Create imagePullSecret
            inputs:
              action: createSecret
              secretName: $(imagePullSecret)
              dockerRegistryEndpoint: $(dockerRegistryServiceConnection)

          - task: KubernetesManifest@0
            displayName: Deploy to Kubernetes cluster
            inputs:
              action: deploy
              manifests: |
                $(Pipeline.Workspace)/manifests/deployment.yml
                $(Pipeline.Workspace)/manifests/service.yml
              imagePullSecrets: |
                $(imagePullSecret)
              containers: |
                $(containerRegistry)/$(imageRepository):$(tag)

트리거리소스 섹션은 파이프라인이 실행되어야 하는 시기를 정의합니다. 이 경우 변경 내용이 리포지토리의 기본 분기에 커밋될 때 파이프라인이 실행됩니다.

변수 섹션은 파이프라인에 사용되는 변수를 정의합니다. 변수는 Azure Container Registry 및 사용할 Dockerfile을 정의하는 데 사용됩니다.

그런 다음 YAML은 ubuntu-latest 에이전트를 사용하는 빌드 작업을 정의합니다. 이 작업은 Docker 작업을 사용하여 이미지를 빌드하고 Azure Container Registry에 푸시합니다.

마지막 단계는 업데이트된 제품 서비스를 AKS에 배포 하는 것입니다. 이 작업은 KubernetesManifest 작업을 사용하여 AKS에 이미지를 배포합니다.

파이프라인 실행

파이프라인 YAML 검토 페이지의 오른쪽 위에서 저장 및 실행을 선택합니다. 저장 및 실행 창에서 다음을 수행합니다.

  1. 이 커밋에 대한 새 분기 만들기를 선택합니다.
  2. 다른 모든 옵션은 기본값으로 설정합니다.
  3. 저장 및 실행을 선택합니다.

파이프라인 모니터링 및 문제 해결

Azure Pipelines는 Azure DevOps 포털에서 모니터링 및 관리됩니다. 만든 파이프라인 실행의 출력을 살펴보겠습니다.

A screenshot showing the status of an Azure Pipeline.

요약 페이지에는 실행 중인 파이프라인의 모든 단계가 표시됩니다. 단계를 선택하여 단계를 자세히 볼 수 있습니다. 잠시 후 파이프라인이 실패했음을 알 수 있습니다. 빌드 단계를 선택합니다.

A screenshot of the build stage in a pipeline that has failed.

빌드 단계에서 빌드가 실패했음을 확인할 수 있습니다. 빌드를 선택하고 Azure Container Registry 단계에 이미지를 푸시합니다 . 로그 파일의 오류는 다음과 같습니다.

##[error]Unhandled: No Dockerfile matching  /home/vsts/work/1/s/**/Dockerfile  was found.

오류 수정

DevOps에서 파이프라인 요약 페이지로 돌아갑니다. 만든 파이프라인을 편집하여 오류를 수정합니다.

  1. 오른쪽 위에서 추가 작업 메뉴를 선택한 다음, 파이프라인 편집을 선택합니다.

  2. YAML 파일의 17줄은 사용할 Dockerfile을 정의하며, 기본적으로 파이프라인은 리포지토리의 루트에 Dockerfile이라는 파일이 있어야 합니다.

    eShop은 DockerfileProducts라는 제품 서비스에 다른 Docker 파일을 사용합니다. 줄 17을 다음과 같이 편집합니다.

      dockerfilePath: '**/DockerfileProducts'
    
  3. 저장을 선택합니다.

  4. 저장 창에서 저장을 선택합니다.

  5. 그런 다음 실행을 선택하고 파이프라인 실행 창에서 실행을 선택합니다.

    빌드 단계가 완료되었는지 확인합니다. 배포 단계는 선택한 후 실행을 허용할 때까지 일시 중지됩니다.

    A screenshot showing the completed pipeline.

    파이프라인이 성공적으로 완료됩니다. 배포 단계를 선택하여 단계를 봅니다.

    A screenshot showing the Deploy stage and the successfully completed steps.