Compartilhar via


Criar imagens de máquina virtual personalizadas com o GitHub Actions e o Azure

Comece a usar o GitHub Actions criando um fluxo de trabalho para criar uma imagem de máquina virtual.

Com o GitHub Actions, você pode acelerar o processo de CI/CD criando imagens de máquinas virtuais personalizadas com artefatos de seus fluxos de trabalho. Você pode criar imagens e distribuí-las para uma Galeria de Imagens Compartilhadas.

Em seguida, você pode usar essas imagens para criar máquinas virtuais e conjuntos de dimensionamento de máquinas virtuais.

A ação de criação de imagem de máquina virtual usa o serviço Azure Image Builder.

Pré-requisitos

Visão geral do arquivo do fluxo de trabalho

Um fluxo de trabalho é definido por um arquivo YAML (.yml) no caminho /.github/workflows/ no repositório. Essa definição contém as várias etapas e os parâmetros que compõem o fluxo de trabalho.

O arquivo tem três seções:

Seção Tasks
Autenticação 1. Adicionar uma identidade gerenciada pelo usuário.
2. Configurar uma entidade de serviço ou configurar o Open ID Connect.
3. Criar um segredo do GitHub.
Construir 1. Configurar o ambiente.
2. Compilar o aplicativo.
Imagem 1. Criar uma imagem de VM.
2. Criar uma máquina virtual.

Criar uma identidade gerenciada pelo usuário

Você precisará de uma identidade gerenciada pelo usuário para o Azure Image Builder (AIB) para distribuir imagens. Sua identidade gerenciada de usuário atribuída pelo Azure será usada durante o processo de construção de imagem para ler e gravar imagens em uma Galeria de Imagens Compartilhada do Azure.

  1. Crie uma identidade gerenciada pelo usuário com a CLI do Azure ou o portal do Azure. Anote o nome da identidade gerenciada.

  2. Personalize este código JSON. Substitua os marcadores de posição {subscriptionID} pela ID da assinatura e {rgName} pelo nome do grupo de recursos.

    {
    "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. Use este código JSON para criar uma nova função personalizada com JSON.

  4. No portal do Azure, abra sua Galeria de Computação do Azure e acesse o Controle de Acesso (IAM).

  5. Selecione Adicionar atribuição de função e atribua a Função de Criação de Imagem à sua identidade gerenciada pelo usuário.

Gerar as credenciais de implantação

Para usar a ação de Logon do Azure com o OIDC, você precisa configurar uma credencial de identidade federada em um aplicativo do Microsoft Entra ou uma identidade gerenciada atribuída pelo usuário.

Opção 1: Aplicativo Microsoft Entra

Opção 2: Identidade gerenciada atribuída pelo usuário

Criar segredos do GitHub

Você precisa fornecer a ID do cliente, a ID do diretório (locatário) e a ID da assinatura do seu aplicativo para a ação de login. Esses valores podem ser fornecidos diretamente no fluxo de trabalho ou podem ser armazenados em segredos do GitHub e referenciados em seu fluxo de trabalho. Salvar os valores como segredos do GitHub é a opção mais segura.

  1. No GitHub, acesse seu repositório.

  2. Selecione Segurança > Segredos e variáveis > Ações.

    Captura de tela mostrando a adição de um segredo

  3. Selecione Novo segredo de repositório.

    Observação

    Para aprimorar a segurança do fluxo de trabalho em repositórios públicos, use segredos de ambiente em vez de segredos do repositório. Se o ambiente exigir aprovação, um trabalho não poderá acessar segredos de ambiente até que um dos revisores necessários o aprove.

  4. Crie segredos para AZURE_CLIENT_ID, AZURE_TENANT_ID e AZURE_SUBSCRIPTION_ID. Copie esses valores do aplicativo Microsoft Entra ou da identidade gerenciada atribuída pelo usuário para seus segredos do GitHub:

    Segredo do GitHub Aplicativo Microsoft Entra ou identidade gerenciada atribuída pelo usuário
    AZURE_CLIENT_ID ID do cliente
    AZURE_SUBSCRIPTION_ID ID da assinatura
    AZURE_TENANT_ID ID do diretório (locatário)

    Observação

    Por motivos de segurança, recomendamos usar os Segredos do GitHub em vez de passar valores diretamente para o fluxo de trabalho.

Usar a ação de login do Azure

Use o segredo do GitHub com a ação de Logon do Azure para autenticar no Azure.

Para o Open ID Connect, você usará uma credencial federada associada ao seu aplicativo do Active Directory.

Para obter mais informações sobre como referenciar segredos do GitHub em um arquivo de fluxo de trabalho, consulte Usando segredos criptografados em um fluxo de trabalho no 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@v2
        with:
          client-id: ${{ secrets.AZURE_CLIENT_ID }}
          tenant-id: ${{ secrets.AZURE_TENANT_ID }}
          subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}

