Sdílet prostřednictvím


Vytváření vlastních imagí virtuálních počítačů pomocí GitHub Actions a Azure

Začněte pracovat s GitHub Actions vytvořením pracovního postupu pro vytvoření image virtuálního počítače.

Pomocí GitHub Actions můžete urychlit proces CI/CD vytvořením vlastních imagí virtuálních počítačů s artefakty z pracovních postupů. Image můžete vytvářet a distribuovat do galerie sdílených imagí.

Tyto image pak můžete použít k vytvoření virtuálních počítačů a škálovacích sad virtuálních počítačů.

Akce sestavení image virtuálního počítače používá službu Azure Image Builder.

Požadavky

Přehled souboru pracovního postupu

Pracovní postup je definován souborem YAML (.yml) v /.github/workflows/ cestě v úložišti. Tato definice obsahuje různé kroky a parametry, které tvoří pracovní postup.

Soubor má tři části:

Oddíl Tasks
Autentizace 1. Přidejte identitu spravovanou uživatelem.
2. Nastavte systémový účet služby nebo Open ID Connect.
3. Vytvořte tajný kód GitHubu.
Sestavit 1. Nastavte prostředí.
2. Sestavte aplikaci.
Image 1. Vytvořte image virtuálního počítače.
2. Vytvořte virtuální počítač.

Vytvoření identity spravované uživatelem

