GitHub Actions 및 Azure를 사용하여 사용자 지정 가상 머신 이미지 빌드

가상 머신 이미지를 빌드하는 워크플로를 만들어 GitHub Actions를 시작하세요.

GitHub Actions를 사용하면 워크플로의 아티팩트를 사용하여 사용자 지정 가상 머신 이미지를 만들어 CI/CD 프로세스의 속도를 높일 수 있습니다. 이미지를 빌드하고 공유 이미지 갤러리배포할 수 있습니다.

그런 다음 이러한 이미지를 사용하여 가상 머신 및 가상 머신 확장 집합을 만들 수 있습니다.

빌드 가상 머신 이미지 작업은 Azure Image Builder 서비스를 사용합니다.

필수 조건

워크플로 파일 개요

워크플로는 리포지토리의 경로에 /.github/workflows/ 있는 YAML(.yml) 파일에 의해 정의됩니다. 이 정의에는 워크플로를 구성하는 다양한 단계 및 매개 변수가 포함됩니다.

파일에는 세 개의 섹션이 있습니다.

섹션 작업
인증 1. 사용자 관리 ID를 추가합니다.
2. 서비스 주체 또는 Open ID 커넥트 설정합니다.
3. GitHub 비밀을 만듭니다.
빌드 1. 환경을 설정합니다.
2. 앱을 빌드합니다.
이미지 1. VM 이미지를 만듭니다.
2. 가상 머신을 만듭니다.

사용자 관리 ID 만들기

이미지를 배포하려면 AIB(Azure Image Builder)에 대한 사용자 관리 ID가 필요합니다. Azure 사용자 할당 관리 ID는 이미지를 빌드하는 동안 공유 이미지 갤러리에 이미지를 읽고 쓰는 데 사용됩니다.

  1. Azure CLI 또는 Azure Portal을 사용하여 사용자 관리 ID를 만듭니다. 관리 ID의 이름을 적어 씁니다.

  2. 이 JSON 코드를 사용자 지정합니다. 자리 표시자를 {subscriptionID} 구독 ID 및 {rgName}리소스 그룹 이름으로 바꿉니다.

    {
    "properties": {
        "roleName": "Image Creation Role",
        "IsCustom": true,
        "description": "Azure Image Builder access to create resources for the image build",
        "assignableScopes": [
          "/subscriptions/{subscriptionID}/resourceGroups/{rgName}"
        ],
        "permissions": [
            {
                "actions": [
                    "Microsoft.Compute/galleries/read",
                    "Microsoft.Compute/galleries/images/read",
                    "Microsoft.Compute/galleries/images/versions/read",
                    "Microsoft.Compute/galleries/images/versions/write",
                    "Microsoft.Compute/images/write",
                    "Microsoft.Compute/images/read",
                    "Microsoft.Compute/images/delete"
                ],
                "notActions": [],
                "dataActions": [],
                "notDataActions": []
            }
        ]
        } 
    } 
    
  3. 이 JSON 코드를 사용하여 JSON을 사용하여 새 사용자 지정 역할을 만듭니다.

  4. Azure Portal에서 Azure Compute 갤러리를 열고 액세스 제어(IAM)로 이동합니다.

  5. 역할 할당 추가를 선택하고 사용자 관리 ID에 이미지 만들기 역할을 할당합니다.

배포 자격 증명 생성

Azure CLI에서 az ad sp create-for-rbac 명령을 사용하여 서비스 주체를 만듭니다. 이 명령은 Azure Portal에서 Azure Cloud Shell을 사용하거나 사용해 보세요 단추를 선택하여 실행합니다.

az ad sp create-for-rbac --name "myML" --role contributor \
                            --scopes /subscriptions/<subscription-id>/resourceGroups/<group-name> \
                            --json-auth

매개 변수 --json-auth 는 Azure CLI 버전 >= 2.51.0에서 사용할 수 있습니다. 사용 중단 경고와 함께 사용하기 --sdk-auth 이전 버전입니다.

위의 예시에서 자리 표시자를 구독 ID, 리소스 그룹 이름 및 앱 이름으로 바꿉니다. 출력은 아래와 비슷한 App Service 앱에 대한 액세스를 제공하는 역할 할당 자격 증명이 있는 JSON 개체입니다. 나중에 사용할 수 있도록 이 JSON 개체를 복사합니다.

  {
    "clientId": "<GUID>",
    "clientSecret": "<GUID>",
    "subscriptionId": "<GUID>",
    "tenantId": "<GUID>",
    (...)
  }

