Cvičení – vytvoření kanálu nasazení

Dokončeno

Když máte vytvořené všechny charty Helm, máte teď k dispozici všechny nástroje, které potřebujete k nasazení aplikace do AKS pomocí GitHub Actions. V této lekci dokončíte kanál CI/CD dokončením konečných kroků nasazení.

Diagram that shows the procession from triggers, through three build steps, to the deploy step in a pipeline.

Mezi kroky nasazení patří:

  • Vytvořte úlohu nasazení.
  • Nastavení Připojení Open ID (OIDC).
  • Nasaďte aplikaci pomocí Nástroje Helm.
  • Spusťte nasazení v produkčním prostředí.

Přidání úlohy nasazení

  1. V GitHubu přejděte do svého forku úložiště.

  2. Rozbalte adresář .github/workflows a otevřete soubor build-staging.yml pro úpravy.

  3. Přidejte novou deploy úlohu na konec souboru za build_push_image úlohu následujícím způsobem. Nezapomeňte se shodovat s odsazením.

    Úloha má tři klíče: runs-on, needsa permissions.

    • Pro runs-onpoužití, ubuntu-20.04 aby byla konzistentní s jinou úlohou.
    • Pro needspoužití názvu první úlohy, build_push_imagetakže aplikace se nasadí pouze po sestavení image.
    • Pro permissions, přidejte dva argumenty volaný id-token a contents. Nastavte id-token na write a contents na read, pokud chcete udělit GitHub Actions přístup k odesílání požadavků a čtení obsahu úložiště.
  4. Přidejte - uses: actions/checkout@v2 jako první krok úlohy.

    Přidaná deploy úloha by měla vypadat jako následující kód:

          deploy:
            runs-on: ubuntu-20.04
            needs: build_push_image
            permissions:
              id-token: write
              contents: read
    
            steps:
              - uses: actions/checkout@v2
    

Přidání kroku Instalace Helmu

Ke stažení a instalaci verze v3.3.1Helmu použijte akci GitHubu .

  1. Na pravém panelu stránky pro úpravy vyhledejte instalační program nástroje Helm. Vyberte první výsledek publikovaný v Azure.

    Screenshot that shows the search results for the Helm installer action.

  2. Výběrem ikony kopírování zkopírujte YAML využití.

    Screenshot that shows the copy function after selecting the Helm installer action.

  3. Zkopírujte a vložte YAML pod uses klíč do build-staging.yml.

  4. Přejmenujte krok od Helm tool installer do Install Helma připněte klávesu version na v3.3.1.

        steps:
          - uses: actions/checkout@v2
    
          - name: Install Helm
            uses: Azure/setup-helm@v1
            with:
              version: v3.3.1
    

Přidání kroku ověřování přihlášení k Azure

