Azure DevOps #2. Tutorial - CI/CD Pipeline

hyukjun·2023년 2월 28일
0

Azure DevOps

목록 보기
2/2
post-thumbnail

시작하며

Azure DevOps를 사용한 CI/CD를 처음 접해보시는 분들이 보기 좋은 간단한 튜토리얼 입니다.

데모 파이프라인 시나리오

Docker Image를 빌드하여 Azure Container Registry에 저장 후 해당 이미지를 Azure Webapp Service에 배포해보는 튜토리얼 입니다.

Pre setup

  • Azure Account, Azure DevOps Account & Free Pipeline Agent(MS Host)

    • Azure DevOps Account는 Azure와 동일한 Account를 사용합니다.
  • Sample docker project

  • az-cli command line tool

Steps

1. Azure 환경 구성

1.1 Azure Container Registry (Basic SKU) 구성
ACR 생성 후 Settings -> Access Keys -> Admin User -> Enabled 합니다.

1.2 Azure Webapp Service (2 Slots) (P1V2 or S1 SKU 이상) 구성
App Service 생성 후 Settings -> Configuration -> Application Settings 에서 ACR의 URL, Username, Password 를 환경변수로 세팅 합니다.

1.3 Webapp Dev Slot 생성
기본적으로 Production Slot 1개는 생성되어 있으며, Dev Slot을 별도로 생성해 주어야 합니다. Slot 생성 시 Production Slot의 Application Settings을 상속받도록 Clone setting from옵션 에서 Production slot을 체크 해줍니다. Deployment -> Deployment slot -> Add slot

2. Azure DevOps Service Connection 등록

ADO 파이프라인의 각 Task에서 사용하게 될 자격증명을 세팅 합니다.
이번 데모에서는 Azure 및 ACR에 접근하기 위한 Connection을 세팅합니다.

2.1 Connection to Azure

2.1.1 Azure Applicaion registration & IAM setting
azcli를 사용해 Azure상에 App 생성 및 구독 권한을 부여합니다. 생성된 앱의 ID, Secret과 앱이 생성된 Tenant ID, Subscription ID, Subscription Name을 메모해 둡니다.

