Dela via


Konfigurera en pipeline och push-uppdateringar

I den här artikeln får du lära dig hur du använder Azure Developer CLI (azd) för att skicka malländringar via en CI/CD-pipeline som GitHub Actions eller Azure DevOps. I det här exemplet använder du React-webbappen med Node.js API och MongoDB i Azure-mallen , men du kan tillämpa de principer som du lär dig i den här artikeln på någon av Azure Developer CLI-mallarna.

Kommentar

Kommandot azd pipeline config är fortfarande i betaversion. Läs mer om stöd för alfa- och betafunktioner på sidan med funktionsversioner och lanseringsstrategi .

Förutsättningar

azd mallar kan innehålla en standardkonfigurationsfil för GitHub Actions och/eller Azure DevOps-pipelinen med namnet azure-dev.yml, som krävs för att konfigurera CI/CD. Den här konfigurationsfilen etablerar dina Azure-resurser och distribuerar koden till huvudgrenen. Du hittar azure-dev.yml:

  • För GitHub Actions: i .github/workflows katalogen.
  • För Azure DevOps: i .azdo/pipelines katalogen.

Du kan använda konfigurationsfilen som den är eller ändra den efter dina behov.

Kommentar

Kontrollera att mallen har en pipelinedefinition (azure-dev.yaml) innan du anropar azd pipeline config. azd skapar inte den här filen automatiskt. Se Skapa en pipelinedefinition för azd nedan.

azd pipeline config Använd kommandot för att konfigurera en CI/CD-pipeline som hanterar följande uppgifter:

  • Skapar och konfigurerar ett huvudnamn för tjänsten för appen i Azure-prenumerationen. Användaren måste ha antingen Owner roll eller Contributor + User Access Administrator roller i Azure-prenumerationen för att azd ska kunna skapa och tilldela roller till tjänstens huvudnamn.
  • Steg dig genom ett arbetsflöde för att skapa och konfigurera en GitHub- eller Azure DevOps-lagringsplats och checka in projektkoden till den. Du kan också välja att använda en befintlig lagringsplats.
  • Skapar en säker anslutning mellan Azure och din lagringsplats.
  • Kör GitHub-åtgärden när du checkar in arbetsflödesfilen.

Om du vill ha mer detaljerad kontroll över den här processen, eller om du inte har de roller som krävs, kan du konfigurera en pipeline manuellt.

Välj önskad pipelineprovider för att fortsätta:

Auktorisera GitHub för att distribuera till Azure

För att konfigurera arbetsflödet måste du auktorisera ett huvudnamn för tjänsten för att distribuera till Azure för din räkning, från en GitHub-åtgärd. azd skapar tjänstens huvudnamn och en federerad autentiseringsuppgift för den.

  1. Kör följande kommando för att skapa Azure-tjänstens huvudnamn och konfigurera pipelinen:

    azd pipeline config
    

    Det här kommandot skapar eventuellt en GitHub-lagringsplats och skickar kod till den nya lagringsplatsen.

    Kommentar

    Som standard azd pipeline config använder OpenID Connect (OIDC) som kallas federerade autentiseringsuppgifter. Om du inte vill använda OIDC kör du azd pipeline config --auth-type client-credentials.

    OIDC/federerade autentiseringsuppgifter stöds inte för Terraform.

    Läs mer om OIDC-stöd i azd.

  2. Ange den begärda GitHub-informationen.

  3. När du uppmanas att genomföra och push-överföra dina lokala ändringar för att starta en ny GitHub Actions-körning anger du y.

  4. I terminalfönstret visar du resultatet av azd pipeline config kommandot. Kommandot azd pipeline config matar ut GitHub-lagringsplatsens namn för projektet.

  5. Öppna GitHub-lagringsplatsen för projektet med hjälp av webbläsaren.

  6. Välj Åtgärder för att se arbetsflödet köras.

    Skärmbild av github-arbetsflöde som körs.

Göra och push-överföra en kodändring

  1. Öppna i projektets /src/web/src/layout katalog header.tsx.

  2. Leta upp raden <Text variant="xLarge">ToDo</Text>.

  3. Ändra literalen ToDo till myTodo.

  4. Spara filen.

  5. Checka in ändringarna. Om du genomför ändringen startas GitHub Action-pipelinen för att distribuera uppdateringen.

    Skärmbild av de steg som krävs för att göra och genomföra ändringar i testfilen.

  6. Använd webbläsaren och öppna projektets GitHub-lagringsplats för att se båda:

    • Din incheckning
    • Incheckningen från GitHub Actions som konfigureras.

    Skärmbild av den incheckade ändringen i GitHub.

  7. Välj Åtgärder för att se testuppdateringen som visas i arbetsflödet.

    Skärmbild av GitHub-arbetsflödet som körs efter testuppdateringen.

  8. Gå till webbadressen till webbklientdelen för att inspektera uppdateringen.