K ověření GitHub Actions pro přístup k AKS použijte OIDC.

  1. Na pravém panelu vyhledejte přihlašovací údaje Azure a vyberte Přihlášení Azure publikované v Azure.

    Screenshot that shows results for the Azure Login search.

  2. Výběrem ikony kopírování zkopírujte YAML využití a vložte ho Install Helm pod krok v build-staging.yml.

  3. Změňte název kroku z Azure Login na Sign in to Azure with OIDC.

  4. Azure Login vyžaduje k ověření tři parametry: client-id, tenant-ida subscription-id. Vyplňte tyto parametry zástupnými symboly pro tajné kódy, které nastavíte později.

          - name: Sign in to Azure with OIDC
            uses: Azure/login@v1.5.1
            with:
              client-id: ${{ secrets.AZURE_CLIENT_ID }}
              tenant-id: ${{ secrets.AZURE_TENANT_ID }}
              subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
    
  5. Na pravém panelu vyhledejte kontext sady a vyberte kontext sady Azure Kubernetes publikovaný v Azure.

    Screenshot that shows the results for a Set Context search.

  6. Výběrem ikony kopírování zkopírujte YAML využití a vložte ho Sign in to Azure with OIDC pod krok v build-staging.yml. resource-group Vyplňte zástupné symboly tajných kódů, které jste nastavili v předchozí lekci, a cluster-name parametry.

          - name: Azure Kubernetes set context
            uses: Azure/aks-set-context@v3
            with:
              resource-group: ${{ secrets.RESOURCE_GROUP }}
              cluster-name: ${{ secrets.CLUSTER_NAME }}
    

    Soubor build-staging.yml by měl vypadat jako v následujícím příkladu:

    name: Build and push the latest build to staging
    
        on:
          push:
            branches: [ main ]
    
        jobs:
          build_push_image:
            runs-on: ubuntu-20.04
    
            steps:
              - uses: actions/checkout@v2
    
              - name: Set up Buildx
                uses: docker/setup-buildx-action@v3.0.0
    
              - name: Docker Login
                uses: docker/login-action@v3.0.0
                with:
                  registry: ${{ secrets.ACR_NAME }}
                  username: ${{ secrets.ACR_LOGIN }}
                  password: ${{ secrets.ACR_PASSWORD }}
    
              - name: Build and push staging images
                uses: docker/build-push-action@v5.0.0
                with:
                  context: .
                  push: true
                  tags: ${{secrets.ACR_NAME}}/contoso-website:latest
    
          deploy:
            runs-on: ubuntu-20.04
            needs: build_push_image # Will wait for the execution of the previous job
            permissions:
              id-token: write # This is required for requesting the JWT
              contents: read  # This is required for actions/checkout
    
            steps:
              - uses: actions/checkout@v2
    
              - name: Install Helm
                uses: Azure/setup-helm@v1
                with:
                  version: v3.3.1
    
              - name: Sign in to Azure with OIDC
                uses: Azure/login@v1.5.1
                with:
                  client-id: ${{ secrets.AZURE_CLIENT_ID }}
                  tenant-id: ${{ secrets.AZURE_TENANT_ID }}
                  subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
    
              - name: Azure Kubernetes set context
                uses: Azure/aks-set-context@v3
                with:
                  resource-group: ${{ secrets.RESOURCE_GROUP }}
                  cluster-name: ${{ secrets.CLUSTER_NAME }}
    

Nastavení Připojení Open ID (OIDC)

Přiřaďte k tajným kódům hodnoty vytvořením instančního objektu a certifikátů pro přihlášení pomocí OIDC.

Vytvoření instančního objektu

  1. V Azure Cloud Shellu spusťte az account showa uložte id hodnotu z výstupu.

  2. Vytvořte instanční objekt spuštěním následujícího příkazu a nahraďte id hodnotu z předchozího příkazu následujícím příkazem:$SUBSCRIPTION_ID

    az ad sp create-for-rbac --scopes /subscriptions/$SUBSCRIPTION_ID --role Contributor 
    
  3. Zkopírujte výstup JSON a uložte ho pro další krok.

Nastavení tajných kódů

Na stránce úložiště GitHub vyberte kartu Nastavení a pak v nabídce vlevo vyberte Akce tajných kódů a proměnných>. Definujte následující tři nové tajné kódy, které používají výstup z předchozích kroků.

  • AZURE_CLIENT_ID: Hodnota "appId" z az ad sp create-for-rbac výstupu
  • AZURE_TENANT_ID: Hodnota "tenant" z az ad sp create-for-rbac výstupu
  • AZURE_SUBSCRIPTION_ID: Hodnota id z az account show výstupu

Pro každý tajný kód:

  1. Vyberte Nový tajný klíč úložiště.
  2. Do pole Název zadejte název tajného kódu.
  3. Jako tajný klíč zadejte hodnotu.
  4. Vyberte Add secret (Přidat tajný kód).

Přidání federovaných přihlašovacích údajů

