Buat gambar komputer virtual kustom dengan Tindakan GitHub dan Azure

Mulai dengan GitHub Actions dengan membuat alur kerja untuk membuat dan memindai citra komputer virtual.

Dengan Tindakan GitHub, Anda dapat mempercepat proses CI/CD dengan membuat gambar mesin virtual kustom dengan artefak dari alur kerja Anda. Anda dapat membuat gambar dan mendistribusikannya ke Shared Image Gallery.

Anda kemudian dapat menggunakan gambar-gambar ini untuk membuat mesin virtual dan set skala mesin virtual.

Tindakan gambar mesin virtual build menggunakan layanan Azure Image Builder.

Prasyarat

Gambaran umum file alur kerja

Sebuah alur kerja ditentukan oleh file YAML (.yml) pada jalur /.github/workflows/ di dalam repositori Anda. Definisi ini berisi berbagai langkah dan parameter yang membentuk alur kerja.

File memiliki tiga bagian:

Bagian Tugas
Autentikasi 1. Tambahkan identitas yang dikelola pengguna.
2. Siapkan perwakilan layanan atau Open ID Koneksi.
3. Buat rahasia GitHub.
Build 1. Siapkan lingkungan.
2. Buat aplikasi.
Gambar 1. Buat Citra VM.
2. Buat mesin virtual.

Membuat identitas yang dikelola pengguna

Anda akan memerlukan identitas yang dikelola pengguna untuk Azure Image Builder(AIB) untuk mendistribusikan gambar. Identitas terkelola yang ditetapkan pengguna Azure Anda akan digunakan selama pembuatan gambar untuk membaca dan menulis gambar ke Shared Image Gallery.

  1. Buat identitas yang dikelola pengguna dengan Azure CLI atau portal Azure. Tuliskan nama identitas terkelola Anda.

  2. Sesuaikan kode JSON ini. Dalam contoh tersebut, ganti tempat penampung untuk {subscriptionID} dan {rgName} dengan ID langganan dan nama grup sumber daya Anda.

    {
    "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. Gunakan kode JSON ini untuk membuat peran kustom baru dengan JSON.

  4. Di portal Azure, buka Azure Compute Gallery Anda dan buka Kontrol akses (IAM).

  5. Pilih Tambahkan penetapan peran dan tetapkan Peran Pembuatan Gambar ke identitas yang dikelola pengguna Anda.

Membuat info masuk penyebaran

Buatlah perwakilan layanan dengan perintah az ad sp create-for-rbac di Azure CLI. Jalankan perintah ini dengan Azure Cloud Shell di portal Microsoft Azure atau dengan memilih tombol Coba.

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

Parameter --json-auth tersedia dalam versi >Azure CLI = 2.51.0. Versi sebelum penggunaan --sdk-auth ini dengan peringatan penghentian.

Pada contoh di atas, ganti tempat penampung dengan ID langganan, nama grup sumber daya, dan nama aplikasi Anda. Output adalah objek JSON dengan kredensial penetapan peran yang menyediakan akses ke App Service yang serupa di bawah ini. Salin objek JSON ini untuk nanti.

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

Membuat rahasia GitHub

  1. Di GitHub, buka repositori Anda.

  2. Buka Pengaturan di menu navigasi.

  3. Pilih Tindakan Rahasia keamanan > dan variabel>.

    Screenshot of adding a secret

  4. Pilih Rahasia repositori baru.

  5. Tempelkan seluruh output JSON dari perintah CLI Azure ke bidang nilai rahasia. Namai rahasia sebagai AZURE_CREDENTIALS.

  6. Pilih Tambahkan rahasia.

Gunakan tindakan masuk Azure

Gunakan rahasia GitHub Anda dengan tindakan Masuk Azure untuk mengautentikasi ke Azure.

Dalam alur kerja ini, Anda mengautentikasi menggunakan tindakan login Azure dengan detail perwakilan layanan yang disimpan di secrets.AZURE_CREDENTIALS. Kemudian, Anda menjalankan tindakan Azure CLI. Untuk informasi selengkapnya tentang merujuk rahasia GitHub dalam file alur kerja, lihat Menggunakan rahasia terenkripsi dalam alur kerja di 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 }}'

