Aracılığıyla paylaş


GitHub Actions ve Azure ile özel sanal makine görüntüleri oluşturma

Sanal makine görüntüsü oluşturmak için bir iş akışı oluşturarak GitHub Actions'ı kullanmaya başlayın.

GitHub Actions ile iş akışlarınızdaki yapıtlarla özel sanal makine görüntüleri oluşturarak CI/CD işleminizi hızlandırabilirsiniz. Hem görüntü oluşturabilir hem de bunları Paylaşılan Görüntü Galerisi'ne dağıtabilirsiniz.

Ardından bu görüntüleri kullanarak sanal makineler ve sanal makine ölçek kümeleri oluşturabilirsiniz.

Sanal makine görüntüsü oluşturma eylemi , Azure Image Builder hizmetini kullanır.

Önkoşullar

İş akışı dosyasına genel bakış

İş akışı, deponuzdaki yoldaki /.github/workflows/ bir YAML (.yml) dosyası tarafından tanımlanır. Bu tanım, iş akışını oluşturan çeşitli adımları ve parametreleri içerir.

Dosyanın üç bölümü vardır:

Bölüm Görevler
Kimlik Doğrulaması 1. Kullanıcı tarafından yönetilen bir kimlik ekleyin.
2. Hizmet sorumlusu veya Open ID Connect ayarlayın.
3. GitHub gizli anahtarı oluşturun.
İnşa Et 1. Ortamı ayarlayın.
2. Uygulamayı oluşturun.
Resim 1. VM Görüntüsü oluşturun.
2. Bir sanal makine oluşturun.

Kullanıcı tarafından yönetilen kimlik oluşturma

Görüntüleri dağıtmak için Azure Görüntü Oluşturucusu(AIB) için kullanıcı tarafından yönetilen bir kimliğe ihtiyacınız olacaktır. Azure kullanıcı tarafından atanan yönetilen kimliğiniz, görüntü derlemesi sırasında Paylaşılan Görüntü Galerisi'nde görüntüleri okumak ve yazmak için kullanılır.

  1. Azure CLI veya Azureportalı ile kullanıcı tarafından yönetilen bir kimlik oluşturun. Yönetilen kimliğinizin adını yazın.

  2. Bu JSON kodunu özelleştirin. {subscriptionID} ve {rgName} tutucularını abonelik kimliğiniz ve kaynak grubu adınızla değiştirin.

    {
    "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 ile yeni bir özel rol oluşturmak için bu JSON kodunu kullanın.

  4. Azure portalında Azure İşlem Galerinizi açın ve Erişim denetimi (IAM) bölümüne gidin.

  5. Rol ataması ekle'yi seçin ve Görüntü Oluşturma Rolünü kullanıcı tarafından yönetilen kimliğinize atayın.

Dağıtım kimlik bilgileri oluşturma

OIDC ile Azure Oturum Açma eylemini kullanmak için, Microsoft Entra uygulamasında veya kullanıcı tarafından atanan yönetilen kimlikte federasyon kimlik bilgilerini yapılandırmanız gerekir.

Seçenek 1: Microsoft Entra uygulaması

Seçenek 2: Kullanıcı tarafından atanan yönetilen kimlik

GitHub sırları oluştur

Oturum açma eylemine uygulamanızın İstemci Kimliğini, Dizin (kiracı) Kimliğini ve Abonelik Kimliğini sağlamanız gerekir. Bu değerler doğrudan iş akışında sağlanabilir veya GitHub gizli dizilerinde depolanabilir ve iş akışınızda başvurulabilir. Değerleri GitHub gizli dizileri olarak kaydetmek daha güvenli bir seçenektir.

  1. GitHub'da deponuza gidin.

  2. >.

    Gizli ekleme ekran görüntüsü

  3. Yeni depo gizli anahtarını seçin.

    Uyarı

    Genel depolarda iş akışı güvenliğini geliştirmek için depo gizli dizileri yerine ortam gizli dizilerini kullanın. Eğer ortam onay gerektiriyorsa, biri gerekli gözden geçirenlerden onaylayana kadar görev ortamın gizli verilerine erişemez.

  4. AZURE_CLIENT_ID, AZURE_TENANT_ID ve AZURE_SUBSCRIPTION_ID için gizli bilgiler oluşturun. Bu değerleri GitHub gizli dizileriniz için Microsoft Entra uygulamanızdan veya kullanıcı tarafından atanan yönetilen kimlikten kopyalayın:

    GitHub gizli anahtarı Microsoft Entra uygulaması veya kullanıcı tarafından atanan yönetilen kimlik
    AZURE_CLIENT_ID Müşteri Kimliği
    AZURE_ABONELİK_KİMLİĞİ Abonelik Kimliği
    AZURE_TENANT_ID Dizin (kullanıcı) kimliği

    Uyarı

    Güvenlik nedeniyle, değerleri doğrudan iş akışına geçirmek yerine GitHub Gizli Dizilerini kullanmanızı öneririz.

Azure oturum açma eylemini kullanma

Azure'a kimlik doğrulama yapmak için GitHub gizli bilgilerinizi Azure Oturum Açma eylemi ile kullanın.

Open ID Connect için Active Directory uygulamanızla ilişkilendirilmiş federasyon kimlik bilgilerini kullanacaksınız.

Bir iş akışı dosyasında GitHub gizli dizilerine başvurma hakkında daha fazla bilgi için bkz. GitHub Docs'ta bir iş akışında şifrelenmiş gizli dizileri kullanma .

on: [push]

name: Create Custom VM Image

jobs:
  build-image:
    runs-on: ubuntu-latest
    steps:
      - name: Log in with Azure
        uses: azure/login@v2
        with:
          client-id: ${{ secrets.AZURE_CLIENT_ID }}
          tenant-id: ${{ secrets.AZURE_TENANT_ID }}
          subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}