Vytvořte federované certifikáty pro autorizaci GitHub Actions pro přístup k aplikaci.

  1. Na webu Azure Portal přejděte na Registrace aplikací.

  2. Vyhledejte a vyberte aplikaci, která odpovídá displayName hodnotě vrácené v předchozím az ad sp create-for-rbac kroku. Ve výchozím nastavení používá název aplikace časové razítko vytvoření instančního objektu.

  3. Ověřte, že hodnoty ID aplikace (ID klienta), ID objektu (ID objektu aplikace) a ID adresáře (ID tenanta) odpovídají předchozímu výstupu JSON.

  4. V levém navigačním panelu vyberte Certifikáty a tajné kódy.

  5. Na obrazovce Certifikáty a tajné kódy vyberte kartu Federované přihlašovací údaje.

  6. Vyberte Přidat přihlašovací údaje.

  7. Pokud chcete přidat pracovní přihlašovací údaje, vyberte na obrazovce Přidat přihlašovací údaje nebo zadejte následující informace:

    • Scénář federovaných přihlašovacích údajů: Vyberte GitHub Actions, které nasazují prostředky Azure.
    • Organizace: Zadejte uživatelské jméno GitHubu.
    • Úložiště: Zadejte mslearn-aks-deployment-pipeline-github-actions.
    • Typ entity: Vyberte větev.
    • Název větve GitHubu: Zadejte hlavní.
    • Název: Zadejte pracovní cred.
    • Popis Zadejte testování.
  8. Vyberte Přidat.

    Screenshot of the Add credential screen for the GitHub Actions staging credential.

  9. Pokud chcete přidat produkční přihlašovací údaje, znovu vyberte Přidat přihlašovací údaje a na obrazovce Přidat přihlašovací údaje zadejte všechny stejné hodnoty jako u předchozích přihlašovacích údajů s výjimkou:

    • Typ entity: Vyberte značku.
    • Název značky GitHubu: Zadejte v2.0.0, protože v dalším kroku nasadíte verzi 2.
    • Název: Zadejte prod-cred.
  10. Vyberte Přidat.

Nasazení aplikace pomocí Nástroje Helm

Teď, když jste nakonfigurovali Helm a udělili přístup ke clusteru, jste připraveni nasadit aplikaci.

Přidání kroku Run Helm Deploy

  1. Zpátky v souboru build-staging.yml na GitHubu vytvořte po posledním kroku úlohy deploy nový krok s názvem Run Helm Deploy. Pod ním přidejte další klíč s názvem run.

              - name: Run Helm Deploy
                run:
    
  2. Klíč můžete použít ke spuštění libovolného run příkazu prostředí uvnitř kontejneru. Tento kanál používá run klíč ke spuštění následujícího příkazu Helm:

    helm upgrade --install --create-namespace --atomic --wait 
        --namespace staging contoso-website \
        ./kubernetes/contoso-website \
        --set image.repository=${{ secrets.ACR_NAME }} \
        --set dns.name=${{ secrets.DNS_NAME }}
    

    Seznamte se s tím, co každý parametr dělá:

    Parametr Akce nebo hodnota
    helm upgrade Upgraduje nainstalovanou verzi.
    --install Pokud verze neexistuje, nainstaluje ji.
    --create-namespace Pokud obor názvů v příznaku --namespace neexistuje, vytvoří ho.
    --atomic Pokud se verze nezdaří, odebere všechny nainstalované úlohy.
    --wait Čeká na dokončení vydané verze a vrátí OK stav.
    --namespace staging contoso-website Nasadí contoso-website vydání do staging oboru názvů.
    ./kubernetes/contoso-website Umístění adresáře chartu
    --set image.repository Aktualizace hodnotu image.repository v souboru values.yaml pouze pro tuto verzi.
    --set dns.name dns.name Aktualizace klíč v souboru values.yaml pouze pro tuto verzi.
  3. Přidejte příkaz do souboru a nastavte ho tak, aby se spustil, počínaje znakem | . Tento Run Helm deploy krok by měl odpovídat tomuto příkladu:

      ...
          - name: Run Helm Deploy
            run: |
              helm upgrade \
                --install \
                --create-namespace \
                --atomic \
                --wait \
                --namespace staging \
                contoso-website \
                ./kubernetes/contoso-website \
                --set image.repository=${{ secrets.ACR_NAME }} \
                --set dns.name=${{ secrets.DNS_NAME }}
    

    Dokončený soubor build-staging.yml by měl vypadat jako v následujícím příkladu:

    name: Build and push the latest build to staging
    
        on:
          push:
            branches: [ main ]
    
        jobs:
          build_push_image:
            runs-on: ubuntu-20.04
    
            steps:
              - uses: actions/checkout@v2
    
              - name: Set up Buildx
                uses: docker/setup-buildx-action@v3.0.0
    
              - name: Docker Login
                uses: docker/login-action@v3.0.0
                with:
                  registry: ${{ secrets.ACR_NAME }}
                  username: ${{ secrets.ACR_LOGIN }}
                  password: ${{ secrets.ACR_PASSWORD }}
    
              - name: Build and push staging images
                uses: docker/build-push-action@v5.0.0
                with:
                  context: .
                  push: true
                  tags: ${{secrets.ACR_NAME}}/contoso-website:latest
    
          deploy:
            runs-on: ubuntu-20.04
            needs: build_push_image # Waits for the execution of the previous job
            permissions:
              id-token: write # Required for requesting the JWT
              contents: read  # Required for actions/checkout
    
            steps:
              - uses: actions/checkout@v2
    
              - name: Install Helm
                uses: Azure/setup-helm@v1
                with:
                  version: v3.3.1
    
              - name: Sign in to Azure with OIDC
                uses: Azure/login@v1.5.1
                with:
                  client-id: ${{ secrets.AZURE_CLIENT_ID }}
                  tenant-id: ${{ secrets.AZURE_TENANT_ID }}
                  subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
    
              - name: Azure Kubernetes set context
                uses: Azure/aks-set-context@v3
                with:
                  resource-group: ${{ secrets.RESOURCE_GROUP }}
                  cluster-name: ${{ secrets.CLUSTER_NAME }}
    
              - name: Run Helm Deploy
                run: |
                  helm upgrade \
                    --install \
                    --create-namespace \
                    --atomic \
                    --wait \
                    --namespace staging \
                    contoso-website \
                    ./kubernetes/contoso-website \
                    --set image.repository=${{ secrets.ACR_NAME }} \
                    --set dns.name=${{ secrets.DNS_NAME }}
    

