共用方式為


教學課程:使用 GitHub Actions 將 Azure 裝置布建服務自動化

使用 GitHub Actions 等自動化工具來管理您的 IoT 裝置生命週期。 本教學課程示範使用 Azure 裝置布建服務 (DPS) 將裝置連線到 IoT 中樞的 GitHub Actions 工作流程。

在本教學課程中,您將瞭解如何:

  • 將驗證認證儲存為存放庫密碼。
  • 建立工作流程來佈建 IoT 中樞和裝置布建服務資源。
  • 執行工作流程,並在模擬裝置連線到 IoT 中樞時監視它。

先決條件

  • Azure 訂用帳戶

    如尚未擁有 Azure 訂用帳戶,請在開始之前先建立免費帳戶

  • Azure CLI

  • 具有您擁有的存放庫或您具有管理員存取權的存放庫的 GitHub 帳戶。 如需詳細資訊,請參閱 開始使用 GitHub

1 - 建立存放庫密碼

你在下一節定義的工作流程需要存取你的 Azure 訂閱才能建立和管理資源。 你不希望把這些資訊放在一個未受保護的檔案裡,避免被發現,所以我們改用儲存庫秘密來儲存這些資訊,但仍能讓它在工作流程中作為環境變數存取。 更多資訊請參閱「 在 GitHub Actions 中使用秘密」。

只有存放庫擁有者和系統管理員可以管理存放庫密碼。

建立服務主體

我們不提供個人存取憑證,而是建立一個服務主體,然後將這些憑證加入為儲存庫秘密。 使用 Azure CLI 來建立新的服務主體。 如需詳細資訊,請參閱使用 Azure CLI 建立 Azure 服務主體

  1. 使用 az ad sp create-for-rbac 命令來建立具有特定資源群組 參與者存取權 的服務主體。 將 <SUBSCRIPTION_ID><RESOURCE_GROUP_NAME> 取代為您的個人資訊。

    此命令需要訂閱中的擁有者或使用者存取系統管理員角色。

    az ad sp create-for-rbac --name github-actions-sp --role contributor --scopes /subscriptions/<SUBSCRIPTION_ID>/resourceGroups/<RESOURCE_GROUP_NAME>
    
  2. 從服務主體建立命令的輸出複製下列項目,以在下一節中使用:

    • clientId
    • clientSecret 的密碼。 這個值是為服務主體產生的密碼,你無法再存取。
    • tenantId
  3. 使用 az role assignment create 命令,將另外兩個存取角色指派給服務主體: Device Provisioning Service 資料參與者IoT 中樞資料參與者。 請將 <SP_CLIENT_ID> 以您從上一個命令輸出中複製的 clientId 值替換掉。

    az role assignment create --assignee "<SP_CLIENT_ID>" --role "Device Provisioning Service Data Contributor" --resource-group "<RESOURCE_GROUP_NAME>"
    
    az role assignment create --assignee "<SP_CLIENT_ID>" --role "IoT Hub Data Contributor" --resource-group "<RESOURCE_GROUP_NAME>"
    

將服務主體認證儲存為秘密

  1. GitHub.com 上,導覽至存放庫的 設定

  2. 從導覽功能表中選取 密碼,然後選取 動作。

  3. 選取 [新增存放庫祕密]

  4. 為您的服務主體識別碼建立金鑰。

    • 名稱APP_ID
    • 秘密:請將從服務主體建立命令的輸出中複製的 clientId 貼上。
  5. 選取 [ 新增密碼],然後選取 [ 新增存放庫密碼 ] 以新增第二個密碼。

  6. 為您的服務主體密碼创建一個機密。

    • 名稱SECRET
    • 祕密: 貼上您從服務主體建立命令輸出複製的 clientSecret
  7. 選取 [ 新增密碼],然後選取 [新增存放庫密碼 ] 以新增最終密碼。

  8. 為您的 Azure 租戶建立機密。

    • 名稱TENANT
    • 祕密: 貼上您從服務主體建立命令輸出複製的 tenantId
  9. 選取 [新增祕密]

2 - 建立工作流程

GitHub Actions 工作流程定義了事件觸發工作流程後執行的任務。 一個工作流程包含一個或多個工作,可平行或依序執行。 如需詳細資訊,請參閱 了解 GitHub Actions

在這個教程中,我們建立一個工作流程,包含以下每個任務的作業:

  • 佈建 IoT 中樞執行個體和 DPS 執行個體。
  • 將 IoT 中樞和 DPS 執行個體彼此連結。
  • 在 DPS 執行個體上建立個別註冊,並透過 DPS 註冊使用對稱金鑰驗證,將裝置註冊至 IoT 中樞。
  • 模擬裝置五分鐘,並監視 IoT 中樞事件。

