使用 GitHub Actions 等自動化工具來管理您的 IoT 裝置生命週期。 本教學課程示範使用 Azure 裝置布建服務 (DPS) 將裝置連線到 IoT 中樞的 GitHub Actions 工作流程。
在本教學課程中,您將瞭解如何:
- 將驗證認證儲存為存放庫密碼。
- 建立工作流程來佈建 IoT 中樞和裝置布建服務資源。
- 執行工作流程,並在模擬裝置連線到 IoT 中樞時監視它。
先決條件
Azure 訂用帳戶
如尚未擁有 Azure 訂用帳戶,請在開始之前先建立免費帳戶。
Azure CLI
使用 Azure Cloud Shell 中的 Bash 環境。
或者,如果你想在本地執行 CLI 參考指令,可以 安裝 Azure CLI。 如果您在 Windows 或 macOS 上執行,請考慮 在 Docker 容器中執行 Azure CLI。
如果您使用的是本機安裝,請使用 az login 命令,透過 Azure CLI 來登入。
執行 az version 以尋找已安裝的版本和相依程式庫。 若要升級至最新版本,請執行 az upgrade。
具有您擁有的存放庫或您具有管理員存取權的存放庫的 GitHub 帳戶。 如需詳細資訊,請參閱 開始使用 GitHub。
1 - 建立存放庫密碼
你在下一節定義的工作流程需要存取你的 Azure 訂閱才能建立和管理資源。 你不希望把這些資訊放在一個未受保護的檔案裡,避免被發現,所以我們改用儲存庫秘密來儲存這些資訊,但仍能讓它在工作流程中作為環境變數存取。 更多資訊請參閱「 在 GitHub Actions 中使用秘密」。
只有存放庫擁有者和系統管理員可以管理存放庫密碼。
建立服務主體
我們不提供個人存取憑證,而是建立一個服務主體,然後將這些憑證加入為儲存庫秘密。 使用 Azure CLI 來建立新的服務主體。 如需詳細資訊,請參閱使用 Azure CLI 建立 Azure 服務主體。
使用 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>從服務主體建立命令的輸出複製下列項目,以在下一節中使用:
- clientId。
- clientSecret 的密碼。 這個值是為服務主體產生的密碼,你無法再存取。
- tenantId。
使用 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>"
將服務主體認證儲存為秘密
在 GitHub.com 上,導覽至存放庫的 設定 。
從導覽功能表中選取 密碼,然後選取 動作。
選取 [新增存放庫祕密]。
為您的服務主體識別碼建立金鑰。
-
名稱:
APP_ID - 秘密:請將從服務主體建立命令的輸出中複製的 clientId 貼上。
-
名稱:
選取 [ 新增密碼],然後選取 [ 新增存放庫密碼 ] 以新增第二個密碼。
為您的服務主體密碼创建一個機密。
-
名稱:
SECRET - 祕密: 貼上您從服務主體建立命令輸出複製的 clientSecret。
-
名稱:
選取 [ 新增密碼],然後選取 [新增存放庫密碼 ] 以新增最終密碼。
為您的 Azure 租戶建立機密。
-
名稱:
TENANT - 祕密: 貼上您從服務主體建立命令輸出複製的 tenantId。
-
名稱:
選取 [新增祕密]。
2 - 建立工作流程
GitHub Actions 工作流程定義了事件觸發工作流程後執行的任務。 一個工作流程包含一個或多個工作,可平行或依序執行。 如需詳細資訊,請參閱 了解 GitHub Actions。
在這個教程中,我們建立一個工作流程,包含以下每個任務的作業:
- 佈建 IoT 中樞執行個體和 DPS 執行個體。
- 將 IoT 中樞和 DPS 執行個體彼此連結。
- 在 DPS 執行個體上建立個別註冊,並透過 DPS 註冊使用對稱金鑰驗證,將裝置註冊至 IoT 中樞。
- 模擬裝置五分鐘,並監視 IoT 中樞事件。
工作流程是位於存放庫目錄中的 .github/workflows/ YAML 檔案。
在您的 GitHub 存放庫中,導覽至 [動作] 索引標籤。
在 [動作] 窗格中,選取 [新增工作流程]。
在 [選擇工作流程] 頁面上,您可以選擇要使用的預先建置範本。 我們將為本教學課程建立自己的工作流程,因此請選取 [ 自行設定工作流程]。
GitHub 會為您建立新的工作流程檔案。 請注意,它位於目錄中
.github/workflows/。 為新檔案提供有意義的名稱,例如dps-tutorial.yml。新增 名稱 參數,為您的工作流程命名。
name: DPS Tutorial新增 on.workflow_dispatch 參數。 參數
on定義了工作流程何時執行。 此workflow_dispatch參數表示我們要手動觸發工作流程。 有了這個參數,我們可以定義inputs每次執行時會傳給工作流程,但這個教學沒有使用inputs。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 參數新增至工作流程檔案。
jobs:定義我們工作流程的第一個工作,我們稱之為
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"如需此工作中執行之命令的相關資訊,請參閱:
定義作業來
configureDPS 和 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"如需此工作中執行之命令的相關資訊,請參閱:
定義一個稱為
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服務主體設定,但安全性較低。如需此工作中執行之命令的相關資訊,請參閱:
定義一個工作給
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"如需此工作中執行之命令的相關資訊,請參閱:
定義作業來
monitorIoT 中樞端點的事件,並監看來自模擬裝置的訊息。 請注意,模擬和監視工作都會在其參數中定義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如需此工作中執行之命令的相關資訊,請參閱:
完整的工作流程檔案應如下範例所示,您的資訊會取代環境變數中的預留位置值:
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儲存、認可此新檔案,並將其推送至您的 GitHub 存放庫。
3 - 執行工作流程
導覽至 GitHub 存放庫的 [動作] 索引標籤。
在 「動作」 窗格中,選取 DPS 教學課程,這是我們在工作流程檔案中定義的名稱,然後選取 「執行工作流程」 下拉式方塊。
如果您在主要分支以外的分支中建立工作流程,請變更分支,然後選取 [執行工作流程]。
新的工作流程執行會顯示為進行中。 點選名稱以檢視執行的詳細資料。
在工作流程摘要中,您可以觀看每個工作的開始和完成。 選取任何工作名稱以檢視其詳細資料。 模擬裝置作業會執行五分鐘,並將遙測傳送至 IoT 中樞。 在此期間,選取 模擬 作業以監看從裝置傳送的訊息,並選取 監視作業 以監看 IoT 中樞所接收的訊息。
當所有作業都順利完成時,您應該會在每項作業旁看到綠色核取記號。
清理資源
如果您不打算繼續使用本教學課程中建立的這些資源,請按照下列步驟刪除它們。
使用 Azure CLI:
列出資源群組中的資源。
az resource list --resource-group <RESOURCE_GROUP_NAME>若要刪除個別資源,請使用資源 ID。
az resource delete --resource-group <RESOURCE_GROUP_NAME> --ids <RESOURCE_ID>如果您想要刪除整個資源群組及其中的所有資源,請執行下列命令:
az group delete --resource-group <RESOURCE_GROUP_NAME>
使用 Azure 入口網站:
- 在 Azure 入口網站中,流覽至您建立新資源的資源群組。
- 您可以刪除整個資源群組,或選取要移除的個別資源,然後選取 [刪除]。
後續步驟
瞭解如何使用其他自動化工具佈建 DPS 執行個體。