Configurar o Java

Configure o ambiente Java com a ação do SDK de Instalação do Java. Para este exemplo, você configurará o ambiente, criará com o Maven e, em seguida, produzirá um artefato.

Os artefatos do GitHub são uma maneira de compartilhar arquivos em um fluxo de trabalho entre trabalhos. Você criará um artefato para armazenar o arquivo JAR e adicioná-lo à imagem da máquina virtual.

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

Crie sua imagem

Use a ação Criar Imagem de Máquina Virtual do Azure para criar uma imagem de máquina virtual personalizada.

Substitua as variáveis de {subscriptionID}, {rgName} e {Identity} pelas suas ID de assinatura, nome do grupo de recursos e nome da identidade gerenciada. Substitua os valores de {galleryName} e {imageName} pelo nome da sua galeria de imagens e o nome da sua imagem.

Observação

Se a ação Criar Imagem Assada do Aplicativo falhar com um erro de permissão, verifique se você atribuiu a Função de Criação de Imagem à sua identidade gerenciada pelo usuário.

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

Argumentos de ação da Máquina Virtual

Input Obrigatório Description
resource-group-name Yes O grupo de recursos usado para armazenar e salvar artefatos durante o processo de build.
image-builder-template-name Não O nome do recurso de modelo do construtor de imagens usado.
location Yes O local em que o Construtor de Imagens do Azure será executado. Consulte os locais com suporte.
build-timeout-in-minutes Não Hora após a qual o build é cancelado. O valor padrão é 240.
vm-size Opcional Por padrão, Standard_D1_v2 será usado. Veja os tamanhos das máquinas virtuais.
managed-identity Yes A identidade gerenciada do usuário que você criou anteriormente. Use o identificador completo se sua identidade estiver em um grupo de recursos diferente. Use o nome se ele estiver no mesmo grupo de recursos.
source-os Yes O tipo de sistema operacional da imagem base (Linux ou Windows)
source-image-type Yes O tipo de imagem base que será usado para criar a imagem personalizada.
source-image Yes O identificador de recurso para a imagem base. Uma imagem de origem deve estar presente na mesma região do Azure definida no valor de entrada de localização.
customizer-source Não O diretório em que você pode manter todos os artefatos que precisam ser adicionados à imagem base para personalização. Por padrão, o valor é ${{ GITHUB.WORKSPACE }}/workflow-artifacts.
customizer-destination Não Esse é o diretório na imagem personalizada para a qual os artefatos são copiados.
customizer-windows-update Não Somente para Windows. Valor booliano. Se true, o construtor de imagens executará o Windows Update no final das personalizações.
dist-location Não Para SharedImageGallery, este é o dist-type.
dist-image-tags Não Estas são marcas definidas pelo usuário que são adicionadas à imagem personalizada criada (exemplo: version:beta).

Criar sua máquina virtual

Como última etapa, crie uma máquina virtual com base em sua imagem.

  1. Substitua os marcadores de posição {rgName} pelo nome do seu grupo de recursos.

  2. Adicione um segredo do GitHub com a senha da máquina virtual (VM_PWD). Certifique-se de anotar a senha porque você não poderá vê-la novamente. O nome de usuário é 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 }}"              

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

Próximas etapas