تمرين - إنشاء البنية الأساسية لبرنامج ربط العمليات التجارية للتوزيع

مكتمل

مع مخططات Helm التي تم إنشاؤها، لديك الآن جميع الأدوات التي تحتاجها لنشر التطبيق إلى AKS باستخدام GitHub Actions. في هذه الوحدة، يمكنك إنهاء البنية الأساسية لبرنامج ربط العمليات التجارية CI/CD عن طريق إكمال خطوات النشر النهائية.

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

تتضمن خطوات التوزيع ما يلي:

  • إنشاء مهمة التوزيع.
  • إعداد open ID الاتصال (OIDC).
  • نشر التطبيق باستخدام Helm.
  • تشغيل النشر على الإنتاج.

إضافة مهمة التوزيع

  1. في GitHub، انتقل إلى نسخة المستودع.

  2. قم بتوسيع دليل .github/workflows وافتح ملف build-staging.yml للتحرير.

  3. أضف وظيفة جديدة deploy في نهاية الملف، بعد build_push_image المهمة، كما يلي. تأكد من مطابقة المسافة البادئة.

    تحتوي الوظيفة على ثلاثة مفاتيح: runs-onو needsو.permissions

    • بالنسبة runs-onإلى ، استخدم ubuntu-20.04 لتكون متسقة مع الوظيفة الأخرى.
    • بالنسبة إلى needs، استخدم اسم المهمة الأولى، build_push_image، لذلك يتم نشر التطبيق فقط بعد إنشاء الصورة
    • بالنسبة إلى permissions، أضف وسيطتين تسمى id-token و contents. قم بتعيين id-token إلى write وإلى readcontents ، لمنح GitHub Actions حق الوصول لإرسال الطلبات وقراءة محتويات المستودع.
  4. أضف - uses: actions/checkout@v2 كخطوة أولى من المهمة.

    يجب أن تبدو المهمة المضافة deploy مثل التعليمات البرمجية التالية:

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

إضافة خطوة تثبيت Helm

استخدم إجراء GitHub لتنزيل وتثبيت إصدار v3.3.1Helm .

  1. في اللوحة اليمنى من صفحة التحرير، ابحث عن مثبت أداة helm. حدد النتيجة الأولى التي نشرها Azure.

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

  2. حدد أيقونة النسخ لنسخ استخدام YAML.

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

  3. انسخ والصق YAML أسفل uses المفتاح في build-staging.yml.

  4. أعد تسمية الخطوة من Helm tool installer إلى Install Helm، وقم بتثبيت version المفتاح إلى v3.3.1.

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

إضافة خطوة مصادقة تسجيل الدخول إلى Azure

استخدم OIDC لمصادقة GitHub Actions للوصول إلى AKS.

  1. في اللوحة اليمنى، ابحث عن تسجيل الدخول إلى Azure، وحدد تسجيل الدخول إلى Azure المنشور بواسطة Azure.

    Screenshot that shows results for the Azure Login search.

  2. حدد أيقونة النسخ لنسخ استخدام YAML، والصقه أسفل Install Helm الخطوة في build-staging.yml.

  3. غير اسم الخطوة من Azure Login إلى Sign in to Azure with OIDC.

  4. Azure Loginيتطلب ثلاث معلمات للمصادقة: client-idو tenant-idو.subscription-id املأ هذه المعلمات بعناصر نائبة للبيانات السرية التي قمت بتعيينها لاحقا.

          - 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. في اللوحة اليمنى، ابحث عن سياق المجموعة، وحدد سياق مجموعة Azure Kubernetes المنشور بواسطة Azure.

    Screenshot that shows the results for a Set Context search.

  6. حدد أيقونة النسخ لنسخ استخدام YAML، والصقه أسفل Sign in to Azure with OIDC الخطوة في build-staging.yml. املأ resource-group المعلمات و cluster-name بعناصر نائبة للبيانات السرية التي قمت بتعيينها في وحدة سابقة.

          - 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 مثل المثال التالي:

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

إعداد open ID الاتصال (OIDC)

قم بتعيين قيم إلى أسرارك عن طريق إنشاء كيان خدمة وشهادات لتسجيل الدخول باستخدام OIDC.

إنشاء كيان الخدمة

  1. في Azure Cloud Shell، قم بتشغيل az account show، واحفظ id القيمة من الإخراج.

  2. إنشاء كيان خدمة عن طريق تشغيل الأمر التالي، واستبدال id القيمة من الأمر السابق ل $SUBSCRIPTION_ID:

    az ad sp create-for-rbac --scopes /subscriptions/$SUBSCRIPTION_ID --role Contributor 
    
  3. انسخ إخراج JSON واحفظه للخطوة التالية.

تعيين بيانات سرية

