Tworzenie niestandardowych obrazów maszyn wirtualnych za pomocą funkcji GitHub Actions i platformy Azure

Rozpocznij pracę z funkcją GitHub Actions , tworząc przepływ pracy w celu utworzenia obrazu maszyny wirtualnej.

Za pomocą funkcji GitHub Actions możesz przyspieszyć proces ciągłej integracji/ciągłego wdrażania, tworząc niestandardowe obrazy maszyn wirtualnych z artefaktami z przepływów pracy. Obrazy można tworzyć i rozpowszechniać w galerii obrazów udostępnionych.

Następnie możesz użyć tych obrazów do tworzenia maszyn wirtualnych i zestawów skalowania maszyn wirtualnych.

Akcja tworzenia obrazu maszyny wirtualnej korzysta z usługi Azure Image Builder.

Wymagania wstępne

Omówienie pliku przepływu pracy

Przepływ pracy jest definiowany przez plik YAML (.yml) w /.github/workflows/ ścieżce w repozytorium. Ta definicja zawiera różne kroki i parametry tworzące przepływ pracy.

Plik zawiera trzy sekcje:

Sekcja Zadania
Authentication 1. Dodaj tożsamość zarządzaną przez użytkownika.
2. Skonfiguruj jednostkę usługi lub Połączenie Identyfikator open ID.
3. Utwórz wpis tajny usługi GitHub.
Kompilacja 1. Skonfiguruj środowisko.
2. Skompiluj aplikację.
Obraz 1. Utwórz obraz maszyny wirtualnej.
2. Utwórz maszynę wirtualną.

Tworzenie tożsamości zarządzanej przez użytkownika

Do dystrybuowania obrazów będzie potrzebna tożsamość zarządzana przez użytkownika dla narzędzia Azure Image Builder (AIB). Tożsamość zarządzana przypisana przez użytkownika platformy Azure będzie używana podczas kompilacji obrazu do odczytywania i zapisywania obrazów w galerii obrazów udostępnionych.

  1. Utwórz tożsamość zarządzaną przez użytkownika przy użyciu interfejsu wiersza polecenia platformy Azure lub witryny Azure Portal. Zapisz nazwę tożsamości zarządzanej.

  2. Dostosuj ten kod JSON. Zastąp symbole zastępcze wartości {subscriptionID} i {rgName}identyfikatorem subskrypcji i nazwą grupy zasobów.

    {
    "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. Użyj tego kodu JSON, aby utworzyć nową rolę niestandardową w formacie JSON.

  4. W witrynie Azure Portal otwórz galerię usługi Azure Compute i przejdź do pozycji Kontrola dostępu (Zarządzanie dostępem i tożsamościami).

  5. Wybierz pozycję Dodaj przypisanie roli i przypisz rolę tworzenia obrazu do tożsamości zarządzanej przez użytkownika.

Generowanie poświadczeń wdrożenia

Utwórz jednostkę usługi za pomocą polecenia az ad sp create-for-rbac w interfejsie wiersza polecenia platformy Azure. Uruchom to polecenie za pomocą usługi Azure Cloud Shell w witrynie Azure Portal lub wybierając przycisk Wypróbuj .

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

Parametr --json-auth jest dostępny w wersjach >interfejsu wiersza polecenia platformy Azure = 2.51.0. Wersje przed tym użyciem --sdk-auth z ostrzeżeniem o wycofaniu.

W powyższym przykładzie zastąp symbole zastępcze identyfikatorem subskrypcji, nazwą grupy zasobów i nazwą aplikacji. Dane wyjściowe to obiekt JSON z poświadczeniami przypisania roli, które zapewniają dostęp do aplikacji usługi App Service podobnej do poniższej. Skopiuj ten obiekt JSON do późniejszego użycia.

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

Tworzenie wpisów tajnych usługi GitHub

  1. W usłudze GitHub przejdź do repozytorium.

  2. Przejdź do Ustawienia w menu nawigacji.

  3. Wybierz pozycję Wpisy tajne zabezpieczeń > i zmienne > Akcje.

    Screenshot of adding a secret

  4. Wybierz pozycję Nowy wpis tajny repozytorium.

  5. Wklej całe dane wyjściowe JSON z polecenia interfejsu wiersza polecenia platformy Azure do pola wartości wpisu tajnego. Nadaj wpisowi tajnym nazwę AZURE_CREDENTIALS.

  6. Wybierz przycisk Add secret (Dodaj wpis tajny).

Korzystanie z akcji logowania platformy Azure

Użyj wpisu tajnego usługi GitHub z akcją Azure Login, aby uwierzytelnić się na platformie Azure.

W tym przepływie pracy uwierzytelniasz się przy użyciu akcji logowania platformy Azure ze szczegółami jednostki usługi przechowywanymi w pliku secrets.AZURE_CREDENTIALS. Następnie uruchomisz akcję interfejsu wiersza polecenia platformy Azure. Aby uzyskać więcej informacji na temat odwoływania się do wpisów tajnych usługi GitHub w pliku przepływu pracy, zobacz Using encrypted secrets in a workflow in GitHub Docs (Używanie zaszyfrowanych wpisów tajnych w przepływie pracy w witrynie 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 }}'

