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

완료됨

여러분은 근무하는 장난감 회사에서 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 J S O N file.

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

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

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

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

워크플로 정의 업데이트 및 린팅 작업 추가

리포지토리에는 시작점으로 사용할 수 있는 워크플로 초안이 포함되어 있습니다.

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

  2. module-storage-account.yml 파일을 엽니다.

    Screenshot of Visual Studio Code that shows the location of the workflow definition file.

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

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

    env:
      MODULE_NAME: storage-account
      MODULE_REGISTRY_SERVER: yourregistryname.azurecr.io
      MODULE_FILE_PATH: modules/storage-account/main.bicep
      MODULE_METADATA_FILE_PATH: modules/storage-account/metadata.json
    
  4. 파일 맨 아래에서 To be added라는 주석에 대해 다음과 같은 린팅 작업 정의를 추가합니다.

    jobs:
      lint:
        runs-on: ubuntu-latest
        steps:
        - uses: actions/checkout@v3
        - name: Run Bicep linter
          run: az bicep build --file ${{ env.MODULE_FILE_PATH }}
    

워크플로에 게시 작업 추가

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

  1. storage-account.yml 파일의 맨 아래에 게시 작업 정의의 첫 번째 부분을 추가합니다.

    publish:
      runs-on: ubuntu-latest
      needs: [ lint ]
      steps:
      - uses: actions/checkout@v3
      - uses: azure/login@v1
        name: Sign in to Azure
        with:
          client-id: ${{ secrets.AZURE_CLIENT_ID }}
          tenant-id: ${{ secrets.AZURE_TENANT_ID }}
          subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
    

    이 단계에서는 리포지토리의 코드를 체크 아웃하고 Azure에 로그인합니다.

  2. 방금 추가한 코드 아래에 모듈의 metadata.json 파일에서 버전 번호를 읽고 환경 변수로 설정하는 단계를 추가합니다.

    - name: Get module version number
      run: |
        majorMinorVersionNumber=$(jq '(.version.major | tostring) + "." + (.version.minor | tostring)' ${{ env.MODULE_METADATA_FILE_PATH }} -r )
        versionNumber="$majorMinorVersionNumber.${{ github.run_number }}"
        echo "MODULE_VERSION=$versionNumber" >> $GITHUB_ENV
    

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

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

    - uses: azure/cli@v1
      name: Publish module
      with:
        inlineScript: |
          az bicep publish \
            --target 'br:${{ env.MODULE_REGISTRY_SERVER }}/${{ env.MODULE_NAME }}:${{ env.MODULE_VERSION }}' \
            --file ${{ env.MODULE_FILE_PATH }}
    

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

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

워크플로 정의 확인 및 커밋

  1. module-storage-account.yml 파일이 다음 예제와 비슷한지 확인합니다.

    name: module-storage-account
    concurrency: module-storage-account
    
    on:
      workflow_dispatch:
      push:
        branches:
          - main
        paths:
          - 'modules/storage-account/**'
    
    permissions:
      id-token: write
      contents: read
    
    env:
      MODULE_NAME: storage-account
      MODULE_REGISTRY_SERVER: yourregistryname.azurecr.io
      MODULE_FILE_PATH: modules/storage-account/main.bicep
      MODULE_METADATA_FILE_PATH: modules/storage-account/metadata.json
    
    jobs:
      lint:
        runs-on: ubuntu-latest
        steps:
        - uses: actions/checkout@v3
        - name: Run Bicep linter
          run: az bicep build --file ${{ env.MODULE_FILE_PATH }}
    
      publish:
        runs-on: ubuntu-latest
        needs: [ lint ]
        steps:
        - uses: actions/checkout@v3
        - uses: azure/login@v1
          name: Sign in to Azure
          with:
            client-id: ${{ secrets.AZURE_CLIENT_ID }}
            tenant-id: ${{ secrets.AZURE_TENANT_ID }}
            subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
        - name: Get module version number
          run: |
            majorMinorVersionNumber=$(jq '(.version.major | tostring) + "." + (.version.minor | tostring)' ${{ env.MODULE_METADATA_FILE_PATH }} -r )
            versionNumber="$majorMinorVersionNumber.${{ github.run_number }}"
            echo "MODULE_VERSION=$versionNumber" >> $GITHUB_ENV
        - uses: azure/cli@v1
          name: Publish module
          with:
            inlineScript: |
              az bicep publish \
                --target 'br:${{ env.MODULE_REGISTRY_SERVER }}/${{ env.MODULE_NAME }}:${{ env.MODULE_VERSION }}' \
                --file ${{ env.MODULE_FILE_PATH }}
    

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

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

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

워크플로 트리거

  1. 브라우저에서 GitHub 리포지토리로 이동하여 작업 탭을 선택합니다.

  2. module-storage-account 워크플로를 선택합니다.

    워크플로 실행이 이미 진행 중입니다. 모듈의 폴더 내에서 metadata.json 파일을 수정했기 때문에 푸시 트리거가 발생했습니다.

  3. 목록에서 마지막 실행을 선택합니다.

    Screenshot of GitHub that highlights the latest run of the module's workflow.

    워크플로 실행이 완료될 때까지 기다립니다. Bicep 모듈이 컨테이너 레지스트리에 게시됩니다.

    워크플로의 실행 번호(아마도 3)를 봅니다.

레지스트리의 모듈 검토

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 파일에서 정의한 버전 번호와 일치합니다. 수정 번호(3)는 워크플로 실행 번호와 일치합니다.

리소스 정리

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

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

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

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

Remove-AzResourceGroup -Name ToyReusable -Force

GitHub 비밀 및 리포지토리, Azure 워크로드 ID를 제거할 수도 있습니다.

  • GitHub 비밀

    1. GitHub 리포지토리에서 설정>비밀 및 변수>작업으로 이동합니다.
    2. 각 리포지토리 비밀에 대해 비밀 제거를 선택하고 프롬프트를 따릅니다.
  • GitHub 리포지토리

    1. 설정>일반으로 이동합니다.
    2. 이 리포지토리 삭제를 선택하고 프롬프트를 따릅니다.
  • Azure 앱 등록의 페더레이션 자격 증명 및 서비스 원칙.

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

    중요

    중복된 앱 등록 및 서비스 주체 이름이 있을 수 있습니다. 올바른 리소스를 삭제하고 있는지 확인하려면 애플리케이션 ID를 확인하는 것이 좋습니다.