azd som en GitHub-åtgärd

Lägg till azd som en GitHub-åtgärd. Den här åtgärden kommer att installera azd. Om du vill använda den kan du lägga till följande i .github\workflows\azure-dev.yml:

on: [push]

jobs:
   build:
      runs-on: ubuntu-latest
      steps:
         - name: Install azd
         uses: Azure/setup-azd@v0.1.0

Rensa resurser

När du inte längre behöver de Azure-resurser som skapats i den här artikeln kör du följande kommando:

azd down

Avancerade funktioner

Du kan utöka azd pipeline config kommandot för specifika mallscenarier eller krav enligt beskrivningen i följande avsnitt.

Ytterligare hemligheter eller variabler

Som standard azd anger du variabler och hemligheter för pipelinen. Kommandot skapar till exempel azd pipeline config variablerna subscription id, environment name och region as pipeline när den körs. Pipelinedefinitionen refererar sedan till dessa variabler:

env:
   AZURE_CLIENT_ID: ${{ vars.AZURE_CLIENT_ID }}
   AZURE_TENANT_ID: ${{ vars.AZURE_TENANT_ID }}
   AZURE_SUBSCRIPTION_ID: ${{ vars.AZURE_SUBSCRIPTION_ID }}
   AZURE_ENV_NAME: ${{ vars.AZURE_ENV_NAME }}
   AZURE_LOCATION: ${{ vars.AZURE_LOCATION }}

När pipelinen körs azd hämtar du värdena från miljön, som mappas till variablerna och hemligheterna. Beroende på mallen kan det finnas inställningar som du kan styra med hjälp av miljövariabler. En miljövariabel med namnet KEY_VAULT_NAME kan till exempel anges för att definiera namnet på en Key Vault-resurs i mallinfrastrukturen. I sådana fall kan listan över variabler och hemligheter definieras av mallen med hjälp azure.yamlav . Tänk till exempel på följande azure.yaml konfiguration:

pipeline:
  variables:
    - KEY_VAULT_NAME
    - STORAGE_NAME
  secrets:
    - CONNECTION_STRING

Med den här konfigurationen azd kontrollerar du om någon av variablerna eller hemligheterna har ett icke-tomt värde i miljön. azd skapar sedan antingen en variabel eller en hemlighet för pipelinen med namnet på nyckeln i konfigurationen som namnet på variabeln eller hemligheten och värdet som inte är sträng från miljön för värdet.

Pipelinedefinitionen azure-dev.yaml kan sedan referera till variablerna eller hemligheterna:

- name: Provision Infrastructure
   run: azd provision --no-prompt
   env:
      KEY_VAULT_NAME: ${{ variables.KEY_VAULT_NAME }}
      STORAGE_NAME: ${{ variables.STORAGE_NAME }}
      CONNECTION_STRING: ${{ secrets.CONNECTION_STRING }}

Kommentar

Du måste köra azd pipeline config efter att du har uppdaterat listan med hemligheter eller variabler i azure.yaml för azd för att återställa pipelinevärdena.

Infrastrukturparametrar

Tänk dig följande bicep-exempel:

@secure()
param BlobStorageConnection string

Parametern BlobStorageConnection har ingen standardvärdeuppsättning, så azd användaren uppmanas att ange ett värde. Det finns dock ingen interaktiv fråga under CI/CD. azd måste begära värdet för parametern när du kör azd pipeline config, spara värdet i pipelinen och sedan hämta värdet igen när pipelinen körs.

azd använder en pipelinehemlighet som anropas AZD_INITIAL_ENVIRONMENT_CONFIG för att automatiskt spara och ange värdet för alla obligatoriska parametrar i pipelinen. Du behöver bara referera till den här hemligheten i pipelinen:

- name: Provision Infrastructure
   run: azd provision --no-prompt
   env:
      AZD_INITIAL_ENVIRONMENT_CONFIG: ${{ secrets.AZD_INITIAL_ENVIRONMENT_CONFIG }}

När pipelinen körs azd tar du värdena för parametrarna från hemligheten, vilket tar bort behovet av en interaktiv fråga.

Kommentar

Du måste köra azd pipeline config igen om du lägger till en ny parameter.

Skapa en pipelinedefinition

Om mallen azd inte redan har en CI/CD-pipelinedefinitionsfil kan du skapa en själv. En CI/CD-pipelinedefinition har vanligtvis 4 huvudavsnitt:

  • utlösare
  • behörigheter
  • operativsystem eller pool
  • steg som ska köras

