Partilhar via


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

Comece a usar as Ações do GitHub criando um fluxo de trabalho para criar uma imagem de máquina virtual.

Com o GitHub Actions, você pode acelerar seu processo de CI/CD criando imagens de máquina virtual 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 criar imagem de máquina virtual usa o serviço Azure Image Builder.

Pré-requisitos

Visão geral do arquivo de fluxo de trabalho

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

O ficheiro tem três secções:

Seção Tasks
Authentication 1. Adicione uma identidade gerenciada pelo usuário.
2. Configure um principal de serviço ou Open ID Connect.
3. Crie um segredo do GitHub.
Construir 1. Configure o ambiente.
2. Crie o aplicativo.
Image 1. Crie uma imagem de VM.
2. Crie 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 atribuída pelo usuário do Azure será usada durante a compilação da imagem para ler e gravar imagens em uma Galeria de Imagens Compartilhadas.

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

  2. Personalize este código JSON. Substitua os espaços reservados para {subscriptionID} e {rgName} com o ID da assinatura e o 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 vá para 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 credenciais de implantação

Para usar a ação Azure Login com OIDC, é necessário configurar uma credencial de identidade federada num aplicativo Microsoft Entra ou numa identidade gerida atribuída pelo utilizador.

Opção 1: Aplicação Microsoft Entra

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

Criar segredos do GitHub

Você precisa fornecer o ID do cliente, o ID do diretório (locatário) e o ID da assinatura da sua aplicação 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, vá para o seu repositório.

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

    Captura de ecrã a mostrar a adição de um segredo

  3. Selecione Novo segredo do repositório.

    Observação

    Para aumentar a segurança do fluxo de trabalho em repositórios públicos, utilize segredos de ambiente em vez de segredos de 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_IDe AZURE_SUBSCRIPTION_ID. Copie estes valores do seu 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 subscrição
    AZURE_TENANT_ID ID do diretório (inquilino)

    Observação

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

Usar a ação de logon do Azure

Utilize o seu segredo do GitHub com a ação Login do Azure para autenticar-se no Azure.

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

Para obter mais informações sobre como fazer referência a 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 Java Setup SDK. Neste exemplo, você configurará o ambiente, compilará 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

Construa a sua imagem

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

Substitua os espaços reservados para {subscriptionID}, {rgName} e {Identity} pelo ID da assinatura, nome do grupo de recursos e nome da identidade gerida. Substitua os valores de {galleryName} pelo nome da sua galeria de imagens e de {imageName} pelo nome da sua imagem.

Observação

Se a ação Criar Imagem Baked 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

Entrada Obrigatório Description
resource-group-name Yes O grupo de recursos usado para armazenar e salvar artefatos durante o processo de compilação.
image-builder-template-name Não O nome do recurso de modelo do construtor de imagens usado.
location Yes O local onde o Azure Image Builder será executado. Consulte os locais suportados.
build-timeout-in-minutes Não Tempo limite após o qual a compilação é cancelada. Definido para 240.
vm-size Opcional Por padrão, Standard_D1_v2 será usado. Consulte os tamanhos das máquinas virtuais.
managed-identity Yes A identidade gerenciada pelo 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 SO 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 de base. Uma imagem de origem deve estar presente na mesma região do Azure definida no valor de entrada do local.
customizer-source Não O diretório onde 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 Este é o diretório na imagem personalizada para o qual os artefatos são copiados.
customizer-windows-update Não Apenas para Windows. Valor booleano. Se true, o criador de imagens executará a atualização do Windows após as personalizações.
dist-location Não Para SharedImageGallery, este é o dist-type.
dist-image-tags Não Essas são tags definidas pelo usuário que são adicionadas à imagem personalizada criada (exemplo: version:beta).

Crie sua máquina virtual

Como último passo, crie uma máquina virtual a partir da sua imagem.

  1. Substitua os espaços reservados de {rgName} pelo nome do 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 será capaz de 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 }}"              

YAML completo

  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óximos passos