Alıştırma - Dağıtım işlem hattı oluşturma

Tamamlandı

Helm grafiklerini oluşturdunuz ve artık uygulamayı GitHub Actions'ı kullanarak AKS'ye dağıtmak için ihtiyacınız olan tüm araçlara sahipsiniz. Bu ünitede, son dağıtım adımlarını tamamlayarak CI/CD işlem hattını tamamlaacaksınız.

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

Dağıtım adımları şunlardır:

  • Dağıtım işini oluşturun.
  • Açık Kimlik Bağlan (OIDC) ayarlayın.
  • Uygulamayı Helm ile dağıtın.
  • Dağıtımı üretimde çalıştırın.

Dağıtım işini ekleme

  1. GitHub'da deponuzun çatalına gidin.

  2. .github/workflows dizinini genişletin ve düzenlemek üzere build-staging.yml dosyasını açın.

  3. Dosyanın sonuna, işin sonuna build_push_image aşağıdaki gibi yeni deploy bir iş ekleyin. Girintiyle eşleştiğinden emin olun.

    İşin üç anahtarı vardır: runs-on, needsve permissions.

    • için runs-on, diğer işle tutarlı olmak için kullanın ubuntu-20.04 .
    • için needsilk işin adını kullanın; build_push_imageböylece uygulama yalnızca görüntü oluşturulduktan sonra dağıtılır
    • için permissionsve contentsadlı id-token iki bağımsız değişken ekleyin. readwritecontents gitHub Actions'a istek gönderme ve depo içeriğini okuma erişimi vermek için ve olarak ayarlayınid-token.
  4. İşin ilk adımı olarak ekleyin - uses: actions/checkout@v2 .

    Eklenen deploy iş aşağıdaki kod gibi görünmelidir:

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

Helm'i Yükle adımını ekleme

Helm sürümünü v3.3.1indirmek ve yüklemek için GitHub eylemini kullanın.

  1. Düzenleme sayfasının sağ panelinde helm aracı yükleyicisini arayın. Azure tarafından yayımlanan ilk sonucu seçin.

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

  2. Kullanım YAML'sini kopyalamak için kopyala simgesini seçin.

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

  3. YAML'yi kopyalayıp build-staging.yml anahtarın usesaltına yapıştırın.

  4. adımını olarak Helm tool installerInstall Helmyeniden adlandırın ve anahtarını olarak v3.3.1sabitleyinversion.

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

Azure Oturum Açma kimlik doğrulaması adımını ekleme

AKS'ye erişmek için GitHub Actions'ın kimliğini doğrulamak için OIDC kullanın.

  1. Sağ panelde Azure oturum açma bilgilerini arayın ve Azure tarafından yayımlanan Azure Oturum Açma'yı seçin.

    Screenshot that shows results for the Azure Login search.

  2. Kullanım YAML'sini kopyalamak için kopyala simgesini seçin ve build-staging.yml adımının Install Helmaltına yapıştırın.

  3. Adım adını olarak Azure LoginSign in to Azure with OIDCdeğiştirin.

  4. Azure Login kimlik doğrulaması için üç parametre gerektirir: client-id, tenant-idve subscription-id. Bu parametreleri daha sonra ayarladığınız gizli diziler için yer tutucularla doldurun.

          - 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. Sağ panelde küme bağlamı için arama yapın ve Azure tarafından yayımlanan Azure Kubernetes set bağlamını seçin.

    Screenshot that shows the results for a Set Context search.

  6. Kullanım YAML'sini kopyalamak için kopyala simgesini seçin ve build-staging.yml adımının Sign in to Azure with OIDCaltına yapıştırın. resource-group ve cluster-name parametrelerini önceki bir ünitede ayarladığınız gizli diziler için yer tutucularla doldurun.

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

    build-staging.yml dosyanız aşağıdaki örnekteki gibi görünmelidir:

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

Açık Kimlik Bağlan (OIDC) ayarlama

OIDC ile oturum açmak için bir hizmet sorumlusu ve sertifikalar oluşturarak gizli dizilerinize değerler atayın.

Hizmet sorumlusunu oluşturma

  1. Azure Cloud Shell'de komutunu çalıştırın az account showve çıkıştaki id değeri kaydedin.

  2. Aşağıdaki komutu çalıştırarak bir hizmet sorumlusu oluşturun ve id değerini için önceki komuttan $SUBSCRIPTION_IDyazın:

    az ad sp create-for-rbac --scopes /subscriptions/$SUBSCRIPTION_ID --role Contributor 
    
  3. JSON çıkışını kopyalayın ve sonraki adım için kaydedin.

Gizli dizileri ayarlama