Följande exempel visar hur du skapar en definitionsfil och relaterade konfigurationer för GitHub Actions och Azure Pipelines.

För att köra azd i GitHub Actions krävs följande konfigurationer:

  • Bevilja id-token: write och contents: read få åtkomst till omfång.
  • Installera azd-åtgärden, såvida du inte använder en docker-avbildning där azd redan är installerad.

Du kan använda följande mall som utgångspunkt för din egen pipelinedefinition:

on:
  workflow_dispatch:
  push:
    # Run when commits are pushed to mainline branch (main or master)
    # Set this to the mainline branch you are using
    branches:
      - main
      - master

# Set this permission if you are using a Federated Credential.
permissions:
  id-token: write
  contents: read

jobs:
  build:
    runs-on: ubuntu-latest
    # azd build-in variables.
    # This variables are always set by `azd pipeline config`
    # You can set them as global env (apply to all steps) or you can add them to individual steps' environment
    env:
      AZURE_CLIENT_ID: ${{ vars.AZURE_CLIENT_ID }}
      AZURE_TENANT_ID: ${{ vars.AZURE_TENANT_ID }}
      AZURE_SUBSCRIPTION_ID: ${{ vars.AZURE_SUBSCRIPTION_ID }}
      AZURE_ENV_NAME: ${{ vars.AZURE_ENV_NAME }}
      AZURE_LOCATION: ${{ vars.AZURE_LOCATION }}
      ## Define the additional variables or secrets that are required globally (provision and deploy)
      # ADDITIONAL_VARIABLE_PLACEHOLDER: ${{ variables.ADDITIONAL_VARIABLE_PLACEHOLDER }}
      # ADDITIONAL_SECRET_PLACEHOLDER: ${{ secrets.ADDITIONAL_SECRET_PLACEHOLDER }}      
    steps:
      - name: Checkout
        uses: actions/checkout@v4

      # using the install-azd action
      - name: Install azd
        uses: Azure/setup-azd@v1.0.0

      # # If you want to use azd-daily build, or install it from a PR, you can remove previous step and
      # # use the next one:
      # - name: Install azd - daily or from PR
      #  # Update this scrip based on the OS - pool of your pipeline. This example is for a linux pipeline installing daily build
      #  run: curl -fsSL https://aka.ms/install-azd.sh | bash -s -- --version daily
      #  shell: pwsh

      # azd set up Federated Credential by default. You can remove this step if you are using Client Credentials
      - name: Log in with Azure (Federated Credentials)
        if: ${{ env.AZURE_CLIENT_ID != '' }}
        run: |
          azd auth login `
            --client-id "$Env:AZURE_CLIENT_ID" `
            --federated-credential-provider "github" `
            --tenant-id "$Env:AZURE_TENANT_ID"
        shell: pwsh

      ## If you set up your pipeline with Client Credentials, remove previous step and uncomment this one
      # - name: Log in with Azure (Client Credentials)
      #   if: ${{ env.AZURE_CREDENTIALS != '' }}
      #   run: |
      #     $info = $Env:AZURE_CREDENTIALS | ConvertFrom-Json -AsHashtable;
      #     Write-Host "::add-mask::$($info.clientSecret)"

      #     azd auth login `
      #       --client-id "$($info.clientId)" `
      #       --client-secret "$($info.clientSecret)" `
      #       --tenant-id "$($info.tenantId)"
      #   shell: pwsh
      #   env:
      #     AZURE_CREDENTIALS: ${{ secrets.AZURE_CREDENTIALS }}

      - name: Provision Infrastructure
        run: azd provision --no-prompt
        env:
         #  # uncomment this if you are using infrastructure parameters
         #  AZD_INITIAL_ENVIRONMENT_CONFIG: ${{ secrets.AZD_INITIAL_ENVIRONMENT_CONFIG }}
         ## Define the additional variables or secrets that are required only for provision 
         #  ADDITIONAL_VARIABLE_PLACEHOLDER: ${{ variables.ADDITIONAL_VARIABLE_PLACEHOLDER }}
         #  ADDITIONAL_SECRET_PLACEHOLDER: ${{ secrets.ADDITIONAL_SECRET_PLACEHOLDER }}

      - name: Deploy Application
        run: azd deploy --no-prompt
        env:
         ## Define the additional variables or secrets that are required only for deploy
         #  ADDITIONAL_VARIABLE_PLACEHOLDER: ${{ variables.ADDITIONAL_VARIABLE_PLACEHOLDER }}
         #  ADDITIONAL_SECRET_PLACEHOLDER: ${{ secrets.ADDITIONAL_SECRET_PLACEHOLDER }}