Aangepaste installatiekopieën voor virtuele machines bouwen met GitHub Actions en Azure
Ga aan de slag met de GitHub Actions door een workflow te maken om een virtuele machine image te maken.
Met GitHub Actions kunt u uw CI/CD-proces versnellen door aangepaste installatiekopieën van virtuele machines te maken met artefacten uit uw werkstromen. U kunt zowel afbeeldingen maken als ze distribueren naar een Shared Image Gallery.
Vervolgens kunt u deze installatiekopieën gebruiken om virtuele machines en virtuele-machineschaalsets te maken.
De actie voor het bouwen van een virtuele machine-installatiekopie maakt gebruik van de Azure Image Builder-service.
Voorwaarden
- Een Azure-account met een actief abonnement. Maak gratis een account.
- Een GitHub-account met een actieve opslagplaats. Als u nog geen account hebt, kunt u zich aanmelden voor gratis.
- In dit voorbeeld wordt de Java Spring PetClinic Sample Applicationgebruikt.
- Een Azure Compute Gallery met een installatiekopie.
Overzicht van werkstroombestand
Een werkstroom wordt gedefinieerd door een YAML-bestand (.yml) in het /.github/workflows/
pad in uw opslagplaats. Deze definitie bevat de verschillende stappen en parameters waaruit de werkstroom bestaat.
Het bestand heeft drie secties:
Afdeling | Taken |
---|---|
verificatie | 1. Een door de gebruiker beheerde identiteit toevoegen. Stel een service-principal of Open ID Connect in. 3. Maak een GitHub-geheim. |
bouw- | 1. Stel de omgeving in. 2. Bouw de app. |
afbeelding | 1. Maak een VM-afbeelding. 2. Maak een virtuele machine. |
Een door de gebruiker beheerde identiteit maken
U hebt een door de gebruiker beheerde identiteit nodig voor Azure Image Builder (AIB) om afbeeldingen te distribueren. Uw door de gebruiker toegewezen beheerde Identiteit van Azure wordt gebruikt tijdens de build van de installatiekopieën om afbeeldingen te lezen en te schrijven naar een Shared Image Gallery.
Maak een door een gebruiker beheerde identiteit met Azure CLI- of de Azure Portal-. Noteer de naam van uw beheerde identiteit.
Pas deze JSON-code aan. Vervang de tijdelijke aanduidingen voor
{subscriptionID}
en{rgName}
met uw abonnements-ID en de naam van uw resourcegroep.{ "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": [] } ] } }
Gebruik deze JSON-code om een nieuwe aangepaste rol te maken met JSON.
Open uw Azure Compute Gallery in Azure Portal en ga naar IAM-(Access Control).
Selecteer Roltoewijzing toevoegen en wijs de afbeeldingscreatierol toe aan uw door de gebruiker beheerde identiteit.
Implementatiereferenties genereren
Als u Azure-aanmeldingsactie met OIDC wilt gebruiken, moet u een federatieve identiteitsreferentie configureren in een Microsoft Entra-toepassing of een door de gebruiker toegewezen beheerde identiteit.
optie 1: Microsoft Entra-toepassing
- Maak een Microsoft Entra-toepassing met een service-principal via Azure Portal, Azure CLIof Azure PowerShell-.
- Kopieer de waarden voor client-id, abonnements-iden directory-id (tenant) voor later gebruik in uw GitHub Actions-werkstroom.
- Wijs een juiste rol toe aan uw service-principal door Azure Portal, Azure CLIof Azure PowerShell-.
- Configureer een federatieve identiteitsreferentie in een Microsoft Entra-toepassing om tokens te vertrouwen die door GitHub Actions zijn uitgegeven aan uw GitHub-opslagplaats.
optie 2: door de gebruiker toegewezen beheerde identiteit
- een door de gebruiker toegewezen beheerde identiteit maken.
- Kopieer de waarden voor client-id, abonnements-iden directory-id (tenant) voor later gebruik in uw GitHub Actions-werkstroom.
- wijs een juiste rol toe aan uw door de gebruiker toegewezen beheerde identiteit.
- Configureer een federatieve identiteitsreferentie voor een door de gebruiker toegewezen beheerde identiteit om tokens te vertrouwen die door GitHub Actions zijn uitgegeven aan uw GitHub-opslagplaats.
GitHub-geheimen maken
U moet de client-id van uw toepassing opgeven, directory-id (tenant)en abonnements-id aan de aanmeldingsactie. Deze waarden kunnen rechtstreeks in de werkstroom worden opgegeven of kunnen worden opgeslagen in GitHub-geheimen en waarnaar wordt verwezen in uw werkstroom. Het opslaan van de waarden als GitHub-geheimen is de veiligere optie.
Ga in GitHubnaar uw opslagplaats.
Selecteer Beveiliging > Secrets en variabelen > Acties.
Selecteer Nieuwe opslagplaatsgeheim.
Notitie
Als u de werkstroombeveiliging in openbare opslagplaatsen wilt verbeteren, gebruikt u omgevingsgeheimen in plaats van opslagplaatsgeheimen. Als voor de omgeving goedkeuring is vereist, heeft een taak geen toegang tot omgevingsgeheimen totdat een van de vereiste revisoren deze goedkeurt.
Geheimen maken voor
AZURE_CLIENT_ID
,AZURE_TENANT_ID
enAZURE_SUBSCRIPTION_ID
. Kopieer deze waarden uit uw Microsoft Entra-toepassing of door de gebruiker toegewezen beheerde identiteit voor uw GitHub-geheimen:GitHub-geheim Microsoft Entra-toepassing of door de gebruiker toegewezen beheerde identiteit AZURE_CLIENT_ID Klant-ID AZURE_SUBSCRIPTION_ID Abonnements-id AZURE_TENANT_ID Directory-id (huurder) Notitie
Om veiligheidsredenen raden we u aan GitHub Secrets te gebruiken in plaats van waarden rechtstreeks door te geven aan de werkstroom.
De azure-aanmeldingsactie gebruiken
Gebruik uw GitHub-geheim met de Azure-aanmeldingsactie om te verifiëren bij Azure.
In deze werkstroom authenticeert u zich met behulp van de Azure-aanmeldingsactie met de gegevens van de service-principal die zijn opgeslagen in secrets.AZURE_CREDENTIALS
. Vervolgens voert u een Azure CLI-actie uit. Zie Versleutelde geheimen gebruiken in een werkstroombestand in GitHub Docs voor meer informatie over het verwijzen naar GitHub-geheimen in een werkstroombestand.
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 }}'
Java configureren
Stel de Java-omgeving in met de Java Setup SDK-actie. In dit voorbeeld stelt u de omgeving in, bouwt u met Maven en voert u vervolgens een artefact uit.
GitHub-artefacten zijn een manier om bestanden te delen in een werkstroom tussen taken. Je maakt een artefact aan om het JAR-bestand op te slaan en voegt het vervolgens toe aan de virtuele machine-image.
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
Bouw uw imago
Gebruik de actie Build Azure Virtual Machine Image om een aangepaste installatiekopie voor virtuele machines te maken.
Vervang de tijdelijke aanduidingen voor {subscriptionID}
, {rgName}
en {Identity}
door jouw abonnements-id, de naam van de resourcegroep en de naam van de beheerde identiteit. Vervang de waarden van {galleryName}
en {imageName}
door de naam van je afbeeldingengalerij en je afbeeldingsnaam.
Notitie
Als de actie 'App Gebakken Afbeelding maken' mislukt met een machtigingsfout, controleer dan of u de rol 'Afbeelding Aanmaak' hebt toegewezen aan uw door de gebruiker beheerde identiteit.
- 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'
Actieargumenten voor virtuele machines
Invoer | Vereist | Beschrijving |
---|---|---|
resource-group-name |
Ja | De resourcegroep die wordt gebruikt voor opslag en het opslaan van artefacten tijdens het buildproces. |
image-builder-template-name |
Nee | De naam van de sjabloonresource voor de opbouwfunctie voor afbeeldingen. |
location |
Ja | De locatie waar Azure Image Builder wordt uitgevoerd. Zie ondersteunde locaties. |
build-timeout-in-minutes |
Nee | Tijd waarna de build wordt geannuleerd. De standaardwaarde is 240. |
vm-size |
Facultatief | Standaard wordt Standard_D1_v2 gebruikt. Zie grootten van virtuele machines. |
managed-identity |
Ja | De door de gebruiker beheerde identiteit die u eerder hebt gemaakt. Gebruik de volledige identifier als uw identiteit zich in een andere resources-groep bevindt. Gebruik de naam als deze zich in dezelfde resourcegroep bevindt. |
source-os |
Ja | Het type besturingssysteem van de basisinstallatiekopie (Linux of Windows) |
source-image-type |
Ja | Het basisimage-type dat zal worden gebruikt voor het maken van de aangepaste image. |
source-image |
Ja | De resource-identificatie voor de basisafbeelding. Een bronafbeelding moet aanwezig zijn in dezelfde Azure-regio die is ingesteld in de invoerwaarde van de locatie. |
customizer-source |
Nee | De map waarin u alle artefacten kunt bewaren die moeten worden toegevoegd aan de basisimage voor personalisatie. De waarde is standaard ${{ GITHUB.WORKSPACE }}/workflow-artifacts. |
customizer-destination |
Nee | Dit is de map in de aangepaste afbeelding waarnaar artefacten worden gekopieerd. |
customizer-windows-update |
Nee | Alleen voor Windows. Booleaanse waarde. Als true waar is, voert de image builder Windows Update uit aan het einde van de customisaties. |
dist-location |
Nee | Voor SharedImageGallery is dit de dist-type . |
dist-image-tags |
Nee | Dit zijn door de gebruiker gedefinieerde tags die worden toegevoegd aan de aangepaste afbeeldingen die zijn gemaakt (bijvoorbeeld: version:beta ). |
Uw virtuele machine maken
Als laatste stap maakt u een virtuele machine op basis van uw image.
Vervang de tijdelijke aanduidingen voor
{rgName}
door de naam van de resourcegroep.Voeg een GitHub-geheim toe met het wachtwoord van de virtuele machine (
VM_PWD
). Noteer het wachtwoord omdat u het niet meer kunt zien. De gebruikersnaam ismyuser
.
- 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 voltooien
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 }}"
Volgende stappen
- Meer informatie over het implementeren in Azure.