GitHub depo sayfanızda Ayarlar sekmesini ve ardından sol menüden Gizli Diziler ve değişkenler>Eylemler'i seçin. Önceki adımlardan çıktıyı kullanan aşağıdaki üç yeni gizli diziyi tanımlayın.

  • AZURE_CLIENT_ID: Çıkıştan "appId" gelen az ad sp create-for-rbac değer
  • AZURE_TENANT_ID: Çıkıştan "tenant" gelen az ad sp create-for-rbac değer
  • AZURE_SUBSCRIPTION_ID: Çıkıştan id gelen az account show değer

Her gizli dizi için:

  1. Yeni depo gizli dizisi'ni seçin.
  2. Ad alanına gizli dizi adını girin.
  3. Gizli Dizi için değerini girin.
  4. Add secret (Gizli dizi ekle) öğesini seçin.

Federasyon kimlik bilgileri ekleme

GitHub Actions'ı uygulamaya erişme yetkisi vermek için federasyon sertifikaları oluşturun.

  1. Azure portalında Uygulama kayıtları gidin.

  2. Önceki az ad sp create-for-rbac adımda döndürülen değerle displayName eşleşen uygulamayı arayın ve seçin. Varsayılan olarak, uygulama adı hizmet sorumlusu oluşturma işleminin zaman damgasını kullanır.

  3. appID (İstemci Kimliği), Nesne Kimliği (Uygulama Nesne Kimliği) ve Dizin Kimliği (Kiracı Kimliği) değerlerinin önceki JSON çıkışıyla eşleşip eşleşmediğini doğrulayın.

  4. Sol gezinti bölmesinde Sertifikalar ve gizli diziler'i seçin.

  5. Sertifikalar ve gizli diziler ekranında Federasyon kimlik bilgileri sekmesini seçin.

  6. Kimlik bilgisi ekle'yi seçin.

  7. Hazırlama kimlik bilgilerini eklemek için, Kimlik bilgisi ekle ekranında aşağıdaki bilgileri seçin veya girin:

    • Federasyon kimlik bilgisi senaryosu: Azure kaynaklarını dağıtan GitHub Actions'ı seçin.
    • Kuruluş: GitHub kullanıcı adınızı girin.
    • Depo: mslearn-aks-deployment-pipeline-github-actions girin.
    • Varlık türü: Dal'ı seçin.
    • GitHub dal adı: main girin.
    • Ad: staging-cred girin.
    • Açıklama Testi Girin.
  8. Ekle'yi seçin.

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

  9. Üretim kimlik bilgilerini eklemek için Kimlik bilgisi ekle'yi yeniden seçin ve Kimlik bilgisi ekle ekranında, aşağıdakiler dışında önceki kimlik bilgileriyle aynı değerleri girin:

    • Varlık türü: Etiket'i seçin.
    • GitHub etiket adı: v2.0.0 girin, çünkü sonraki adımda sürüm 2'yi dağıtacaksınız.
    • Ad: prod-cred girin.
  10. Ekle'yi seçin.

Helm ile uygulamayı dağıtma

Helm'i yapılandırdığınıza ve kümenize erişim tanıdığınıza göre, uygulamayı dağıtmaya hazırsınız demektir.

Helm Dağıtmayı Çalıştır adımını ekleme

  1. GitHub'daki build-staging.yml dosyasına dönün, işteki en son adımdan deploy sonra adlı Run Helm Deployyeni bir adım oluşturun. Altına adlı runbaşka bir anahtar ekleyin.

              - name: Run Helm Deploy
                run:
    
  2. kapsayıcısının run içindeki herhangi bir kabuk komutunu yürütmek için anahtarını kullanabilirsiniz. Bu işlem hattı aşağıdaki run Helm komutunu yürütmek için anahtarını kullanır:

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

    Her parametrenin ne yaptığını anlama:

    Parametre Eylem veya değer
    helm upgrade Yüklü sürümü yükseltir.
    --install Sürüm yoksa yükler.
    --create-namespace Bayraktaki --namespace ad alanı yoksa, bunu oluşturur.
    --atomic Sürüm başarısız olursa, yüklenmiş olan tüm iş yüklerini kaldırır.
    --wait Yayının bitmesini bekler ve durumu döndürür OK .
    --namespace staging contoso-website contoso-website Yayını staging ad alanına dağıtır.
    ./kubernetes/contoso-website Grafik dizininin konumu.
    --set image.repository image.repository yalnızca bu sürüm için values.yaml dosyasında değerini Güncelleştirmeler.
    --set dns.name dns.nameAnahtarı yalnızca bu sürüm için values.yaml dosyasında Güncelleştirmeler.
  3. komutu dosyaya ekleyin ve karakterden | başlayarak çalışacak şekilde ayarlayın. Adım Run Helm deploy şu örnekle eşleşmelidir:

      ...
          - 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 }}
    

    Tamamlanmış build-staging.yml dosyanız aşağıdaki örnekteki gibi görünmelidir:

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