Nastavení tajného kódu DNS_NAME

  1. Na nové kartě prohlížeče přejděte na fork úložiště, vyberte kartu Nastavení a pak v nabídce vlevo vyberte Akce tajných kódů a proměnných>.

  2. Vyberte Nový tajný klíč úložiště.

  3. Do pole Název zadejte DNS_NAME.

  4. Jako tajný klíč zadejte hodnotu název zóny DNS AKS z původního výstupu instalačního skriptu.

    Pokud tuto hodnotu nemáte, spusťte v Cloud Shellu následující příkaz a nahraďte hodnoty následujícími <resource-group-name> hodnotami:<aks-cluster-name>

    az aks show -g <resource-group-name> -n <aks-cluster-name> -o tsv --query addonProfiles.httpApplicationRouting.config.HTTPApplicationRoutingZoneName
    
  5. Vyberte Add secret (Přidat tajný kód).

Potvrzení změn a otestování přípravného nasazení

  1. Chcete-li potvrdit změny, vyberte Potvrdit změny. Zadejte popis potvrzení a pak vyberte Potvrdit změny.

  2. Výběrem karty Akce zobrazíte spuštěné sestavení.

  3. Po úspěšném sestavení přejděte v prohlížeči a contoso-staging.<aks-dns-zone-name> ověřte, že se web zobrazí.

Spuštění nasazení v produkčním prostředí

