Udostępnij przez


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ą GitHub Actions możesz przyspieszyć proces CI/CD, tworząc niestandardowe obrazy maszyn wirtualnych, które zawierają artefakty 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:

Section Tasks
Uwierzytelnianie 1. Dodaj tożsamość zarządzaną przez użytkownika.
2. Skonfiguruj jednostkę usługi lub program Open ID Connect.
3. Utwórz tajny GitHub.
Kompiluj 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. Zanotuj nazwę tożsamości zarządzanej.

  2. Dostosuj ten kod JSON. Zastąp symbole zastępcze {subscriptionID} i {rgName} swoim identyfikatorem subskrypcji oraz 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

Aby użyć Azure Login z OIDC, należy skonfigurować poświadczenie tożsamości federacyjnej w aplikacji Microsoft Entra lub przydzielonej tożsamości zarządzanej przez użytkownika.

Opcja 1: aplikacja Microsoft Entra

Opcja 2. Tożsamość zarządzana przypisana przez użytkownika

Tworzenie tajemnic GitHub

Musisz podać identyfikator klienta aplikacji , identyfikator katalogu (dzierżawy) oraz identyfikator subskrypcji do wykonania akcji logowania. Te wartości można podać bezpośrednio w przepływie pracy lub przechowywać w wpisach tajnych usługi GitHub i odwoływać się do nich w przepływie pracy. Zapisanie wartości jako sekretów GitHub jest bezpieczniejszą opcją.

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

  2. Wybierz >.

    Zrzut ekranu dodawania sekretu

  3. Wybierz Nowy sekret repozytorium.

    Uwaga / Notatka

    Aby zwiększyć bezpieczeństwo przepływu pracy w repozytoriach publicznych, użyj sekretów środowiska zamiast sekretów repozytorium. Jeśli środowisko wymaga zatwierdzenia, zadanie nie może uzyskać dostępu do tajnych danych środowiska, dopóki nie zostanie zatwierdzone przez jednego z wymaganych recenzentów.

  4. Utwórz wpisy tajne dla AZURE_CLIENT_ID, AZURE_TENANT_ID i AZURE_SUBSCRIPTION_ID. Skopiuj te wartości ze swojej aplikacji Microsoft Entra lub z tożsamości zarządzanej przypisanej przez użytkownika do sekretów GitHub.

    Sekret GitHub Aplikacja Microsoft Entra lub tożsamość zarządzana przypisana przez użytkownika
    AZURE_CLIENT_ID ID klienta
    AZURE_SUBSCRIPTION_ID Identyfikator subskrypcji
    AZURE_TENANT_ID Identyfikator katalogu (klienta)

    Uwaga / Notatka

    Ze względów bezpieczeństwa zalecamy używanie GitHub Secrets zamiast przekazywania wartości bezpośrednio do workflow.

Korzystanie z akcji logowania platformy Azure

Użyj tajemnicy GitHub z akcją Azure Login, aby uwierzytelnić się w Azure.

W przypadku programu Open ID Connect użyjesz poświadczeń federacyjnych skojarzonych z aplikacją usługi Active Directory.

Aby uzyskać więcej informacji na temat odwoływania się do tajnych danych GitHub w pliku workflow, zobacz Używanie zaszyfrowanych tajemnic w przepływie pracy w Dokumentacji 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 }}

Konfigurowanie środowiska Java

Skonfiguruj środowisko Java za pomocą akcji 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@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

Kompilowanie obrazu

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

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

Uwaga / Notatka

Jeśli akcja Utwórz wbudowany obraz aplikacji zakończy się niepowodzeniem z powodu błędu uprawnień, sprawdź, czy przypisano rolę tworzenia obrazów 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

Input Obowiązkowy Description
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 upływie którego 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 bazowego. 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 true, narzędzie do tworzenia obrazów uruchomi aktualizację systemu Windows na końcu dostosowania.
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 sekret 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@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 }}"              

Dalsze kroki