Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Per iniziare a usare GitHub Actions , creare un flusso di lavoro per creare un'immagine di macchina virtuale.
Con GitHub Actions è possibile velocizzare il processo CI/CD creando immagini di macchine virtuali personalizzate con artefatti dai flussi di lavoro. È possibile creare immagini e distribuirle in una raccolta immagini condivise.
È quindi possibile usare queste immagini per creare macchine virtuali e set di scalabilità di macchine virtuali.
L'azione di creazione dell'immagine per la macchina virtuale utilizza il servizio Azure Image Builder.
Prerequisiti
- Un account Azure con una sottoscrizione attiva. Creare un account gratuito.
- Un account GitHub con un repository attivo. Se non è disponibile, iscriversi per riceverne uno gratuito.
- Questo esempio usa l'applicazione di esempio Java Spring PetClinic.
- Una Galleria di Calcolo di Azure con un'immagine.
Panoramica dei file del flusso di lavoro
Un flusso di lavoro viene definito da un file YAML (con estensione yml) nel percorso /.github/workflows/ del repository. Questa definizione contiene i vari passaggi e i parametri che costituiscono il flusso di lavoro.
Il file include tre sezioni:
| Sezione | Tasks |
|---|---|
| Autenticazione | 1. Aggiungere un'identità gestita dall'utente. 2. Configurare un Principale del Servizio oppure Open ID Connect. 3. Creare un segreto GitHub. |
| Costruire | 1. Configurare l'ambiente. 2. Compilare l'app. |
| Image | 1. Creare un'immagine di macchina virtuale. 2. Creare una macchina virtuale. |
Creare un'identità gestita dall'utente
Per distribuire le immagini, è necessaria un'identità gestita dall'utente per Azure Image Builder (AIB). L'identità gestita assegnata dall'utente di Azure verrà usata durante la creazione dell'immagine per leggere e scrivere immagini in una Raccolta Immagini Condivise.
Creare identità gestita dall'utente con Azure CLI o il portale di Azure. Annotare il nome dell'identità gestita.
Personalizzare questo codice JSON. Sostituire i segnaposto
{subscriptionID}e{rgName}con l'ID della sottoscrizione e il nome del gruppo di risorse.{ "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": [] } ] } }Usare questo codice JSON per creare un nuovo ruolo personalizzato con JSON.
Nel portale di Azure, apri la raccolta di calcolo di Azure e vai a Controllo di accesso (IAM).
Selezionare Aggiungi assegnazione di ruolo e assegnare il ruolo di creazione dell'immagine all'identità gestita dall'utente.
Generare le credenziali per la distribuzione
Per usare l'azione di accesso di Azure con OIDC, è necessario configurare una credenziale di identità federata in un'applicazione Microsoft Entra o in un'identità gestita assegnata dall'utente.
Opzione 1: applicazione Microsoft Entra
- Creare un'applicazione Microsoft Entra con un'entità servizio tramite il portale di Azure, l'interfaccia della riga di comando di Azure o Azure PowerShell.
- Copiare i valori per ID client, ID sottoscrizione e ID directory (tenant) da usare più avanti nel flusso di lavoro di GitHub Actions.
- Assegnare un ruolo appropriato all'entità servizio portale di Azure, l'interfaccia della riga di comando di Azure o Azure PowerShell.
- Configurare una credenziale di identità federata in un'applicazione Microsoft Entra per considerare attendibili i token rilasciati da GitHub Actions nel repository GitHub.
Opzione 2: identità gestita assegnata dall'utente
- Creare un'identità gestita assegnata dall'utente.
- Copiare i valori per ID client, ID sottoscrizione e ID directory (tenant) da usare più avanti nel flusso di lavoro di GitHub Actions.
- Assegnare un ruolo appropriato all'identità gestita assegnata dall'utente.
- Configurare una credenziale di identità federata in un'identità gestita assegnata dall'utente per considerare attendibili i token emessi da GitHub Actions nel repository GitHub.
Creare segreti di GitHub
È necessario specificare l'ID client, l'ID directory (tenant) e l'ID della sottoscrizione della tua applicazione nell'azione di accesso. Questi valori possono essere forniti direttamente nel flusso di lavoro oppure possono essere archiviati nei segreti gitHub e riportati nel flusso di lavoro. Salvare i valori come segreti GitHub è l'opzione più sicura.
In GitHub, andare al proprio repository.
Selezionare Sicurezza > Segreti e variabili > Azioni.
Selezionare Nuovo segreto del repository.
Annotazioni
Per migliorare la sicurezza del flusso di lavoro nei repository pubblici, usare i segreti dell'ambiente anziché i segreti del repository. Se l'ambiente richiede l'approvazione, un processo non può accedere ai segreti dell'ambiente finché uno dei revisori necessari non lo approva.
Creare segreti per
AZURE_CLIENT_ID,AZURE_TENANT_IDeAZURE_SUBSCRIPTION_ID. Copiare questi valori dall'applicazione Microsoft Entra o dall'identità gestita assegnata dall'utente per i segreti GitHub:Segreto GitHub Applicazione Microsoft Entra o identità gestita assegnata dall'utente AZURE_CLIENT_ID ID cliente AZURE_SUBSCRIPTION_ID ID sottoscrizione AZURE_TENANT_ID ID della directory (cliente) Annotazioni
Per motivi di sicurezza, è consigliabile usare i segreti di GitHub anziché passare i valori direttamente al flusso di lavoro.
Usare l'azione di accesso di Azure
Usare il segreto GitHub con Azione di accesso ad Azure per autenticarsi su Azure.
Per Open ID Connect si userà una credenziale federata associata all'app Active Directory.
Per altre informazioni sul riferimento ai segreti GitHub in un file del flusso di lavoro, vedere Uso di segreti crittografati in un flusso di lavoro in 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 }}
Configurare Java
Configurare l'ambiente Java con l'azione Java Setup SDK. Per questo esempio si configurerà l'ambiente, si compilerà con Maven e quindi si restituirà un artefatto.
Gli artefatti di GitHub sono un modo per condividere i file in un flusso di lavoro tra processi. Si creerà un artefatto per contenere il file JAR e quindi aggiungerlo all'immagine della macchina virtuale.
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
Creare l'immagine
Usare l'azione Compila immagine macchina virtuale di Azure per creare un'immagine di macchina virtuale personalizzata.
Sostituire i segnaposto per {subscriptionID}, {rgName} e {Identity} con l'ID sottoscrizione, il nome del gruppo di risorse e il nome dell'identità gestita. Sostituire i valori di {galleryName} e {imageName} con il nome della galleria di immagini e il nome dell'immagine.
Annotazioni
Se l'azione Crea immagine baked dell'app ha esito negativo con un errore di permessi, verificare di aver assegnato il Ruolo di creazione dell'immagine all'identità gestita dall'utente.
- 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'
Argomenti delle azioni delle macchine virtuali
| Input | Obbligatorio | Description |
|---|---|---|
resource-group-name |
Yes | Gruppo di risorse usato per l'archiviazione e il salvataggio degli artefatti durante il processo di compilazione. |
image-builder-template-name |
NO | Nome della risorsa modello del generatore di immagini usata. |
location |
Yes | La posizione in cui verrà eseguito Azure Image Builder. Vedere i percorsi supportati. |
build-timeout-in-minutes |
NO | Tempo di annullamento del build. Il valore predefinito è 240. |
vm-size |
Opzionale | Per impostazione predefinita, Standard_D1_v2 verrà usato . Vedere Dimensioni delle macchine virtuali. |
managed-identity |
Yes | Identità gestita dall'utente creata in precedenza. Utilizzare l'identificatore completo se l'identità si trova in un gruppo di risorse diverso. Utilizzare il nome se si trova nello stesso gruppo di risorse. |
source-os |
Yes | Tipo di sistema operativo dell'immagine di base (Linux o Windows) |
source-image-type |
Yes | Tipo di immagine di base che verrà usato per la creazione dell'immagine personalizzata. |
source-image |
Yes | Identificatore della risorsa per l'immagine di base. Un'immagine di origine deve essere presente nella stessa area di Azure impostata nel valore di input della posizione. |
customizer-source |
NO | Directory in cui è possibile mantenere tutti gli artefatti che devono essere aggiunti all'immagine di base per la personalizzazione. Per impostazione predefinita, il valore è ${{ GITHUB.WORKSPACE }}/workflow-artifacts. |
customizer-destination |
NO | Si tratta della directory nell'immagine personalizzata in cui vengono copiati gli artefatti. |
customizer-windows-update |
NO | Solo per Windows. Valore booleano. Se true, il generatore di immagini eseguirà l'aggiornamento di Windows alla fine delle personalizzazioni. |
dist-location |
NO | Per SharedImageGallery, si tratta di dist-type. |
dist-image-tags |
NO | Si tratta di tag definiti dall'utente che vengono aggiunti all'immagine personalizzata creata (ad esempio: version:beta). |
Creare la macchina virtuale
Come ultimo passaggio, creare una macchina virtuale dall'immagine.
Sostituire i segnaposto per
{rgName}con il nome del gruppo di risorse.Aggiungere un segreto GitHub con la password della macchina virtuale (
VM_PWD). Assicurarsi di annotare la password perché non sarà possibile visualizzarla di nuovo. Il nome utente è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 }}"
Completare 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 }}"
Passaggi successivi
- Informazioni su come eseguire la distribuzione in Azure.