Dalším krokem je vytvoření produkčního pracovního postupu.

  1. V adresáři .github/workflows v úložišti otevřete soubor build-production.yml pro úpravy.

  2. deploy Zkopírujte úlohu z přípravného kanálu a vložte ji pod poslední řádek v souboru build-production.yml.

  3. Run Helm Deploy Změňte krok pro nasazení do produkčního oboru názvů změnou příznaku --namespace z staging na production.

  4. Na konci příkazu Helm přidejte nový parametr --set image.tag=${GITHUB_REF##*/}.

    Tady použijete funkci Bash s názvem rozšíření parametrů. Rozšíření ${ENV##<wildcard><character>} vrátí poslední výskyt řetězce za character.

    V tomto případě chcete získat pouze název značky, který je reprezentován jako modul runtime GITHUB_REFGitHub Actions . Větve jsou refs/heads/<branch>, zatímco značky jsou refs/tags/<tag>.

    Pokud chcete odebrat refs/tags/ jenom název značky, předáte ${GITHUB_REF##*/} vše za poslední / proměnnou GITHUB_REF prostředí.

    Konečný soubor build-production.yml by měl vypadat jako v následujícím příkladu:

    name: Build and push the tagged build to production
    
    permissions:
      id-token: write # This is required for requesting the JWT
      contents: read  # This is required for actions/checkout
    
    on:
      push:
        tags:
          - 'v*'
    
    jobs:
      build_push_image:
        runs-on: ubuntu-20.04
    
        steps:
          - uses: actions/checkout@v2
    
          - name: Fetch latest version
            id: fetch_version
            run: echo ::set-output name=TAG::${GITHUB_REF#refs/tags/}
    
          - name: Set up Buildx
            uses: docker/setup-buildx-action@v3.0.0
    
          - name: Docker Login
            uses: docker/login-action@v3.0.0
            with:
              registry: ${{ secrets.ACR_NAME }}
              username: ${{ secrets.ACR_LOGIN }}
              password: ${{ secrets.ACR_PASSWORD }}
    
          - name: Build and push production images
            uses: docker/build-push-action@v2
            with:
              context: .
              push: true
              tags: ${{secrets.ACR_NAME}}/contoso-website:latest,${{secrets.ACR_NAME}}/contoso-website:${{ steps.fetch_version.outputs.TAG }}
    
      deploy:
        runs-on: ubuntu-20.04
        needs: build_push_image
    
        steps:
          - uses: actions/checkout@v2
    
          - name: Install Helm
            uses: Azure/setup-helm@v1
            with:
              version: v3.3.1
    
          - name: Login to Azure with OIDC
            uses: azure/login@v1
            with:
              client-id: ${{ secrets.AZURE_CLIENT_ID }}
              tenant-id: ${{ secrets.AZURE_TENANT_ID }}
              subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
    
          - name: Azure Kubernetes set context
            uses: Azure/aks-set-context@v3
            with:
              resource-group: ${{ secrets.RESOURCE_GROUP }}
              cluster-name: ${{ secrets.CLUSTER_NAME }}
    
          - name: Run Helm Deploy
            run: |
              helm upgrade \
                --install \
                --create-namespace \
                --atomic \
                --wait \
                --namespace production \
                contoso-website \
                ./kubernetes/contoso-website \
                --set image.repository=${{ secrets.ACR_NAME }} \
                --set dns.name=${{ secrets.DNS_NAME }} \
                --set image.tag=${GITHUB_REF##*/}
    
  5. Chcete-li potvrdit změny, vyberte Potvrdit změny. Zadejte popis potvrzení a pak vyberte Potvrdit změny.

Produkční změny

Pokaždé, když spustíte produkční pracovní postup, musíte aktualizovat federovaný certifikát odpovídající verzí značky následujícím způsobem:

  1. Na webu Azure Portal přejděte na stránku aplikace a v levém navigačním panelu vyberte Certifikáty a tajné kódy .

  2. Vyberte kartu Federované přihlašovací údaje.

  3. Vyberte pověření cred.

  4. Na obrazovce Upravit přihlašovací údaje vedle položky Na základě výběru navyšte číslo značky na novou verzi v.x.x.x, například v.2.0.1.

  5. Vyberte Aktualizovat.

  6. V Cloud Shellu spusťte git pull a načtěte nejnovější změny. Potom spuštěním následujícího příkazu označte a nasdílejte změny a nahraďte zástupný symbol značkou nové verze:

    git tag -a v<new version tag> -m 'Create new production deployment' && git push --tags
    
  7. Po zobrazení výzvy zadejte pat z předchozích cvičení jako heslo.

  8. Na GitHubu otevřete kartu Actions a prohlédněte si spuštěný proces.

  9. Jakmile bude pracovní postup úspěšný, otestujte produkční nasazení, přejděte do contoso-production.<aks-dns-zone-name> prohlížeče a potvrďte, že se web zobrazí.

Pokračujte k další jednotce a odstraňte prostředky, aby se vám dál neúčtovaly poplatky.