工作流程是位於存放庫目錄中的 .github/workflows/ YAML 檔案。

  1. 在您的 GitHub 存放庫中,導覽至 [動作] 索引標籤。

  2. [動作] 窗格中,選取 [新增工作流程]。

  3. [選擇工作流程] 頁面上,您可以選擇要使用的預先建置範本。 我們將為本教學課程建立自己的工作流程,因此請選取 [ 自行設定工作流程]。

  4. GitHub 會為您建立新的工作流程檔案。 請注意,它位於目錄中 .github/workflows/ 。 為新檔案提供有意義的名稱,例如 dps-tutorial.yml

  5. 新增 名稱 參數,為您的工作流程命名。

    name: DPS Tutorial
    
  6. 新增 on.workflow_dispatch 參數。 參數 on 定義了工作流程何時執行。 此 workflow_dispatch 參數表示我們要手動觸發工作流程。 有了這個參數,我們可以定義 inputs 每次執行時會傳給工作流程,但這個教學沒有使用 inputs

    on: workflow_dispatch
    
  7. 定義您在工作流程中建立之資源的 環境變數 。 這些變數對工作流程中的所有工作都可用。 您也可以為個別工作或工作內的個別步驟定義環境變數。

    以您自己的值取代預留位置值。 請確定您指定服務主體有權存取的相同資源群組。

    env:
      HUB_NAME: <Globally unique IoT hub name>
      DPS_NAME: <Desired Device Provisioning Service name>
      DEVICE_NAME: <Desired device name>
      RESOURCE_GROUP: <Solution resource group where resources will be created>
    
  8. 定義您在上一節中建立的密碼的環境變數。

      SP_USER: ${{ secrets.APP_ID }}
      SP_SECRET: ${{ secrets.SECRET }}
      SP_TENANT: ${{ secrets.TENANT }}
    
  9. jobs 參數新增至工作流程檔案。

    jobs:
    
  10. 定義我們工作流程的第一個工作,我們稱之為 provision 工作。 此作業會配置 IoT 中樞和 DPS 執行個體:

      provision:
        runs-on: ubuntu-latest
        steps:
          - name: Provision Infra
            run: |
              az --version
              az login --service-principal -u "$SP_USER" -p "$SP_SECRET" --tenant "$SP_TENANT"
              az iot hub create -n "$HUB_NAME" -g "$RESOURCE_GROUP"
              az iot dps create -n "$DPS_NAME" -g "$RESOURCE_GROUP"
    

    如需此工作中執行之命令的相關資訊,請參閱:

  11. 定義作業來 configure DPS 和 IoT 中樞執行個體。 請注意,這個工作使用 needs 參數,這意味著 configure 工作必須等到所列的工作成功完成運行後才會啟動。

      configure:
        runs-on: ubuntu-latest
        needs: provision
        steps:
          - name: Configure Infra
            run: |
              az login --service-principal -u "$SP_USER" -p "$SP_SECRET" --tenant "$SP_TENANT"
              az iot dps linked-hub create --dps-name "$DPS_NAME" --hub-name "$HUB_NAME"   
    

    如需此工作中執行之命令的相關資訊,請參閱:

  12. 定義一個稱為 register 的工作,該工作會建立一個個人登記,然後利用該登記將裝置註冊到物聯網中心。

      register:
        runs-on: ubuntu-latest
        needs: configure
        steps:
          - name: Create enrollment
            run: |
              az login --service-principal -u "$SP_USER" -p "$SP_SECRET" --tenant "$SP_TENANT"
              az extension add --name azure-iot
              az iot dps enrollment create -n "$DPS_NAME" --eid "$DEVICE_NAME" --attestation-type symmetrickey --auth-type login
          - name: Register device
            run: |
              az iot device registration create -n "$DPS_NAME" --rid "$DEVICE_NAME" --auth-type login   
    

    備註

    此作業和其他作業會在某些命令中使用參數 --auth-type login ,指出作業應該使用目前 Microsoft Entra 工作階段中的服務主體。 另一種方式不需要 --auth-type key 服務主體設定,但安全性較低。

    如需此工作中執行之命令的相關資訊,請參閱:

  13. 定義一個工作給 simulate 連接到物聯網樞紐並傳送範例遙測訊息的物聯網裝置。

      simulate:
        runs-on: ubuntu-latest
        needs: register
        steps:
          - name: Simulate device
            run: |
              az login --service-principal -u "$SP_USER" -p "$SP_SECRET" --tenant "$SP_TENANT"
              az extension add --name azure-iot
              az iot device simulate -n "$HUB_NAME" -d "$DEVICE_NAME"
    

    如需此工作中執行之命令的相關資訊,請參閱:

  14. 定義作業來 monitor IoT 中樞端點的事件,並監看來自模擬裝置的訊息。 請注意,模擬監視工作都會在其參數中定義needs工作。 這種配置表示一旦 暫存器 工作成功完成,兩個工作會同時執行。

      monitor:
        runs-on: ubuntu-latest
        needs: register
        steps:
          - name: Monitor d2c telemetry
            run: |
              az login --service-principal -u "$SP_USER" -p "$SP_SECRET" --tenant "$SP_TENANT"
              az extension add --name azure-iot
              az iot hub monitor-events -n "$HUB_NAME" -y   
    

    如需此工作中執行之命令的相關資訊,請參閱:

  15. 完整的工作流程檔案應如下範例所示,您的資訊會取代環境變數中的預留位置值:

    name: DPS Tutorial
    
    on: workflow_dispatch
    
    env:
      HUB_NAME: <Globally unique IoT hub name>
      DPS_NAME: <Desired Device Provisioning Service name>
      DEVICE_NAME: <Desired device name>
      RESOURCE_GROUP: <Solution resource group where resources will be created>
      SP_USER: ${{ secrets.APP_ID }}
      SP_SECRET: ${{ secrets.SECRET }}
      SP_TENANT: ${{ secrets.TENANT }}
    
    jobs:
      provision:
        runs-on: ubuntu-latest
        steps:
          - name: Provision Infra
            run: |
              az --version
              az login --service-principal -u "$SP_USER" -p "$SP_SECRET" --tenant "$SP_TENANT"
              az iot hub create -n "$HUB_NAME" -g "$RESOURCE_GROUP"
              az iot dps create -n "$DPS_NAME" -g "$RESOURCE_GROUP"
      configure:
        runs-on: ubuntu-latest
        needs: provision
        steps:
          - name: Configure Infra
            run: |
              az login --service-principal -u "$SP_USER" -p "$SP_SECRET" --tenant "$SP_TENANT"
              az iot dps linked-hub create --dps-name "$DPS_NAME" --hub-name "$HUB_NAME"
      register:
        runs-on: ubuntu-latest
        needs: configure
        steps:
          - name: Create enrollment
            run: |
              az login --service-principal -u "$SP_USER" -p "$SP_SECRET" --tenant "$SP_TENANT"
              az extension add --name azure-iot
              az iot dps enrollment create -n "$DPS_NAME" --eid "$DEVICE_NAME" --attestation-type symmetrickey --auth-type login
          - name: Register device
            run: |
              az iot device registration create -n "$DPS_NAME" --rid "$DEVICE_NAME" --auth-type login
      simulate:
        runs-on: ubuntu-latest
        needs: register
        steps:
          - name: Simulate device
            run: |
              az login --service-principal -u "$SP_USER" -p "$SP_SECRET" --tenant "$SP_TENANT"
              az extension add --name azure-iot
              az iot device simulate -n "$HUB_NAME" -d "$DEVICE_NAME"
      monitor:
        runs-on: ubuntu-latest
        needs: register
        steps:
          - name: Monitor d2c telemetry
            run: |
              az login --service-principal -u "$SP_USER" -p "$SP_SECRET" --tenant "$SP_TENANT"
              az extension add --name azure-iot
              az iot hub monitor-events -n "$HUB_NAME" -y
    
  16. 儲存、認可此新檔案,並將其推送至您的 GitHub 存放庫。