az ad sp create-for-rbac -n MyApp --role Contributor --scopes /subscriptions/00000000-0000-0000-0000-000000000000`

  {
    "appId": "",
    "displayName": "",
    "password": "",
    "tenant": ""
  }

2.1.2 Register ADO service connection
1번에서 생성한 App 의 정보를 사용해 Azure와 연결할 Connection을 생성 합니다. 아래의 순서에 따라 Connection을 생성합니다.

azure devops -> project -> project settings -> service connections -> new service connection -> Azure Resource Manager -> Service principal(Manual) -> 앱 ID / 앱 secret / 구독 이름 / 구독 ID / 테넌트 ID 입력 (*Grant access permission to all pipelines 체크) -> Save

2.2 Connection to ACR

ACR은 Docker Registry 타입의 Connection이 필요합니다. 아래의 순서에 따라 Connection을 생성합니다.

azure devops -> project -> project settings -> service connections -> new service connection -> Docker Registry -> Azure Container Registry 선택 -> 인증타입: Service Principal -> 로딩된 구독에 로그인 후 자신의 ACR을 선택 (*Grant access permission to all pipelines 체크) -> Save

3. Build Pipeline 구성 (Continuous Integration and Delivery)

Docker Image를 빌드하고, ACR에 빌드된 이미지를 Push하는 파이프라인을 만듭니다. ADO의 YAML 파이프라인은 보통 이와 같은 CI를 위해 사용되곤 합니다.

Pipeline은 YAML문법으로 작성되며, Trigger / Variable / Stage로 크게 3가지 항목으로 나눌 수 있습니다. Trigger는 파이프라인을 실행시키는 조건(branch, path, tag)을 세팅하고, Variable은 YAML소스 및 UI로 선언할 수 있습니다. 실제 파이프라인의 작업은 Stage에서 구성합니다, Task가 가장 작은 작업 단위 이며 이를 묶어서 Job 단위로 구성합니다. 하나의 Job은 하나의 Agent(VM or Container)를 사용합니다.

아래 데모 파이프라인에서는 Docker Build시 파이프라인의 고유한 Build Number를 사용하여 Image의 Tag를 지정 합니다.

3.1 파이프라인(YAML) 작성

Pipeline -> New Pipeline -> source repo 및 starter pipeline 선택 후 Pipeline 작성

# azure-pipelines.yml
# demo build pipeline

trigger:
  branches:
   include:
     - main # Include main branch
  paths:
    include:
      - apache-sample # Working directory
    exclude:
      - README.md # No include README.md

variables:
  workDir: apache-sample
  dockerRepo: 'demo-webapp' # Image name

stages:
  - stage: Build
    jobs:
    - job: buildandpush
      pool:
        vmImage: ubuntu-latest
      steps:
      - task: DockerInstaller@0
        inputs:
          dockerVersion: '17.09.0-ce'
      - task: Docker@2
        inputs:
          containerRegistry: 'connection-to-acr'
          repository: '$(dockerRepo)'
          command: 'buildAndPush'
          Dockerfile: '$(System.DefaultWorkingDirectory)/$(workDir)/Dockerfile'
          tags: '$(Build.BuildNumber)'

참고 이미지

4. Release Pipeline 구성 (Continuous Deployment)

빌드 파이프라인이 성공적으로 완료되면, 자동으로 실행되는 배포 파이프라인을 구성 합니다.

빌드 파이프라인의 Build Number 값을 Image Tag로 사용했기 때문에, 배포 파이프라인의 소스 아티팩트로 빌드 파이프라인을 연결시켜 주고, 해당 빌드파이프라인의 Build Number를 참조할 수 있게 만듭니다. 이렇게 하면, 배포에 사용되는 Image Tag값을 정확하게 가져올 수 있습니다.

배포 프로세스는 Webapp의 Dev Slot에 먼저 배포 후, 리뷰를 통해 Production Slot에 배포할지 여부를 가립니다, 승인이 됐다면, Webapp의 Slot Swap 기능을 통해 Production Slot과 Dev Slot을 Swap 하여 운영환경에 애플리케이션을 무중단 배포를 할 수 있습니다.

데모에서는 다루지 않지만, 실제 프로덕션(운영)환경에서는 다양한 배포 전략, 데이터베이스 프로필 변경(Dev,Prod), 부하분산 장치의 Session Draining 등 고려할게 많지만, 이번 데모에서는 파이프라인 사용법 습득이 우선이므로 생략하였습니다.

4.1 Source Artifact(Build Pipeline) 및 자동 트리거 설정

Release -> New Release Pipeline 로 새로운 릴리즈 파이프라인을 만든 뒤, 빌드 파이프라인을 Source Artifact로 설정하고, 자동 트리거 설정까지 해줍니다.
*Source alias는 메모해둡니다.

4.2 Dev Slot 배포 스테이지 설정 (Job, Task)

4.2.1 Agent Pool 구성
먼저 Agent pool을 Azure Pipelines (MS Hhost)로 선택하고 원하는 OS를 선택합니다.(리눅스를 추천합니다.)

4.2.2 Task 구성
Agent job 옆의 '+' 버튼으로 Azure App Service Deploy 모듈을 선택하고 배포 프로필을 작성합니다. 앞서 등록한 Azure Service Connection으로 배포대상인 Webapp을 조회하고(Web App for Containers (Linux) 타입) Webapp의 Dev Slot을 선택합니다.

배포에 사용할 컨테이너 이미지 Tag는 4.1에서 메모한 Source alias를 사용해 빌드 파이프라인의 Build Number를 참조하게 합니다. (Release.Artifacts.{alias}.BuildNumber 와 같이 Azure DevOps에서 제공하는 예약 변수를 활용하는 방식 입니다.)

아래 Application and Configuration Setting에서는 Webapp의 Application Setting을 추가 할 수도 있습니다. 필요할 경우 해당 칸에 Application을 위한 환경변수를 세팅하여 배포 프로세스에서 Webapp의 환경변수를 세팅할 수 있습니다. (미리 Webapp의 Application Setting 에서 환경변수를 세팅해 놓은 경우, 파이프라인 배포를 통해 동일한 변수를 세팅하게 되면, 기존 Value를 덮어씌우게 되니 주의해야 합니다.)

4.3 Production Slot 배포 스테이지 구성 (Job, Task)

4.3.1 Agent Pool 구성
Stage 추가 버튼을 통해 새로운 Stage를 추가하고, 여기도 먼저 Agent Pool을 선택합니다.

4.3.2 Task 구성
Azure App Service manage 모듈을 선택해서 Swap Slot Task를 구성합니다. Action을 Swap Slots을 선택하고, Source Slot을 Dev Slot으로 선택 합니다. 바로 아래 Swap with Production 항목을 체크합니다.

4.3.3 승인 절차 추가
스테이지 앞쪽을 클릭하면, Pre-deployment approvals 항목을 활성화 합니다. 여기에 리뷰에 참여할 멤버를 선택해줍니다. 아래 Approval policeis를 통해 승인 규칙도 상세하게 설정할 수 있습니다.

승인 이외에도 Gates 라는 항목으로 배포 전 프래그래밍 방식의 사전 배포 조건을 구성할 수 도 있습니다.

전체 릴리즈 파이프라인 모습

요약 및 결과

개발자는 소스코드를 저장소에 Commit하면, 연결된 빌드 파이프라인을 통해 컨테이너 이미지를 빌드하게되고, 파이프라인에서 성공적으로 이미지 빌드를 완료하면, 자동으로 릴리즈 파이프라인이 실행되어, Webapp에 배포할 수 있는 파이프라인을 만들어 보았습니다.

1. Build Pipeline

Source Commit 후 자동으로 빌드 파이프라인이 실행되고, Build Number를 Tag로 가진 이미지가 ACR에 저장된 모습을 볼 수 있습니다.

Build Number와 같은 파이프라인의 고유한 예약 변수들은 파이프라인의 Task 중 Initialize job에서 모두 출력됩니다.

2. Release Pipeline

빌드가 완료 된 후 자동으로 트리거 되며, 첫번째 스테이지 에서는 ACR에 저장된 이미지를 Webapp의 Dev Slot에 배포합니다.

이후, Review 과정을 거친 후 Webapp의 Production 환경에 배포(Slot Swap)합니다.

마치며

이번 튜토리얼은 Azure DevOps의 기본적인 사용법에 대한 내용 이므로, Azure DevOps를 처음 접해보시는 분들께 도움이 되었으면 좋겠습니다.

실제 운영 환경에서는 비즈니스 요구사항에 맞춰 보다 섬세하고, 자세한 설계를 통해 안정적인 CI/CD 환경을 구축하여 사용하시면 좋을 것 같습니다.

profile
slow and steady

0개의 댓글