GitHub 비밀 만들기

  1. GitHub에서 리포지토리로 이동합니다.

  2. 탐색 메뉴에서 설정으로 이동합니다.

  3. 보안 > 비밀 및 변수 > 작업을 선택합니다.

    Screenshot of adding a secret

  4. 새 리포지토리 비밀을 선택합니다.

  5. Azure CLI 명령의 전체 JSON 출력을 비밀의 값 필드에 붙여넣습니다. 비밀 이름을 AZURE_CREDENTIALS으로 지정합니다.

  6. 비밀 추가를 선택합니다.

Azure 로그인 작업 사용

Azure 로그인 작업과 함께 GitHub 비밀을 사용하여 Azure에 인증합니다.

이 워크플로에서는 에 저장된 서비스 주체 세부 정보와 함께 Azure 로그인 작업을 사용하여 인증합니다 secrets.AZURE_CREDENTIALS. 그런 다음, Azure CLI 작업을 실행합니다. 워크플로 파일의 GitHub 비밀 참조에 대한 자세한 내용은 GitHub Docs의 워크플로에서 암호화된 비밀 사용을 참조하세요.

on: [push]

name: Create Custom VM Image

jobs:
  build-image:
    runs-on: ubuntu-latest
    steps:
      - name: Log in with Azure
        uses: azure/login@v1
        with:
          creds: '${{ secrets.AZURE_CREDENTIALS }}'

Java 구성

Java SDK 설정 작업을 사용하여 Java 환경을 설정합니다. 이 예제에서는 환경을 설정하고 Maven을 사용하여 빌드한 다음 아티팩트를 출력합니다.

GitHub 아티팩 트는 작업 간에 워크플로의 파일을 공유하는 방법입니다. JAR 파일을 보관할 아티팩트를 만든 다음 가상 머신 이미지에 추가합니다.

on: [push]

name: Create Custom VM Image

