연습 - 레지스트리에 모듈 게시

완료됨

여러분은 근무하는 장난감 회사에서 Bicep 모듈을 레지스트리에 게시해 왔습니다. 본인의 컴퓨터에서 게시 프로세스를 수동으로 실행해 왔습니다. 이제 여러분은 게시 프로세스를 처리하는 파이프라인을 만들려고 합니다.

이 연습에서는 다음을 수행합니다.

  • Bicep 모듈에 대한 컨테이너 레지스트리를 만듭니다.
  • 파이프라인에 린팅 스테이지를 추가합니다.
  • 모듈을 레지스트리에 게시하는 파이프라인 스테이지를 추가합니다.
  • 파이프라인이 성공적으로 실행되는지 확인합니다.
  • 레지스트리에서 게시된 모듈을 확인합니다.

컨테이너 레지스트리 만들기

모듈을 게시하려면 조직에서 사용할 레지스트리부터 만들어야 합니다. 여기서는 Azure Portal을 사용하여 레지스트리를 만듭니다.

  1. 브라우저를 통해 Azure Portal 내에서 새 컨테이너 레지스트리를 만듭니다.

  2. 기본 탭에서 대상 구독과 이전에 만든 ToyReusable 리소스 그룹을 선택합니다.

  3. 레지스트리 이름과 가까운 위치를 입력합니다.

    중요

    레지스트리 이름은 Azure 내에서 고유해야 하며, 5-50자의 영숫자를 포함해야 합니다. 레지스트리 이름 옆의 확인 표시는 선택한 이름을 사용할 수 있다는 뜻입니다.

  4. SKU에 대해 기본을 선택합니다.

    다른 구성 설정은 기본값으로 둡니다.

  5. 검토 + 만들기를 선택합니다.

    Screenshot of the Azure portal that shows the container registry creation page.

  6. 설정이 유효성 검사 통과를 표시하는지 검토한 다음 만들기를 선택합니다.

    배포가 완료되기를 기다립니다. 일반적으로 1-2분 정도 걸립니다.

  7. 배포 성공 메시지가 나타나면 리소스로 이동을 선택하여 컨테이너 레지스트리를 엽니다.

    Screenshot of the Azure portal that shows the container registry deployment, with the button for going to a resource highlighted.

  8. 컨테이너 레지스트리의 개요 영역에서 로그인 서버 설정의 값을 적어 둡니다. yourregistryname.azurecr.io 형식입니다.

    Screenshot of the Azure portal that shows the container registry's details, with the login server highlighted.

    잠시 후 이 문자열이 필요합니다.

모듈 메타데이터 파일 추가

이전 단원에서는 모듈에 대한 버전 관리 전략의 중요성에 대해 알아보았습니다. 모듈 메타데이터 파일을 사용하여 파이프라인 내에서 모듈의 주 버전 및 부 버전 번호를 지정하는 방법도 알아보았습니다. 여기서는 스토리지 계정 모듈에 대한 메타데이터 파일을 추가합니다.

  1. Visual Studio Code에서 리포지토리의 루트에 있는 modules/storage-account 폴더를 확장합니다.

  2. metadata.json이라는 새 파일을 만듭니다.

    Screenshot of Visual Studio Code that shows the location of the metadata dot JSON file.

  3. 파일에 다음 내용을 추가합니다.

    {
      "version": {
        "major": 1,
        "minor": 2
      }
    }
    

    메타데이터 파일에서 주 버전과 부 버전 번호를 따로 정의합니다. 파이프라인은 실행될 때마다 이러한 숫자를 파이프라인 빌드 번호와 결합하여 완전한 버전 번호를 만듭니다.

  4. 파일의 변경 내용을 저장합니다.

파이프라인 정의 업데이트 및 린팅 스테이지 추가

