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
- Konto platformy Azure z aktywną subskrypcją. Utwórz konto bezpłatnie.
- Konto usługi GitHub z aktywnym repozytorium. Jeśli nie masz takiego konta, zarejestruj się bezpłatnie.
- W tym przykładzie użyto przykładowej aplikacji Java Spring PetClinic.
- Galeria obliczeń platformy Azure z obrazem.
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.
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.
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": [] } ] } }
Użyj tego kodu JSON, aby utworzyć nową rolę niestandardową w formacie JSON.
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).
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
W usłudze GitHub przejdź do repozytorium.
Przejdź do Ustawienia w menu nawigacji.
Wybierz pozycję Wpisy tajne zabezpieczeń > i zmienne > Akcje.
Wybierz pozycję Nowy wpis tajny repozytorium.
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
.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 true program , 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.
Zastąp symbole zastępcze elementu
{rgName}
nazwą grupy zasobów.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 tomyuser
.
- 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
- Dowiedz się, jak wdrożyć na platformie Azure.