Java'yı yapılandırma

Java Kurulum SDK'sı eylemiyle Java ortamını ayarlayın. Bu örnekte ortamı ayarlayıp Maven ile derleyip bir yapıt çıkaracaksınız.

GitHub yapıtları , iş akışındaki dosyaları işler arasında paylaşmanın bir yoludur. JAR dosyasını tutmak için bir yapıt oluşturacak ve ardından sanal makine görüntüsüne ekleyeceksiniz.

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@v2
      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

Görüntünüzü oluşturma

Özel bir sanal makine görüntüsü oluşturmak için Azure Sanal Makine Görüntüsü Oluştur eylemini kullanın.

Yer tutucuları {subscriptionID}, {rgName} ve {Identity} ile abonelik kimliğiniz, kaynak grubu adınız ve yönetilen kimlik adınızla değiştirin. {galleryName} ve {imageName} değerlerini, görüntü galerisi adınız ve görüntü adınız ile değiştirin.

Uyarı

Uygulama Pişirilmiş Görüntü Oluştur eylemi bir izin hatasıyla başarısız olursa, kullanıcı tarafından yönetilen kimliğinize Görüntü Oluşturma Rolü atadığınızdan emin olun.

    - 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'

Sanal Makine Eylem Parametreleri

Veri Girişi Gerekli Description
resource-group-name Yes Derleme işlemi sırasında yapıtları depolamak ve kaydetmek için kullanılan kaynak grubu.
image-builder-template-name Hayı Kullanılan görüntü oluşturucu şablon kaynağının adı.
location Yes Azure Image Builder'ın çalıştırılacağı konum. Desteklenen konumlara bakın.
build-timeout-in-minutes Hayı Derlemenin iptal edileceği zaman dilimi. Varsayılan değer 240'tır.
vm-size Opsiyonel Varsayılan olarak Standard_D1_v2 kullanılır. Bkz. sanal makine boyutları.
managed-identity Yes Daha önce oluşturduğunuz kullanıcı tarafından yönetilen kimlik. Kimliğiniz farklı bir kaynak grubundaysa tam tanımlayıcıyı kullanın. Aynı kaynak grubundaysa adı kullanın.
source-os Yes Temel görüntünün işletim sistemi türü (Linux veya Windows)
source-image-type Yes Özel görüntü oluşturmak için kullanılacak temel görüntü türü.
source-image Yes Temel görüntünün kaynak tanımlayıcısı. Kaynak görüntü, konumun giriş değerinde ayarlanan aynı Azure bölgesinde bulunmalıdır.
customizer-source Hayı Özelleştirme için temel görüntüye eklenmesi gereken tüm yapıtları tutabileceğiniz dizin. Varsayılan olarak, değer şu şekildedir: ${{ GITHUB.WORKSPACE }}/workflow-artifacts.
customizer-destination Hayı Bu, özelleştirilmiş görüntüde yapıtların kopyalandığı dizindir.
customizer-windows-update Hayı Yalnızca Windows için. Boole değeri. ise true, görüntü oluşturucu özelleştirmelerin sonunda Windows update'i çalıştırır.
dist-location Hayı SharedImageGallery için bu değeridir dist-type.
dist-image-tags Hayı Bunlar, oluşturulan özel görüntüye eklenen kullanıcı tanımlı etiketlerdir (örnek: version:beta).

Sanal makinenizi oluşturma

Son adım olarak, görüntünüzden bir sanal makine oluşturun.

  1. Yer tutucularını {rgName} kaynak grubu adınızla değiştirin.

  2. Sanal makine parolasıVM_PWD ile bir GitHub gizli anahtarı ekleyin. Parolayı bir daha göremeyeceğiniz için not edin. Kullanıcı adı şeklindedir 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'i tamamlama

  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@v2
        with:
          client-id: ${{ secrets.AZURE_CLIENT_ID }}
          tenant-id: ${{ secrets.AZURE_TENANT_ID }}
          subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}

      - 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 }}"              

Sonraki Adımlar