리포지토리에는 시작점으로 사용할 수 있는 파이프라인 초안이 포함되어 있습니다.

  1. modules/storage-account 폴더에서 pipeline.yml 파일을 엽니다.

  2. 환경 변수 ModuleRegistryServer의 값을 컨테이너 레지스트리의 서버 이름으로 업데이트합니다. 이 연습의 앞부분에서 이 이름을 복사해 두었습니다.

    예를 들어 레지스트리의 로그인 서버가 yourregistryname.azurecr.io이면 다음과 같습니다.

    - name: ModuleRegistryServer
      value: yourregistryname.azurecr.io
    
  3. 파일 맨 아래에서 # To be added라는 주석에 대해 다음 린팅 스테이지 정의가 포함됩니다.

    stages:
    
    - stage: Lint
      jobs:
      - job: LintCode
        displayName: Lint code
        steps:
          - script: |
              az bicep build --file $(ModuleFilePath)
            name: LintBicepCode
            displayName: Run Bicep linter
    

파이프라인에 게시 스테이지를 추가합니다.

이제 컨테이너 레지스트리에 모듈을 게시하는 두 번째 스테이지를 추가할 수 있습니다.

  1. pipeline.yml 파일의 맨 아래에서 게시 스테이지를 정의하고, 모듈의 metadata.json 파일에서 버전 번호를 읽고 파이프라인 변수로 설정하는 단계를 추가합니다.

    - stage: Publish
      jobs:
      - job: Publish
        steps:
          - script: |
              majorMinorVersionNumber=$(jq '(.version.major | tostring) + "." + (.version.minor | tostring)' $(ModuleMetadataFilePath) -r )
              versionNumber="$majorMinorVersionNumber.$(Build.BuildNumber)"
              echo "##vso[task.setvariable variable=ModuleVersion;]$versionNumber"
            name: GetModuleVersionNumber
            displayName: Get module version number
    

    이 단계에서는 jq 명령줄 애플리케이션을 사용하여 JSON 파일을 구문 분석하는 스크립트를 실행합니다.

  2. 방금 만든 단계 아래에 모듈을 레지스트리에 게시하는 단계를 추가합니다.

    - task: AzureCLI@2
      name: Publish
      displayName: Publish module
      inputs:
        azureSubscription: $(ServiceConnectionName)
        scriptType: 'bash'
        scriptLocation: 'inlineScript'
        inlineScript: |
          az bicep publish \
            --target 'br:$(ModuleRegistryServer)/$(ModuleName):$(ModuleVersion)' \
            --file $(ModuleFilePath)
    

    이 단계에서는 --target 인수의 값을 동적으로 생성합니다. 레지스트리 서버의 값, 모듈 이름 및 버전 번호를 결합합니다.

  3. 파일의 변경 내용을 저장합니다.

파이프라인 정의 확인 및 커밋

  1. deploy.yml 파일이 다음 예제와 비슷한지 확인합니다.

    trigger:
      batch: true
      branches:
        include:
        - main
      paths:
        include:
        - 'modules/storage-account/**'
    
    variables: 
    - name: ServiceConnectionName
      value: ToyReusable
    - name: ModuleName
      value: storage-account
    - name: ModuleRegistryServer
      value: yourregistryname.azurecr.io
    - name: ModuleFilePath
      value: modules/storage-account/main.bicep
    - name: ModuleMetadataFilePath
      value: modules/storage-account/metadata.json
    
    pool:
      vmImage: ubuntu-latest
    
    stages:
    
    - stage: Lint
      jobs:
      - job: LintCode
        displayName: Lint code
        steps:
          - script: |
              az bicep build --file $(ModuleFilePath)
            name: LintBicepCode
            displayName: Run Bicep linter
    
    - stage: Publish
      jobs:
      - job: Publish
        steps:
          - script: |
              majorMinorVersionNumber=$(jq '(.version.major | tostring) + "." + (.version.minor | tostring)' $(ModuleMetadataFilePath) -r )
              versionNumber="$majorMinorVersionNumber.$(Build.BuildNumber)"
              echo "##vso[task.setvariable variable=ModuleVersion;]$versionNumber"
            name: GetModuleVersionNumber
            displayName: Get module version number
          - task: AzureCLI@2
            name: Publish
            displayName: Publish module
            inputs:
              azureSubscription: $(ServiceConnectionName)
              scriptType: 'bash'
              scriptLocation: 'inlineScript'
              inlineScript: |
                az bicep publish \
                  --target 'br:$(ModuleRegistryServer)/$(ModuleName):$(ModuleVersion)' \
                  --file $(ModuleFilePath)
    

    같지 않으면 다음 예제와 일치하도록 업데이트한 후 저장합니다.

  2. Visual Studio Code 터미널에서 다음 명령을 실행하여 변경 내용을 커밋하고 Git 리포지토리에 푸시합니다.

    git add .
    git commit -m "Add lint and publish stages to storage account module pipeline"
    git push
    

    푸시하는 즉시 Azure Pipelines가 새 파이프라인 실행을 시작합니다.

