Bagikan melalui


Membangun gambar komputer virtual kustom dengan GitHub Actions dan Azure

Mulai menggunakan GitHub Actions dengan membuat alur kerja untuk membangun gambar komputer virtual.

Dengan GitHub Actions, Anda dapat mempercepat proses CI/CD dengan membuat gambar komputer 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 komputer virtual dan set skala komputer virtual.

Tindakan pembuatan citra mesin virtual 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:

Section Tasks
Authentication 1. Tambahkan identitas yang dikelola pengguna.
2. Siapkan service principal atau Open ID Connect.
3. Buat rahasia GitHub.
Membangun 1. Siapkan lingkungan.
2. Bangun aplikasi.
Gambar 1. Buat Gambar VM.
2. Buat komputer virtual.

Membuat identitas yang dikelola pengguna

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

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

  2. Sesuaikan kode JSON ini. 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 Microsoft Azure, buka Azure Compute Gallery Anda dan buka Kontrol akses (IAM).

  5. Pilih opsi Tambahkan penetapan peran. Tetapkan Peran Pembuat Citra ke identitas yang dikelola pengguna Anda.

Menghasilkan kredensial penyebaran

Untuk menggunakan tindakan Azure Login dengan OIDC, Anda perlu mengonfigurasi kredensial identitas gabungan pada aplikasi Microsoft Entra atau identitas terkelola yang ditetapkan pengguna.

Opsi 1: Aplikasi Microsoft Entra

Opsi 2: Identitas terkelola yang ditetapkan pengguna

Membuat rahasia GitHub

Anda perlu memberikan ID Klien, ID Direktori (penyewa), dan ID Langganan aplikasi Anda ke tindakan masuk. Nilai ini bisa disediakan secara langsung di alur kerja atau bisa disimpan di rahasia GitHub dan direferensikan dalam alur kerja Anda. Menyimpan nilai sebagai GitHub rahasia adalah opsi yang lebih aman.

  1. Di GitHub, buka repositori Anda.

  2. Pilih Keamanan > Rahasia dan variabel > Tindakan.

    Cuplikan layar penambahan rahasia

  3. Pilih Rahasia repositori baru.

    Nota

    Untuk meningkatkan keamanan alur kerja di repositori publik, gunakan rahasia lingkungan alih-alih rahasia repositori. Jika lingkungan memerlukan persetujuan, pekerjaan tidak dapat mengakses rahasia lingkungan hingga salah satu peninjau yang diperlukan menyetujuinya.

  4. Membuat rahasia untuk AZURE_CLIENT_ID, AZURE_TENANT_ID, dan AZURE_SUBSCRIPTION_ID. Salin nilai-nilai ini dari aplikasi Microsoft Entra atau identitas terkelola yang ditetapkan pengguna untuk rahasia GitHub Anda:

    Rahasia GitHub Aplikasi Microsoft Entra atau identitas terkelola yang ditetapkan pengguna
    AZURE_CLIENT_ID ID Pelanggan
    AZURE_SUBSCRIPTION_ID (ID Langganan Azure) Identifikasi Langganan
    AZURE_TENANT_ID (ID Penyewa Azure) ID Direktori (Penyewa)

    Nota

    Untuk alasan keamanan, sebaiknya gunakan Rahasia GitHub daripada meneruskan nilai langsung ke alur kerja.

Gunakan tindakan masuk Azure

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

Untuk Open ID Connect, Anda akan menggunakan kredensial federasi yang terkait dengan aplikasi Direktori Aktif Anda.

Untuk informasi selengkapnya tentang merujuk rahasia GitHub dalam file alur kerja, lihat Menggunakan rahasia terenkripsi dalam alur kerja di Dokumen GitHub.

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

Konfigurasikan Java

Siapkan lingkungan Java dengan tindakan Java Setup SDK. Untuk contoh ini, Anda akan menyiapkan lingkungan, membangun dengan Maven, lalu menghasilkan artefak.

Artefak GitHub adalah cara untuk berbagi file dalam alur kerja antar pekerjaan. Anda akan membuat artefak untuk menyimpan file JAR lalu menambahkannya ke gambar komputer 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@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

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, nama grup sumber daya, dan nama identitas terkelola Anda. Ganti nilai {galleryName} dan {imageName} dengan nama galeri gambar dan nama gambar Anda.

Nota

Jika tindakan Membuat Citra yang Sudah Dibuat Aplikasi gagal dengan kesalahan izin, verifikasi bahwa Anda telah menetapkan Peran Pembuat Citra 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

Masukan Diperlukan Description
resource-group-name Yes Grup sumber daya yang digunakan untuk penyimpanan dan pengelolaan artefak selama proses pembangunan.
image-builder-template-name Tidak. Nama sumber daya templat penyusun gambar yang digunakan.
location Yes Lokasi tempat Azure Image Builder akan berjalan. Lihat lokasi yang didukung.
build-timeout-in-minutes Tidak. Waktu setelah build dibatalkan. Diatur ke 240.
vm-size Fakultatif Secara default, Standard_D1_v2 akan digunakan. Lihat ukuran mesin virtual.
managed-identity Yes Identitas yang dikelola pengguna yang Anda buat sebelumnya. Gunakan pengidentifikasi lengkap jika identitas Anda berada dalam grup sumber daya yang berbeda. Gunakan nama jika berada dalam grup sumber daya yang sama.
source-os Yes Jenis OS gambar dasar (Linux atau Windows)
source-image-type Yes Jenis gambar dasar yang akan digunakan untuk membuat gambar kustom.
source-image Yes Pengidentifikasi sumber daya untuk gambar dasar. Gambar sumber harus berada di wilayah Azure yang sama dengan yang ditetapkan dalam nilai input lokasi.
customizer-source Tidak. Direktori tempat Anda dapat menyimpan semua artefak yang perlu ditambahkan ke gambar dasar untuk kustomisasi. Secara default, nilainya adalah ${{ GITHUB.WORKSPACE }}/workflow-artifacts.
customizer-destination Tidak. Ini adalah direktori dalam gambar yang disesuaikan tempat artefak disalin.
customizer-windows-update Tidak. Hanya untuk Windows. Nilai Boolean. Jika true, penyusun gambar akan menjalankan pembaruan Windows di akhir kustomisasi.
dist-location Tidak. Untuk SharedImageGallery, ini adalah dist-type.
dist-image-tags Tidak. Ini adalah tag yang ditentukan pengguna yang ditambahkan ke gambar kustom yang dibuat (misalnya: version:beta).

Membuat komputer virtual Anda

Sebagai langkah terakhir, buat komputer virtual dari gambar Anda.

  1. Ganti pengganti {rgName} dengan nama grup sumber daya Anda.

  2. Tambahkan rahasia GitHub dengan kata sandi komputer virtual (VM_PWD). Pastikan untuk menuliskan kata sandi karena Anda tidak akan dapat melihatnya lagi. Nama pengguna 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 }}"              

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

Langkah selanjutnya