K distribuci imagí budete potřebovat identitu spravovanou uživatelem pro Azure Image Builder (AIB). Identita spravovaná Azure, přiřazená uživatelem, bude použita během sestavování obrazu ke čtení a zápisu obrazů do Galerie sdílených obrazů.

  1. Vytvořte identitu spravovanou uživatelem pomocí Azure CLI nebo webu Azure Portal. Poznamenejte si název vaší spravované identity.

  2. Přizpůsobte si tento kód JSON. Nahraďte zástupné symboly {subscriptionID} svého ID předplatného a {rgName} názvem své skupiny prostředků.

    {
    "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. Tento kód JSON slouží k vytvoření nové vlastní role s JSON.

  4. Na webu Azure Portal otevřete Galerii výpočetních prostředků Azure a přejděte do řízení přístupu (IAM).

  5. Vyberte Přidat přiřazení role a přiřaďte roli pro tvorbu obrazu k uživatelsky spravované identitě.

Generování přihlašovacích údajů pro nasazení

Pokud chcete použít akci přihlášení k Azure s OIDC, musíte nakonfigurovat přihlašovací údaje federované identity v aplikaci Microsoft Entra nebo spravované identitě přiřazené uživatelem.

Možnost 1: Aplikace Microsoft Entra

  • Vytvořte aplikaci Microsoft Entra s oprávněním služby pomocí Azure portálu , příkazového nástroje Azure CLI , nebo modulu Azure PowerShell .
  • Zkopírujte hodnoty ID klienta, ID předplatnéhoa ID adresáře (tenanta), abyste je mohli použít později v pracovním postupu GitHub Actions.
  • Přiřaďte k instančnímu objektu příslušnou roli pomocí webu Azure Portal, Azure CLI nebo Azure PowerShellu.
  • Nakonfigurujte federované identitní pověření v aplikaci Microsoft Entra tak, aby důvěřovalo tokenům vydaným GitHub Actions pro vaše úložiště na GitHubu.

možnost 2: Spravovaná identita přiřazená uživatelem

Vytvoření tajných kódů GitHubu

Musíte zadat ID klienta vaší aplikace, ID adresáře (tenanta)a ID předplatného pro akci přihlášení. Tyto hodnoty je možné zadat buď přímo v pracovním postupu, nebo je můžete uložit v tajných kódech GitHubu a odkazovat na je ve vašem pracovním postupu. Uložením hodnot jako tajných kódů GitHubu je bezpečnější možnost.

  1. Na GitHubu přejděte do svého úložiště.

  2. Vyberte > tajných kódů zabezpečení > a proměnných.

    Snímek obrazovky s přidáním tajného kódu

  3. Vyberte Nový tajný klíč úložiště.

    Poznámka:

    Pokud chcete zvýšit zabezpečení pracovních postupů ve veřejných úložištích, použijte tajných kódů prostředí místo tajných kódů úložiště. Pokud prostředí vyžaduje schválení, úloha nemůže získat přístup k tajným kódům prostředí, dokud ho některý z požadovaných kontrolorů neschválí.

  4. Vytváření tajných kódů pro AZURE_CLIENT_ID, AZURE_TENANT_IDa AZURE_SUBSCRIPTION_ID. Zkopírujte tyto hodnoty z vaší aplikace Microsoft Entra nebo spravované identity přiřazené uživatelem pro tajné kódy GitHubu:

    Tajný kód GitHubu Aplikace Microsoft Entra nebo spravovaná identita přiřazená uživatelem
    AZURE_CLIENT_ID ID klienta
    AZURE_PŘEDPLATNÉ_ID Identifikátor předplatného
    AZURE_TENANT_ID ID adresáře (klienta)

    Poznámka:

    Z bezpečnostních důvodů doporučujeme místo předávání hodnot přímo pracovnímu postupu používat tajné kódy GitHubu.

Použití akce přihlášení k Azure

Pomocí tajného kódu GitHubu s akcí Přihlášení k Azure se ověřte v Azure.

Pro Open ID Connect použijete federované přihlašovací údaje přidružené k vaší aplikaci Active Directory.

Další informace o odkazování na tajné kódy GitHubu v souboru pracovního postupu najdete v tématu Použití šifrovaných tajných kódů v pracovním postupu v Dokumentaci GitHubu.

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

Konfigurace Javy

Nastavte prostředí Java pomocí akce sady Java Setup SDK. V tomto příkladu nastavíte prostředí, sestavíte ho pomocí Mavenu a pak vypíšete artefakt.

Artefakty GitHubu představují způsob, jak sdílet soubory v pracovním postupu mezi úlohami. Vytvoříte artefakt pro uložení souboru JAR a pak ho přidáte do image virtuálního počítače.

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

Vytvoření image

Pomocí akce Sestavit image virtuálního počítače Azure vytvořte vlastní image virtuálního počítače.

Nahraďte zástupné symboly {subscriptionID}, {rgName} a {Identity} vaším ID předplatného, názvem skupiny prostředků a názvem spravované identity. Nahraďte hodnoty {galleryName} názvem vaší galerie obrázků a {imageName} názvem vašeho obrázku.

Poznámka:

Pokud akce Vytvořit připravenou image aplikace selže s chybou oprávnění, ověřte, že jste ke své identitě spravované uživatelem přiřadili roli pro vytváření imagí.

    - 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 akce virtuálního počítače

Vstup Povinné Description
resource-group-name Ano Skupina prostředků používaná pro ukládání a uchovávání artefaktů během procesu sestavení.
image-builder-template-name Ne Název použitého prostředku šablony tvůrce obrázků.
location Ano Umístění, kde bude Azure Image Builder běžet. Podívejte se na podporovaná umístění.
build-timeout-in-minutes Ne Čas po kterém je sestavení zrušeno. Výchozí hodnota je 240.
vm-size Volitelný Standard_D1_v2 se použije ve výchozím nastavení. Viz velikosti virtuálních počítačů.
managed-identity Ano Identita spravovaná uživatelem, kterou jste vytvořili dříve. Úplný identifikátor použijte, pokud je vaše identita v jiné skupině zdrojů. Použijte název, pokud je ve stejné skupině zdrojů.
source-os Ano Typ operačního systému základní image (Linux nebo Windows)
source-image-type Ano Základní typ image, který se použije k vytvoření vlastní image.
source-image Ano Identifikátor prostředku pro základní image. Zdrojový obraz by měl být ve stejném regionu Azure, který je nastaven ve vstupní hodnotě umístění.
customizer-source Ne Adresář, kde můžete zachovat všechny artefakty, které je potřeba přidat do základní image pro přizpůsobení. Ve výchozím nastavení je tato hodnota ${{ GITHUB.WORKSPACE }}/workflow-artifacts.
customizer-destination Ne Toto je adresář v přizpůsobeném obrazu, do kterého se kopírují artefakty.
customizer-windows-update Ne Pouze pro Windows. Logická hodnota Pokud true, program pro vytváření imagí spustí aktualizaci Windows na konci přizpůsobení.
dist-location Ne V případě SharedImageGallery se jedná o dist-type.
dist-image-tags Ne Jedná se o uživatelem definované značky, které se přidají do vlastní image vytvořené (příklad: version:beta).

Vytvoření virtuálního počítače

Jako poslední krok vytvořte z image virtuální počítač.

  1. Zástupné symboly nahraďte {rgName}názvem vaší skupiny prostředků.

  2. Přidejte tajný kód GitHubu pomocí hesla virtuálního počítače (VM_PWD). Nezapomeňte si heslo zapsat, protože ho znovu neuvidíte. Uživatelské jméno je 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 }}"              

Dokončení 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 }}"              

Další kroky