Konfigurasikan Java

Siapkan lingkungan Java dengan tindakan Java Setup SDK. Untuk contoh ini, Anda akan mengatur lingkungan, membangun dengan Maven, dan kemudian mengeluarkan artefak.

Artefak GitHub adalah cara untuk berbagi file dalam alur kerja di antara pekerjaan. Anda akan membuat artefak untuk menahan file JAR dan kemudian menambahkannya ke gambar mesin virtual.

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

Membuat citra

Gunakan tindakan Build Azure Virtual Machine Image untuk membuat gambar komputer virtual kustom.

Ganti tempat penampung untuk {subscriptionID}, {rgName}dan {Identity} dengan ID langganan Anda, nama grup sumber daya, dan nama identitas terkelola. Ganti nilai {galleryName} dan {imageName} dengan nama galeri gambar dan nama gambar Anda.

Catatan

Jika tindakan Buat Gambar Panggang Aplikasi gagal dengan kesalahan izin, verifikasi bahwa Anda telah menetapkan Peran Pembuatan Gambar ke identitas yang dikelola pengguna Anda.

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

Argumen tindakan Mesin Virtual

Input Wajib Deskripsi
resource-group-name Ya Grup sumber daya yang digunakan untuk penyimpanan dan menyimpan artefak selama proses pembuatan.
image-builder-template-name No Nama sumber daya templat builder gambar yang digunakan.
location Ya Lokasi tempat Azure Image Builder akan berjalan. Lihat lokasi yang didukung.
build-timeout-in-minutes No Waktu setelah build dibatalkan. Default ke 240.
vm-size Opsional Secara default, Standard_D1_v2 akan digunakan. Lihat ukuran komputer virtual.
managed-identity Ya Identitas terkelola yang Anda buat sebelumnya. Gunakan pengidentifikasi lengkap jika identitas Anda berada dalam grup sumber daya yang berbeda. Gunakan nama tersebut jika berada dalam grup sumber daya yang sama.
source-os Ya Jenis OS dari gambar dasar (Linux atau Windows)
source-image-type Ya Jenis gambar dasar yang akan digunakan untuk membuat gambar kustom.
source-image Ya Pengenal sumber daya untuk gambar dasar. Gambar sumber harus ada di wilayah Azure yang sama yang ditetapkan dalam nilai input lokasi.
customizer-source No Direktori tempat Anda dapat menyimpan semua artefak yang perlu ditambahkan ke gambar dasar untuk penyesuaian. Secara default, nilainya adalah ${{ GITHUB.WORKSPACE }}/workflow-artifacts.
customizer-destination No Ini adalah direktori dalam gambar yang disesuaikan tempat salinan artefak.
customizer-windows-update No Hanya untuk Windows. Nilai boolean. Jika true, pembuat gambar akan menjalankan pembaruan Windows di akhir penyesuaian.
dist-location No Untuk SharedImageGallery, ini adalah dist-type.
dist-image-tags No Ini adalah tag yang ditentukan pengguna yang ditambahkan ke gambar kustom yang dibuat (contoh: version:beta).

Hapus mesin virtual Anda

Sebagai langkah terakhir, buat mesin virtual dari gambar Anda.

  1. Ganti tempat penampung untuk {rgName} dengan nama grup sumber daya Anda.

  2. Tambahkan rahasia GitHub dengan kata sandi mesin virtual (VM_PWD). Pastikan untuk menuliskan kata sandi karena Anda tidak akan dapat melihatnya lagi. Nama penggunanya adalah 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 lengkap

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

Langkah berikutnya