Konfigurowanie środowiska Java

Skonfiguruj środowisko Java za pomocą akcji Zestawu JAVA Setup SDK. W tym przykładzie skonfigurujesz środowisko, skompilujesz je za pomocą narzędzia Maven, a następnie wyświetlisz artefakt.

Artefakty usługi GitHub to sposób udostępniania plików w przepływie pracy między zadaniami. Utworzysz artefakt do przechowywania pliku JAR, a następnie dodasz go do obrazu maszyny wirtualnej.

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

Kompilowanie obrazu

Użyj akcji Tworzenie obrazu maszyny wirtualnej platformy Azure, aby utworzyć niestandardowy obraz maszyny wirtualnej.

Zastąp symbole zastępcze wartości {subscriptionID}i {rgName}{Identity} identyfikatorem subskrypcji, nazwą grupy zasobów i nazwą tożsamości zarządzanej. Zastąp wartości {galleryName} i {imageName} nazwą galerii obrazów i nazwą obrazu.

Uwaga

Jeśli akcja Utwórz obraz baked aplikacji zakończy się niepowodzeniem z powodu błędu uprawnień, sprawdź, czy przypisano rolę tworzenia obrazu do tożsamości zarządzanej przez użytkownika.

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

Argumenty akcji maszyny wirtualnej

Dane wejściowe Wymagania opis
resource-group-name Tak Grupa zasobów używana do przechowywania i zapisywania artefaktów podczas procesu kompilacji.
image-builder-template-name Nie. Używana nazwa zasobu szablonu konstruktora obrazów.
location Tak Lokalizacja, w której zostanie uruchomiony program Azure Image Builder. Zobacz obsługiwane lokalizacje.
build-timeout-in-minutes Nie. Czas, po którym kompilacja zostanie anulowana. Wartość domyślna to 240.
vm-size Opcjonalnie Domyślnie Standard_D1_v2 będzie używany. Zobacz Rozmiary maszyn wirtualnych.
managed-identity Tak Utworzona wcześniej tożsamość zarządzana przez użytkownika. Użyj pełnego identyfikatora, jeśli tożsamość znajduje się w innej grupie zasobów. Użyj nazwy, jeśli znajduje się w tej samej grupie zasobów.
source-os Tak Typ systemu operacyjnego obrazu podstawowego (Linux lub Windows)
source-image-type Tak Typ obrazu podstawowego, który będzie używany do tworzenia obrazu niestandardowego.
source-image Tak Identyfikator zasobu obrazu podstawowego. Obraz źródłowy powinien znajdować się w tym samym regionie świadczenia usługi Azure ustawionym w wartości wejściowej lokalizacji.
customizer-source Nie. Katalog, w którym można zachować wszystkie artefakty, które należy dodać do obrazu podstawowego w celu dostosowania. Domyślnie wartość to ${{ GITHUB.WORKSPACE }}/workflow-artifacts.
customizer-destination Nie. Jest to katalog na dostosowanym obrazie, do którego są kopiowane artefakty.
customizer-windows-update Nie. Tylko w przypadku systemu Windows. Wartość logiczna. Jeśli trueprogram , konstruktor obrazów uruchomi aktualizację systemu Windows na końcu dostosowań.
dist-location Nie. W przypadku elementu SharedImageGallery jest to .dist-type
dist-image-tags Nie. Są to tagi zdefiniowane przez użytkownika, które są dodawane do utworzonego obrazu niestandardowego (na przykład: version:beta).

Tworzenie maszyny wirtualnej

W ostatnim kroku utwórz maszynę wirtualną na podstawie obrazu.

  1. Zastąp symbole zastępcze elementu {rgName}nazwą grupy zasobów.

  2. Dodaj wpis tajny usługi GitHub z hasłem maszyny wirtualnej (VM_PWD). Pamiętaj, aby zapisać hasło, ponieważ nie będzie można go zobaczyć ponownie. Nazwa użytkownika to 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 }}"              

Ukończ kod 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 }}"              

Następne kroki