DNS_NAME gizli dizisini ayarlama

  1. Yeni bir tarayıcı sekmesinde depo çatalınıza gidin, Ayarlar sekmesini seçin ve ardından sol menüden Gizli Diziler ve değişkenler>Eylemler'i seçin.

  2. Yeni depo gizli dizisi'ni seçin.

  3. Ad için DNS_NAME yazın.

  4. Gizli Dizi için, özgün kurulum betiği çıkışınızdan AKS DNS Bölge Adı değerini girin.

    Bu değere sahip değilseniz Cloud Shell'de aşağıdaki komutu çalıştırarak ve <aks-cluster-name>değerlerini <resource-group-name> yazın:

    az aks show -g <resource-group-name> -n <aks-cluster-name> -o tsv --query addonProfiles.httpApplicationRouting.config.HTTPApplicationRoutingZoneName
    
  5. Add secret (Gizli dizi ekle) öğesini seçin.

Değişiklikleri işleme ve hazırlama dağıtımını test etme

  1. Değişikliklerinizi işlemek için Değişiklikleri işle'yi seçin. İşleme için bir açıklama girin ve Değişiklikleri işle'yi seçin.

  2. Derlemenin çalıştığını görmek için Eylemler sekmesini seçin.

  3. Derleme başarılı olduktan sonra tarayıcınızda web sitesinin göründüğünü onaylamak için contoso-staging.<aks-dns-zone-name> adresine gidin.

Dağıtımı üretimde çalıştırma

Sonraki adım, üretim iş akışını oluşturmaktır.

  1. Deponuzdaki .github/workflows dizininde düzenlemek üzere build-production.yml dosyasını açın.

  2. deploy Hazırlama işlem hattındaki işi kopyalayın ve build-production.yml dosyasındaki son satırın altına yapıştırın.

  3. bayrağını Run Helm Deploystagingproductionolarak değiştirerek --namespace üretim ad alanına dağıtılacak adımı değiştirin.

  4. Helm komutunun sonuna yeni bir parametre ekleyin. --set image.tag=${GITHUB_REF##*/}

    Burada parametre genişletme adlı bir Bash özelliği kullanırsınız. Genişletme ${ENV##<wildcard><character>} , dizenin charactersonrasındaki son oluşumunu döndürür.

    Bu durumda, yalnızca GitHub Actions çalışma zamanı GITHUB_REFolarak temsil edilen etiket adını almak istiyorsunuz. Dallar şeklindeyken refs/heads/<branch>etiketler şeklindedir refs/tags/<tag>.

    Yalnızca etiket adını almak için kaldırmak refs/tags/ istiyorsunuz, bu nedenle ortam değişkenindeki GITHUB_REF son / etiketten sonraki her şeyi döndürmek için geçiş ${GITHUB_REF##*/} yapmak istiyorsunuz.

    Son build-production.yml dosyanız aşağıdaki örnekteki gibi görünmelidir:

    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. Değişikliklerinizi işlemek için Değişiklikleri işle'yi seçin. İşleme için bir açıklama girin ve Değişiklikleri işle'yi seçin.

Üretim değişiklikleri

Üretim iş akışını her çalıştırdığınızda, federasyon sertifikasını ilgili etiket sürümüyle aşağıdaki gibi güncelleştirmeniz gerekir:

  1. Azure portalında uygulama sayfanıza gidin ve sol gezinti bölmesinde Sertifikalar ve gizli diziler'i seçin.

  2. Federasyon kimlik bilgileri sekmesini seçin.

  3. Prod cred kimlik bilgilerini seçin.

  4. Kimlik bilgilerini düzenle ekranında, Seçime göre seçeneğinin yanında, etiket numarasını v.2.0.1 gibi yeni bir v.x.x.x olarak artırın.

  5. Güncelleştir'i seçin.

  6. Cloud Shell'de komutunu çalıştırarak git pull en son değişiklikleri getirin. Ardından, değişiklikleri etiketlemek ve göndermek için aşağıdaki komutu çalıştırın ve yer tutucu için yeni sürüm etiketinizi yazın:

    git tag -a v<new version tag> -m 'Create new production deployment' && git push --tags
    
  7. İstendiğinde, önceki alıştırmalardan PAT'yi parola olarak belirtin.

  8. GitHub'da Eylemler sekmesini açın ve çalışan işlemi görün.

  9. İş akışı başarılı olduktan sonra üretim dağıtımını test etmek için contoso-production.<aks-dns-zone-name> tarayıcınızda adresine gidin ve web sitesinin göründüğünü onaylayın.

Ücret uygulanmaması için kaynaklarınızı silmek için bir sonraki üniteye geçin.