Egyéni virtuálisgép-rendszerképek létrehozása a GitHub Actions és az Azure használatával

Ismerkedjen meg a GitHub Actions szolgáltatással egy munkafolyamat létrehozásával, amely létrehoz egy virtuálisgép-rendszerképet.

A GitHub Actions segítségével felgyorsíthatja a CI/CD-folyamatot, ha egyéni virtuálisgép-lemezképeket hoz létre a munkafolyamatok összetevőivel. Képeket is készíthet, és terjesztheti őket egy megosztott képgyűjteményben.

Ezeket a rendszerképeket ezután virtuális gépek és virtuálisgép-méretezési csoportok létrehozásához használhatja.

A virtuális gép buildelési rendszerkép-művelete az Azure Image Builder szolgáltatást használja.

Előfeltételek

Munkafolyamat-fájl áttekintése

A munkafolyamatokat egy YAML-fájl (.yml) határozza meg az /.github/workflows/ adattár elérési útján. Ez a definíció a munkafolyamatot alkotó különböző lépéseket és paramétereket tartalmazza.

A fájl három szakaszból áll:

Szakasz Tevékenységek
Hitelesítés 1. Felhasználó által felügyelt identitás hozzáadása.
2. Szolgáltatásnév vagy open id Csatlakozás beállítása.
3. Hozzon létre egy GitHub-titkos kulcsot.
Build 1. A környezet beállítása.
2. Az alkalmazás létrehozása.
Rendszerkép 1. Virtuálisgép-rendszerkép létrehozása.
2. Hozzon létre egy virtuális gépet.

Felhasználó által felügyelt identitás létrehozása