jobs:
  build-image:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        java: [ '17' ]

    steps:
    - name: Checkout
      uses: actions/checkout@v3    

    - name: Login via Az module
      uses: azure/login@v1
      with:
        creds: ${{secrets.AZURE_CREDENTIALS}}

    - name: Set up JDK ${{matrix.java}}
      uses: actions/setup-java@v2
      with:
        java-version: ${{matrix.java}}
        distribution: 'adopt'
        cache: maven
    - name: Build with Maven Wrapper
      run: ./mvnw -B package
        
    - name: Build Java
      run: mvn --batch-mode --update-snapshots verify

    - run: mkdir staging && cp target/*.jar staging
    - uses: actions/upload-artifact@v2
      with:
        name: Package
        path: staging

이미지 빌드

Azure Virtual Machine 이미지 빌드 작업을 사용하여 사용자 지정 가상 머신 이미지를 만듭니다.

{subscriptionID}, {rgName}, {Identity}의 자리 표시자를 구독 ID, 리소스 그룹 이름 및 관리 ID 이름으로 바꿉니다. 값과 {galleryName}{imageName} 이미지 갤러리 이름 및 이미지 이름으로 바꿉다.

참고 항목

권한 오류로 앱 구운 이미지 만들기 작업이 실패하는 경우 사용자 관리 ID에 이미지 만들기 역할을 할당했는지 확인합니다.

    - name: Create App Baked Image
      id: imageBuilder
      uses: azure/build-vm-image@v0
      with:
        location: 'eastus2'
        resource-group-name: '{rgName}'
        managed-identity: '{Identity}' # Managed identity
        source-os-type: 'windows'
        source-image-type: 'platformImage'
        source-image: MicrosoftWindowsServer:WindowsServer:2019-Datacenter:latest #unique identifier of source image
        dist-type: 'SharedImageGallery'
        dist-resource-id: '/subscriptions/{subscriptionID}/resourceGroups/{rgName}/providers/Microsoft.Compute/galleries/{galleryName}/images/{imageName}/versions/0.1.${{ GITHUB.RUN_ID }}' #Replace with the resource id of your shared image  gallery's image definition
        dist-location: 'eastus2'

Virtual Machine 작업 인수

입력 Required 설명
resource-group-name 빌드 프로세스 중에 스토리지 및 아티팩트 저장용으로 사용되는 리소스 그룹입니다.
image-builder-template-name 아니요 사용되는 이미지 작성기 템플릿 리소스의 이름입니다.
location Azure Image Builder가 실행되는 위치입니다. 지원되는 위치를 참조하세요.
build-timeout-in-minutes 아니요 빌드가 취소된 시간입니다. 기본값은 240입니다.
vm-size 선택 사항 기본적으로 Standard_D1_v2이 사용됩니다. 가상 머신 크기를 참조 하세요.
managed-identity 이전에 만든 사용자 관리 ID입니다. ID가 다른 리소스 그룹에 있는 경우 전체 식별자를 사용합니다. 동일한 리소스 그룹에 있는 경우 이름을 사용합니다.
source-os 기본 이미지의 OS 유형(Linux 또는 Windows)
source-image-type 사용자 지정 이미지를 만드는 데 사용할 기본 이미지 형식입니다.
source-image 기본 이미지의 리소스 식별자입니다. 원본 이미지는 위치의 입력 값에 설정된 동일한 Azure 지역에 있어야 합니다.
customizer-source 아니요 사용자 지정을 위해 기본 이미지에 추가해야 하는 모든 아티팩트를 보관할 수 있는 디렉터리입니다. 기본적으로 값은 ${{ GITHUB.WORKSPACE }}/workflow-artifacts.입니다.
customizer-destination 아니요 아티팩트가 복사되는 사용자 지정된 이미지의 디렉터리입니다.
customizer-windows-update 아니요 Windows에만 해당합니다. 부울 값을 지정합니다. 이 경우 true이미지 작성기에서 사용자 지정이 끝날 때 Windows 업데이트를 실행합니다.
dist-location 아니요 SharedImageGallery의 경우에는 dist-type입니다.
dist-image-tags 아니요 생성된 사용자 지정 이미지에 추가되는 사용자 정의 태그입니다(예: version:beta).

가상 머신 만들기

마지막 단계로 이미지에서 가상 머신을 만듭니다.

  1. {rgName}의 자리 표시자를 리소스 그룹 이름으로 바꿉니다.

  2. 가상 머신 암호(VM_PWD)를 사용하여 GitHub 비밀을 추가합니다. 이 암호는 다시 볼 수 없으므로 기록해 두어야 합니다. 사용자 이름은 .입니다 myuser.

    - name: CREATE VM
      uses: azure/CLI@v1
      with:
        azcliversion: 2.0.72
        inlineScript: |
        az vm create --resource-group ghactions-vMimage  --name "app-vm-${{ GITHUB.RUN_NUMBER }}"  --admin-username myuser --admin-password "${{ secrets.VM_PWD }}" --location  eastus2 \
            --image "${{ steps.imageBuilder.outputs.custom-image-uri }}"              

YAML 완료

  on: [push]

  name: Create Custom VM Image

  jobs:
    build-image:
      runs-on: ubuntu-latest    
      steps:
      - name: Checkout
        uses: actions/checkout@v2    

      - name: Login via Az module
        uses: azure/login@v1
        with:
          creds: ${{secrets.AZURE_CREDENTIALS}}

      - name: Setup Java 1.8.x
        uses: actions/setup-java@v1
        with:
          java-version: '1.8.x'
          
      - name: Build Java
        run: mvn --batch-mode --update-snapshots verify

      - run: mkdir staging && cp target/*.jar staging
      - uses: actions/upload-artifact@v2
        with:
          name: Package
          path: staging

      - name: Create App Baked Image
        id: imageBuilder
        uses: azure/build-vm-image@v0
        with:
          location: 'eastus2'
          resource-group-name: '{rgName}'
          managed-identity: '{Identity}' # Managed identity
          source-os-type: 'windows'
          source-image-type: 'platformImage'
          source-image: MicrosoftWindowsServer:WindowsServer:2019-Datacenter:latest #unique identifier of source image
          dist-type: 'SharedImageGallery'
          dist-resource-id: '/subscriptions/{subscriptionID}/resourceGroups/{rgName}/providers/Microsoft.Compute/galleries/{galleryName}/images/{imageName}/versions/0.1.${{ GITHUB.RUN_ID }}' #Replace with the resource id of your shared image  gallery's image definition
          dist-location: 'eastus2'

      - name: CREATE VM
        uses: azure/CLI@v1
        with:
          azcliversion: 2.0.72
          inlineScript: |
          az vm create --resource-group ghactions-vMimage  --name "app-vm-${{ GITHUB.RUN_NUMBER }}"  --admin-username myuser --admin-password "${{ secrets.VM_PWD }}" --location  eastus2 \
              --image "${{ steps.imageBuilder.outputs.custom-image-uri }}"              

다음 단계