파이프라인 모니터링

  1. 브라우저에서 파이프라인>파이프라인을 선택합니다.

  2. 활성 파이프라인 실행을 선택합니다.

  3. 파이프라인 실행이 표시됩니다.

    파이프라인 실행이 완료될 때까지 기다립니다. Bicep 모듈이 컨테이너 레지스트리에 게시됩니다.

  4. 오늘 날짜와 고유한 수정 번호가 포함된 파이프라인의 빌드 번호를 확인합니다.

레지스트리의 모듈 검토

Azure Portal에서 게시된 모듈을 볼 수도 있습니다.

  1. 브라우저에서 Azure Portal로 이동합니다.

  2. ToyReusable 리소스 그룹으로 이동합니다.

  3. 이전에 만든 컨테이너 레지스트리를 선택합니다.

  4. 메뉴에서 리포지토리 창을 선택합니다. 그런 다음, modules\storage-account 리포지토리를 선택합니다. 그러면 파이프라인에서 게시한 모듈이 표시됩니다.

    Screenshot of the Azure portal that shows a Bicep module in the container registry.

    파이프라인에서 게시한 모듈의 버전 번호와 일치하는 태그가 하나 있습니다. 주 버전(1) 및 부 버전(2)이 metadata.json 파일에서 정의한 버전 번호와 일치합니다. 수정 번호(20230407.3)는 파이프라인의 빌드 번호와 일치합니다.

리소스 정리

이제 연습을 완료했으므로 리소스에 대한 요금이 청구되지 않도록 리소스를 제거할 수 있습니다.

Visual Studio Code 터미널에서 다음 명령을 실행합니다.

az group delete --resource-group ToyReusable --yes --no-wait

리소스 그룹은 백그라운드에서 삭제됩니다.

Remove-AzResourceGroup -Name ToyReusable -Force

서비스 연결 및 Azure DevOps 프로젝트를 제거할 수도 있습니다.

  • 서비스 연결

    1. Azure DevOps 프로젝트에서 프로젝트 설정>서비스 연결을 선택합니다.
    2. ToyReusable을 선택합니다.
    3. 오른쪽 위 모서리에서 추가 작업에 대한 세 개의 점을 선택합니다.
    4. 삭제를 선택하고 삭제를 확인합니다.
  • Azure 앱 등록

    1. 포털 홈페이지에서 Azure Active Directory를 검색하고 서비스 목록에서 선택합니다.
    2. 관리>앱 등록으로 이동합니다.
    3. 삭제된 애플리케이션에서 toy-reusable을 선택합니다.
    4. 영구적으로 삭제를 선택하고 프롬프트를 따릅니다.
  • Azure DevOps 프로젝트

    1. Azure DevOps 프로젝트에서 프로젝트 설정>개요를 선택합니다.
    2. 프로젝트 삭제에서 삭제를 선택합니다.
    3. 프로젝트 이름을 입력하고 삭제를 확인합니다.