A rendszerképek terjesztéséhez szüksége lesz egy felhasználó által felügyelt identitásra az Azure Image Builderhez (AIB). Az Azure-beli felhasználó által hozzárendelt felügyelt identitást a rendszer a rendszerkép összeállítása során fogja használni képek olvasására és közös képgyűjteménybe való írására.

  1. Felhasználó által felügyelt identitás létrehozása az Azure CLI-vel vagy az Azure Portallal. Írja le a felügyelt identitás nevét.

  2. Szabja testre ezt a JSON-kódot. Cserélje le a helyőrzőket az előfizetés azonosítójára {subscriptionID} és {rgName}az erőforráscsoport nevére.

    {
    "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. Ezzel a JSON-kóddal új egyéni szerepkört hozhat létre a JSON használatával.

  4. Az Azure Portalon nyissa meg az Azure Compute Galleryt, és lépjen a Hozzáférés-vezérlés (IAM) elemre.

  5. Válassza a Szerepkör-hozzárendelés hozzáadása lehetőséget, és rendelje hozzá a képlétrehozási szerepkört a felhasználó által felügyelt identitáshoz.

Üzembehelyezési hitelesítő adatok létrehozása

Hozzon létre egy egyszerű szolgáltatást az az ad sp create-for-rbac paranccsal az Azure CLI-ben. Futtassa ezt a parancsot az Azure Cloud Shell használatával az Azure Portalon, vagy a Kipróbálás gombra kattintva.

az ad sp create-for-rbac --name "myML" --role contributor \
                            --scopes /subscriptions/<subscription-id>/resourceGroups/<group-name> \
                            --json-auth

A paraméter --json-auth az Azure CLI 2.51.0-s verzióiban >érhető el. A használat --sdk-auth előtti verziók elavultsági figyelmeztetéssel.

A fenti példában cserélje le a helyőrzőket az előfizetés azonosítójára, az erőforráscsoport nevére és az alkalmazás nevére. A kimenet egy JSON-objektum, amelynek szerepkör-hozzárendelési hitelesítő adatai az alábbiakhoz hasonló hozzáférést biztosítanak az App Service-alkalmazáshoz. Másolja ezt a JSON-objektumot későbbre.

  {
    "clientId": "<GUID>",
    "clientSecret": "<GUID>",
    "subscriptionId": "<GUID>",
    "tenantId": "<GUID>",
    (...)
  }

GitHub-titkos kódok létrehozása

  1. A GitHubon nyissa meg az adattárat.

  2. Nyissa meg a Gépház a navigációs menüben.

  3. Válassza ki a Biztonsági > titkos kulcsok és változók > műveletek lehetőséget.

    Screenshot of adding a secret

  4. Válassza az Új tárház titkos kódját.

  5. Illessze be az Azure CLI parancs teljes JSON-kimenetét a titkos kód értékmezőjébe. Adja meg a titkos nevet AZURE_CREDENTIALS.

  6. Válassza az Add secret (Titkos kód hozzáadása) lehetőséget.

Az Azure bejelentkezési műveletének használata

Az Azure Bejelentkezési művelettel a GitHub-titkos kód használatával hitelesítheti magát az Azure-ban.

Ebben a munkafolyamatban az Azure bejelentkezési művelettel hitelesíthet a szolgáltatásnévben secrets.AZURE_CREDENTIALStárolt adatokkal. Ezután futtat egy Azure CLI-műveletet. A GitHub-titkos kódok munkafolyamat-fájlban való hivatkozásáról a GitHub Docs titkosított titkos kulcsainak használata című témakörben olvashat bővebben.

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

A Java konfigurálása

Állítsa be a Java-környezetet a Java Setup SDK művelettel. Ebben a példában beállítja a környezetet, a Mavennel épít, majd egy összetevőt ad ki.

A GitHub-összetevők használatával fájlokat oszthat meg egy munkafolyamatban a feladatok között. Létre fog hozni egy összetevőt a JAR-fájl tárolásához, majd hozzáadja a virtuális gép lemezképéhez.

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

A rendszerkép létrehozása

Egyéni virtuálisgép-rendszerkép létrehozásához használja az Azure Virtual Machine Image létrehozása műveletet .

Cserélje le a helyőrzőket {subscriptionID}{rgName}{Identity} az előfizetés azonosítójára, az erőforráscsoport nevére és a felügyelt identitás nevére. Cserélje le a képgyűjtemény és a képnév értékeit {galleryName}{imageName} .

Feljegyzés

Ha az Alkalmazás létrehozása parancskép létrehozása művelet engedélyhiba miatt meghiúsul, ellenőrizze, hogy hozzárendelte-e a képlétrehozó szerepkört a felhasználó által felügyelt identitáshoz.

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

Virtuális gép műveleti argumentumai

Bevitel Kötelező Leírás
resource-group-name Igen A buildelési folyamat során a tároláshoz és az összetevők mentéséhez használt erőforráscsoport.
image-builder-template-name Nem A használt képszerkesztő sablonerőforrás neve.
location Igen Az a hely, ahol az Azure Image Builder futni fog. Lásd a támogatott helyeket.
build-timeout-in-minutes Nem A build megszakításának időpontja. Alapértelmezett érték: 240.
vm-size Választható Alapértelmezés szerint a Standard_D1_v2 rendszer ezt használja. Lásd a virtuális gépek méretét.
managed-identity Igen A felhasználó által korábban létrehozott identitás. Használja a teljes azonosítót, ha az identitás egy másik erőforráscsoportban található. Használja a nevet, ha ugyanabban az erőforráscsoportban található.
source-os Igen Az alaprendszerkép operációs rendszerének típusa (Linux vagy Windows)
source-image-type Igen Az egyéni rendszerkép létrehozásához használt alapképtípus.
source-image Igen Az alaprendszerkép erőforrás-azonosítója. A forrásrendszerképnek ugyanabban az Azure-régióban kell lennie, amely a hely bemeneti értékében van megadva.
customizer-source Nem Az a könyvtár, ahol megtarthatja az összes összetevőt, amelyet hozzá kell adni az alaprendszerképhez a testreszabáshoz. Alapértelmezés szerint az érték ${{ GITHUB.WORKSPACE }}/workflow-artifacts.
customizer-destination Nem Ez az a könyvtár a testre szabott képen, ahová az összetevőket másolni kell.
customizer-windows-update Nem Csak Windows esetén. Logikai érték. Ha truea rendszerképkészítő a testreszabások végén futtatja a Windows-frissítést.
dist-location Nem A SharedImageGallery esetében ez a dist-type.
dist-image-tags Nem Ezek a felhasználó által definiált címkék, amelyek hozzáadódnak a létrehozott egyéni rendszerképhez (például: version:beta).

A virtuális gép létrehozása

Utolsó lépésként hozzon létre egy virtuális gépet a rendszerképből.

  1. Cserélje le a helyőrzőket {rgName}az erőforráscsoport nevére.

  2. Adjon hozzá egy GitHub-titkos kulcsot a virtuális gép jelszavával (VM_PWD). Mindenképpen írja le a jelszót, mert nem fogja tudni újra látni. Felhasználónév: 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 }}"              

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

Következő lépések

  • Megtudhatja, hogyan helyezheti üzembe az Azure-ban.