Skapa anpassade avbildningar av virtuella datorer med GitHub Actions och Azure
Kom igång med GitHub Actions genom att skapa ett arbetsflöde för att skapa en avbildning av en virtuell dator.
Med GitHub Actions kan du påskynda CI/CD-processen genom att skapa anpassade avbildningar av virtuella datorer med artefakter från dina arbetsflöden. Du kan både skapa avbildningar och distribuera dem till ett delat bildgalleri.
Du kan sedan använda dessa avbildningar för att skapa virtuella datorer och vm-skalningsuppsättningar.
Avbildningsåtgärden skapa virtuell dator använder Azure Image Builder-tjänsten.
Förutsättningar
- Ett Azure-konto med en aktiv prenumeration. Skapa ett konto utan kostnad.
- Ett GitHub-konto med en aktiv lagringsplats. Om du inte har ett sådant kan du registrera dig utan kostnad.
- Ett Azure Compute-galleri med en avbildning.
Översikt över arbetsflödesfil
Ett arbetsflöde definieras av en YAML-fil (.yml) i /.github/workflows/
sökvägen på lagringsplatsen. Den här definitionen innehåller de olika steg och parametrar som utgör arbetsflödet.
Filen har tre avsnitt:
Avsnitt | Uppgifter |
---|---|
Autentisering | 1. Lägg till en användarhanterad identitet. 2. Konfigurera tjänstens huvudnamn eller Öppna ID Anslut. 3. Skapa en GitHub-hemlighet. |
Bygge | 1. Konfigurera miljön. 2. Skapa appen. |
Bild | 1. Skapa en VM-avbildning. 2. Skapa en virtuell dator. |
Skapa en användarhanterad identitet
Du behöver en användarhanterad identitet för Azure Image Builder (AIB) för att distribuera avbildningar. Din användartilldelade hanterade Identitet i Azure används under avbildningsversionen för att läsa och skriva bilder till ett delat bildgalleri.
Skapa en användarhanterad identitet med Azure CLI eller Azure-portalen. Skriv ned namnet på din hanterade identitet.
Anpassa den här JSON-koden. Ersätt platshållarna för
{subscriptionID}
och{rgName}
med ditt prenumerations-ID och resursgruppsnamn.{ "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": [] } ] } }
Använd den här JSON-koden för att skapa en ny anpassad roll med JSON.
Öppna Azure Compute-galleriet i Azure-portalen och gå till Åtkomstkontroll (IAM)..
Välj Lägg till rolltilldelning och tilldela rollen Bildskapande till din användarhanterade identitet.
Generera autentiseringsuppgifter för distribution
Skapa ett huvudnamn för tjänsten med kommandot az ad sp create-for-rbac i Azure CLI. Kör det här kommandot med Azure Cloud Shell i Azure-portalen eller genom att välja knappen Prova .
az ad sp create-for-rbac --name "myML" --role contributor \
--scopes /subscriptions/<subscription-id>/resourceGroups/<group-name> \
--json-auth
Parametern --json-auth
är tillgänglig i Azure CLI-versioner >= 2.51.0. Versioner före den här användningen --sdk-auth
med en utfasningsvarning.
I exemplet ovan ersätter du platshållarna med ditt prenumerations-ID, resursgruppsnamn och appnamn. Utdata är ett JSON-objekt med autentiseringsuppgifterna för rolltilldelning som ger åtkomst till din App Service-app på liknande sätt som nedan. Kopiera det här JSON-objektet för senare.
{
"clientId": "<GUID>",
"clientSecret": "<GUID>",
"subscriptionId": "<GUID>",
"tenantId": "<GUID>",
(...)
}
Skapa GitHub-hemligheter
Gå till din lagringsplats i GitHub.
Gå till Inställningar i navigeringsmenyn.
Välj Säkerhetshemligheter > och variabler > Åtgärder.
Välj Ny lagringsplatshemlighet.
Klistra in hela JSON-utdata från Azure CLI-kommandot i hemlighetens värdefält. Ge hemligheten namnet
AZURE_CREDENTIALS
.Välj Add secret (Lägg till hemlighet).
Använda Azure-inloggningsåtgärden
Använd din GitHub-hemlighet med azure-inloggningsåtgärden för att autentisera till Azure.
I det här arbetsflödet autentiserar du med hjälp av Azure-inloggningsåtgärden med informationen om tjänstens huvudnamn som lagras i secrets.AZURE_CREDENTIALS
. Sedan kör du en Azure CLI-åtgärd. Mer information om hur du refererar till GitHub-hemligheter i en arbetsflödesfil finns i Använda krypterade hemligheter i ett arbetsflöde i 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 }}'
Konfigurera Java
Konfigurera Java-miljön med åtgärden Java Setup SDK. I det här exemplet konfigurerar du miljön, skapar med Maven och matar sedan ut en artefakt.
GitHub-artefakter är ett sätt att dela filer i ett arbetsflöde mellan jobb. Du skapar en artefakt för att lagra JAR-filen och sedan lägga till den i den virtuella datorbilden.
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
Skapa avbildningen
Använd åtgärden Skapa Azure Virtual Machine Image för att skapa en anpassad avbildning av virtuella datorer.
Ersätt platshållarna för {subscriptionID}
, {rgName}
och {Identity}
med ditt prenumerations-ID, resursgruppsnamn och hanterade identitetsnamn. Ersätt värdena {galleryName}
för och {imageName}
med ditt bildgallerinamn och ditt bildnamn.
Kommentar
Om åtgärden Skapa appbakad avbildning misslyckas med ett behörighetsfel kontrollerar du att du har tilldelat rollen Skapa bild till din användarhanterade identitet.
- 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'
Åtgärdsargument för virtuell dator
Indata | Obligatoriskt | Beskrivning |
---|---|---|
resource-group-name |
Ja | Den resursgrupp som används för att lagra och spara artefakter under byggprocessen. |
image-builder-template-name |
Nej | Namnet på den mallresurs för avbildningsverktyget som används. |
location |
Ja | Platsen där Azure Image Builder ska köras. Se platser som stöds. |
build-timeout-in-minutes |
Nej | Tid efter vilken bygget avbryts. Standardvärdet är 240. |
vm-size |
Valfritt | Som standard Standard_D1_v2 används. Se storlekar för virtuella datorer. |
managed-identity |
Ja | Den användarhanterade identitet som du skapade tidigare. Använd den fullständiga identifieraren om din identitet finns i en annan resursgrupp. Använd namnet om det finns i samma resursgrupp. |
source-os |
Ja | Operativsystemtypen för basavbildningen (Linux eller Windows) |
source-image-type |
Ja | Den basavbildningstyp som ska användas för att skapa den anpassade avbildningen. |
source-image |
Ja | Resursidentifieraren för basavbildningen. En källbild ska finnas i samma Azure-region som anges i indatavärdet för platsen. |
customizer-source |
Nej | Katalogen där du kan behålla alla artefakter som behöver läggas till i basavbildningen för anpassning. Som standard är värdet ${{ GITHUB.WORKSPACE }}/workflow-artifacts. |
customizer-destination |
Nej | Det här är katalogen i den anpassade avbildningen där artefakter kopieras till. |
customizer-windows-update |
Nej | Endast för Windows. Booleskt värde. Om true kör avbildningsverktyget Windows Update i slutet av anpassningarna. |
dist-location |
Nej | För SharedImageGallery är dist-type detta . |
dist-image-tags |
Nej | Det här är användardefinierade taggar som läggs till i den anpassade avbildningen som skapats (exempel: version:beta ). |
Skapa en virtuell dator
Som ett sista steg skapar du en virtuell dator från avbildningen.
Ersätt platshållarna för
{rgName}
med resursgruppens namn.Lägg till en GitHub-hemlighet med lösenordet för den virtuella datorn (
VM_PWD
). Var noga med att skriva ned lösenordet eftersom du inte kommer att kunna se det igen. Användarnamnet ärmyuser
.
- 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 }}"
Slutför 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 }}"
Nästa steg
- Lär dig hur du distribuerar till Azure.