في صفحة مستودع GitHub، حدد علامة التبويب الإعدادات، ثم حدد Secrets and variables>Actions من القائمة اليسرى. حدد الأسرار الثلاثة الجديدة التالية التي تستخدم الإخراج من الخطوات السابقة.

  • AZURE_CLIENT_ID"appId": القيمة من az ad sp create-for-rbac الإخراج
  • AZURE_TENANT_ID"tenant": القيمة من az ad sp create-for-rbac الإخراج
  • AZURE_SUBSCRIPTION_IDid: القيمة من az account show الإخراج

لكل سر:

  1. حدد سر مستودع جديد.
  2. بالنسبة إلى Name، أدخل الاسم السري.
  3. بالنسبة إلى البيانات السرية، أدخل القيمة.
  4. حدد ⁧⁩Add secret⁧⁩.

إضافة بيانات اعتماد موحدة

إنشاء شهادات متحدة لتخويل إجراءات GitHub للوصول إلى التطبيق.

  1. في مدخل Microsoft Azure، انتقل إلى تسجيلات التطبيقات.

  2. ابحث عن التطبيق الذي يطابق القيمة التي displayName تم إرجاعها في الخطوة السابقة az ad sp create-for-rbac وحدده. بشكل افتراضي، يستخدم اسم التطبيق الطابع الزمني لإنشاء كيان الخدمة.

  3. تحقق من أن قيم appID (معرف العميل) ومعرف الكائن (معرف كائن التطبيق) ومعرف الدليل (معرف المستأجر) تتطابق مع إخراج JSON السابق.

  4. في جزء التنقل الأيمن، حدد Certificates & secrets.

  5. في شاشة Certificates and secrets ، حدد علامة التبويب Federated credentials .

  6. حدد إضافة بيانات اعتماد.

  7. لإضافة بيانات الاعتماد المرحلية، في شاشة إضافة بيانات اعتماد ، حدد المعلومات التالية أو أدخلها:

    • سيناريو بيانات الاعتماد الموحدة: حدد GitHub Actions التي تنشر موارد Azure.
    • المؤسسة: أدخل اسم مستخدم GitHub.
    • المستودع: أدخل mslearn-aks-deployment-pipeline-github-actions.
    • نوع الكيان: حدد Branch.
    • اسم فرع GitHub: أدخل main.
    • الاسم: أدخل staging-cred.
    • الوصف أدخل الاختبار.
  8. حدد إضافة.

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

  9. لإضافة بيانات اعتماد الإنتاج، حدد إضافة بيانات اعتماد مرة أخرى، وفي شاشة إضافة بيانات اعتماد ، أدخل جميع القيم نفسها كما في بيانات الاعتماد السابقة باستثناء:

    • نوع الكيان: حدد Tag.
    • اسم علامة GitHub: أدخل الإصدار 2.0.0، لأنه في الخطوة التالية تقوم بنشر الإصدار 2.
    • الاسم: أدخل prod-cred.
  10. حدد إضافة.

نشر التطبيق باستخدام Helm

الآن بعد أن قمت بتكوين Helm ومنح حق الوصول إلى نظام المجموعة الخاص بك، فأنت جاهز لنشر التطبيق.

إضافة خطوة Run Helm Deploy

  1. مرة أخرى في ملف build-staging.yml في GitHub، بعد الخطوة الأخيرة في deploy الوظيفة، قم بإنشاء خطوة جديدة باسم Run Helm Deploy. أسفله، أضف مفتاحا آخر يسمى run.

              - name: Run Helm Deploy
                run:
    
  2. يمكنك استخدام run المفتاح لتنفيذ أي أمر shell داخل الحاوية. يستخدم run هذا المسار المفتاح لتنفيذ أمر 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 }}
    

    فهم ما تفعله كل معلمة:

    المعلمة‬ الإجراء أو القيمة
    helm upgrade ترقية إصدار مثبت.
    --install إذا لم يكن الإصدار موجودا، فقم بتثبيته.
    --create-namespace إذا لم تكن مساحة الاسم في العلامة --namespace موجودة، فسينشئها.
    --atomic إذا فشل الإصدار، يزيل كافة أحمال العمل التي تم تثبيتها.
    --wait ينتظر حتى ينتهي الإصدار ويعيد OK الحالة.
    --namespace staging contoso-website contoso-website نشر الإصدار إلى staging مساحة الاسم.
    ./kubernetes/contoso-website موقع دليل المخططات.
    --set image.repository التحديثات قيمة image.repository في ملف values.yaml لهذا الإصدار فقط.
    --set dns.name dns.name التحديثات المفتاح في ملف values.yaml لهذا الإصدار فقط.
  3. أضف الأمر إلى الملف وقم بتعيينه للتشغيل، بدءا من | الحرف . Run Helm deploy يجب أن تتطابق الخطوة مع هذا المثال:

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

    يجب أن يبدو ملف build-staging.yml المكتمل مثل المثال التالي:

    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

  1. في علامة تبويب متصفح جديدة، انتقل إلى نسخة المستودع، وحدد علامة التبويب الإعدادات، ثم حدد Secrets and variables>Actions من القائمة اليسرى.

  2. حدد سر مستودع جديد.

  3. لـ الاسم، أدخل DNS_NAME.

  4. بالنسبة إلى البيانات السرية، أدخل قيمة اسم منطقة DNS AKS من إخراج البرنامج النصي الأصلي للإعداد.

    إذا لم يكن لديك هذه القيمة، فقم بتشغيل الأمر التالي في Cloud Shell، واستبدال قيمك ب <resource-group-name> و <aks-cluster-name>:

    az aks show -g <resource-group-name> -n <aks-cluster-name> -o tsv --query addonProfiles.httpApplicationRouting.config.HTTPApplicationRoutingZoneName
    
  5. حدد ⁧⁩Add secret⁧⁩.