3 - 執行工作流程

  1. 導覽至 GitHub 存放庫的 [動作] 索引標籤。

  2. 「動作」 窗格中,選取 DPS 教學課程,這是我們在工作流程檔案中定義的名稱,然後選取 「執行工作流程」 下拉式方塊。

    動作索引標籤的螢幕擷取畫面,您可以在其中選取工作流程並執行它。

  3. 如果您在主要分支以外的分支中建立工作流程,請變更分支,然後選取 [執行工作流程]。

  4. 新的工作流程執行會顯示為進行中。 點選名稱以檢視執行的詳細資料。

  5. 在工作流程摘要中,您可以觀看每個工作的開始和完成。 選取任何工作名稱以檢視其詳細資料。 模擬裝置作業會執行五分鐘,並將遙測傳送至 IoT 中樞。 在此期間,選取 模擬 作業以監看從裝置傳送的訊息,並選取 監視作業 以監看 IoT 中樞所接收的訊息。

  6. 當所有作業都順利完成時,您應該會在每項作業旁看到綠色核取記號。

    成功完成工作流程的螢幕擷取畫面。

清理資源

如果您不打算繼續使用本教學課程中建立的這些資源,請按照下列步驟刪除它們。

使用 Azure CLI:

  1. 列出資源群組中的資源。

    az resource list --resource-group <RESOURCE_GROUP_NAME>
    
  2. 若要刪除個別資源,請使用資源 ID。

    az resource delete --resource-group <RESOURCE_GROUP_NAME> --ids <RESOURCE_ID>
    
  3. 如果您想要刪除整個資源群組及其中的所有資源,請執行下列命令:

    az group delete --resource-group <RESOURCE_GROUP_NAME>
    

使用 Azure 入口網站:

  1. Azure 入口網站中,流覽至您建立新資源的資源群組。
  2. 您可以刪除整個資源群組,或選取要移除的個別資源,然後選取 [刪除]。

後續步驟

瞭解如何使用其他自動化工具佈建 DPS 執行個體。