تنفيذ التغييرات واختبار التوزيع المرحلي

  1. لتثبيت التغييرات، حدد Commit changes. أدخل وصفا للتثبيت، ثم حدد Commit changes.

  2. حدد علامة التبويب Actions لمشاهدة البنية قيد التشغيل.

  3. بعد نجاح البناء، في المستعرض، انتقل إلى contoso-staging.<aks-dns-zone-name> لتأكيد ظهور موقع الويب.

تشغيل التوزيع على الإنتاج

الخطوة التالية هي إنشاء سير عمل الإنتاج.

  1. في دليل .github/workflows في المستودع الخاص بك، افتح ملف build-production.yml للتحرير.

  2. انسخ deploy المهمة من البنية الأساسية لبرنامج ربط العمليات التجارية المرحلي والصقها أسفل السطر الأخير في ملف build-production.yml .

  3. Run Helm Deploy قم بتغيير الخطوة للنشر إلى مساحة اسم الإنتاج عن طريق تغيير العلامة --namespace من staging إلى production.

  4. في نهاية الأمر Helm، أضف معلمة جديدة، --set image.tag=${GITHUB_REF##*/}.

    هنا، يمكنك استخدام ميزة Bash تسمى توسيع المعلمة. يقوم التوسيع ${ENV##<wildcard><character>} بإرجاع آخر تكرار للسلسلة بعد character.

    في هذه الحالة، تريد الحصول على اسم العلامة فقط، والذي يتم تمثيله كوقت تشغيل إجراءات GitHub، GITHUB_REF. الفروع هي refs/heads/<branch>، بينما العلامات هي refs/tags/<tag>.

    تريد إزالة refs/tags/ للحصول على اسم العلامة فقط، لذلك يمكنك تمرير ${GITHUB_REF##*/} لإرجاع كل شيء بعد الأخير / في GITHUB_REF متغير البيئة.

    يجب أن يبدو ملف build-production.yml النهائي مثل المثال التالي:

    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. لتثبيت التغييرات، حدد Commit changes. أدخل وصفا للتثبيت، ثم حدد Commit changes.

تغييرات الإنتاج

في كل مرة تقوم فيها بتشغيل سير عمل الإنتاج، تحتاج إلى تحديث الشهادة الموحدة بإصدار العلامة المقابل، كما يلي:

  1. في مدخل Microsoft Azure، انتقل إلى صفحة التطبيق وحدد Certificates & secrets في التنقل الأيسر.

  2. حدد علامة التبويب Federated credentials.

  3. حدد بيانات الاعتماد prod-cred.

  4. في شاشة تحرير بيانات اعتماد ، بجوار استنادا إلى التحديد، قم بزيادة رقم العلامة إلى v.x.x.x جديد مثل v.2.0.1.

  5. حدد تحديث.

  6. في Cloud Shell، قم بتشغيل git pull لجلب أحدث التغييرات. ثم قم بتشغيل الأمر التالي لوضع علامة على التغييرات ودفعها، واستبدال علامة الإصدار الجديد بالعناد النائب:

    git tag -a v<new version tag> -m 'Create new production deployment' && git push --tags
    
  7. عند المطالبة، قم بتوفير PAT من التدريبات السابقة ككلمة مرور.

  8. في GitHub، افتح علامة التبويب Actions وشاهد العملية قيد التشغيل.

  9. بعد نجاح سير العمل، لاختبار توزيع الإنتاج، انتقل إلى contoso-production.<aks-dns-zone-name> في المستعرض وتأكد من ظهور موقع الويب.

تابع إلى الوحدة التالية لحذف مواردك حتى لا تستمر في تحمل الرسوم.