在這個教學中,你將學習如何將 Azure 部署環境整合進你的 CI/CD 管線中。 你可以使用任何支援 CI/CD 的 GitOps 服務提供者,例如 GitHub Actions、Azure Arc、GitLab 或 Jenkins。
持續整合與持續傳遞 (CI/CD) 是一種軟體開發方法,可協助小組將建置、測試及部署軟體變更的流程自動化。 CI/CD 讓你能更頻繁且更有信心地發布軟體變更。
你使用的工作流程包含三個分支:主分支、開發分支和測試分支。
- 主分支始終被視為生產部門。
- 你可以從 主 分支建立特徵分支。
- 您可以建立提取要求,將功能分支合併至主分支。
這個教學的工作流程是一個簡化的範例。 現實世界的工作流程可能會更複雜。
在開始本教學之前,您可以透過複習 Azure 部署環境的關鍵概念,熟悉部署環境的元件與概念。
在本教學課程中,您將瞭解如何:
- 建立並設定開發中心
- 建立金鑰保存庫
- 建立並配置 GitHub 倉庫
- 把目錄連接到你的開發中心
- 配置部署識別碼
- 配置 GitHub 環境
- 測試 CI/CD 管線
先決條件
| Product | 需求 |
|---|---|
| Azure雲服務 | - Azure 訂用帳戶。 - Azure 訂閱的擁有者權限。 - Azure CLI 已安裝。 |
| Git | - 一個 GitHub 帳號。 - Git 已安裝。 |
1. 建立並配置開發中心
在本節中,你會建立一個 Azure 部署環境開發中心和專案,包含三種環境類型: 開發、 測試和 生產環境。
- 生產環境類型包含單一生產環境。
- 為每個功能分支在Dev中創建一個新環境。
- 在 測試 中,會為每個拉取請求建立一個新的環境。
1.1 Set up Azure CLI
首先,登入 Azure。 執行以下指令,並依照提示完成認證流程:
az login
現在,安裝 Azure CLI 的 Azure DevCenter 擴充功能:
az extension add --name devcenter --upgrade
現在安裝了目前的擴充功能,請註冊命名空間:Microsoft.DevCenter
az provider register --namespace Microsoft.DevCenter
小提示
在整個教學過程中,你會儲存幾個值作為環境變數,方便日後使用。 你也可以考慮將這些數值記錄在其他地方,以確保需要時能取得。
取得你的使用者 ID,並設定為環境變數以備後用:
MY_AZURE_ID=$(az ad signed-in-user show --query id -o tsv)
取得您目前訂閱的訂閱 ID:
AZURE_SUBSCRIPTION_ID=$(az account show --query id --output tsv)
取得您目前租戶的租戶識別碼:
AZURE_TENANT_ID=$(az account show --query tenantId --output tsv)
設定下列環境變數:
LOCATION="eastus"
AZURE_RESOURCE_GROUP=<resourceGroupName>
AZURE_DEVCENTER=<devcenterName>
AZURE_PROJECT=<projectName>
AZURE_KEYVAULT=<keyVaultName>
備註
你必須使用全球唯一的金鑰庫名稱。 否則,你可能會遇到以下錯誤:
Code: VaultAlreadyExists Message: The vault name 'mykeyvaultname' is already in use. Vault names are globally unique so it is possible that the name is already taken.
1.2 建立開發中心
開發中心是由擁有相似設定的專案和環境集合。 開發中心提供可用於建立環境的範本與工件目錄存取。 開發中心也提供管理環境與專案存取的方式。
建立資源群組:
az group create \
--name $AZURE_RESOURCE_GROUP \
--location $LOCATION
建立開發中心:
az devcenter admin devcenter create \
--name $AZURE_DEVCENTER \
--identity-type SystemAssigned \
--resource-group $AZURE_RESOURCE_GROUP \
--location $LOCATION
前一個指令輸出的是 JSON。 將 和 id 的值identity.principalId儲存為環境變數,以便日後使用:
AZURE_DEVCENTER_ID=<id>
AZURE_DEVCENTER_PRINCIPAL_ID=<identity.principalId>
1.3 在訂閱上指派開發中心身份擁有者角色
開發中心需要權限來指派與環境類型相關的訂用帳戶角色。
為了減少不必要的複雜性,在這個教學中,你會為開發中心及所有環境類型使用單一的訂閱。 實務上,開發中心和目標部署訂閱可能會是不同的訂閱,且套用不同的政策。
az role assignment create \
--scope /subscriptions/$AZURE_SUBSCRIPTION_ID \
--role Owner \
--assignee-object-id $AZURE_DEVCENTER_PRINCIPAL_ID \
--assignee-principal-type ServicePrincipal
1.4 建立環境類型
在開發中心層級,環境類型定義了開發團隊可以建立的環境,如開發、測試、沙盒、預製作和生產環境。
建立三種新環境類型: 開發、 測試與 生產環境:
az devcenter admin environment-type create \
--name Dev \
--resource-group $AZURE_RESOURCE_GROUP \
--dev-center $AZURE_DEVCENTER
az devcenter admin environment-type create \
--name Test \
--resource-group $AZURE_RESOURCE_GROUP \
--dev-center $AZURE_DEVCENTER
az devcenter admin environment-type create \
--name Prod \
--resource-group $AZURE_RESOURCE_GROUP \
--dev-center $AZURE_DEVCENTER
1.5 建立專案
專案是開發團隊的存取點。 每個專案都與開發中心相關聯。
建立一個專案:
az devcenter admin project create \
--name $AZURE_PROJECT \
--resource-group $AZURE_RESOURCE_GROUP \
--location $LOCATION \
--dev-center-id $AZURE_DEVCENTER_ID
前一個指令輸出的是 JSON。 將該 id 值存為環境變數,方便日後使用:
AZURE_PROJECT_ID=<id>
請為自己指定專案中的 DevCenter 專案管理員角色:
az role assignment create \
--scope "$AZURE_PROJECT_ID" \
--role "DevCenter Project Admin" \
--assignee-object-id $MY_AZURE_ID \
--assignee-principal-type User
1.6 建立專案環境類型
在專案層級,平台工程師會指定適合開發團隊的環境類型。
為你在開發中心建立的每種環境類型建立一個新的專案環境類型:
az devcenter admin project-environment-type create \
--name Dev \
--roles "{\"b24988ac-6180-42a0-ab88-20f7382dd24c\":{}}" \
--deployment-target-id /subscriptions/$AZURE_SUBSCRIPTION_ID \
--resource-group $AZURE_RESOURCE_GROUP \
--location $LOCATION \
--project $AZURE_PROJECT \
--identity-type SystemAssigned \
--status Enabled
az devcenter admin project-environment-type create \
--name Test \
--roles "{\"b24988ac-6180-42a0-ab88-20f7382dd24c\":{}}" \
--deployment-target-id /subscriptions/$AZURE_SUBSCRIPTION_ID \
--resource-group $AZURE_RESOURCE_GROUP \
--location $LOCATION \
--project $AZURE_PROJECT \
--identity-type SystemAssigned \
--status Enabled
az devcenter admin project-environment-type create \
--name Prod \
--roles "{\"b24988ac-6180-42a0-ab88-20f7382dd24c\":{}}" \
--deployment-target-id /subscriptions/$AZURE_SUBSCRIPTION_ID \
--resource-group $AZURE_RESOURCE_GROUP \
--location $LOCATION \
--project $AZURE_PROJECT \
--identity-type SystemAssigned \
--status Enabled
2. 建立鑰匙庫
在這個區段,你會建立一個新的金鑰保險庫。 你在教學後面會用這個金鑰庫來儲存 GitHub 上的 個人存取權杖 。
az keyvault create \
--name $AZURE_KEYVAULT \
--resource-group $AZURE_RESOURCE_GROUP \
--location $LOCATION \
--enable-rbac-authorization true
同樣地,將前一個指令的 JSON 輸出儲存 id 為環境變數:
AZURE_KEYVAULT_ID=<id>
在新的金鑰庫中賦予自己「Key Vault 管理員」角色:
az role assignment create \
--scope $AZURE_KEYVAULT_ID \
--role "Key Vault Administrator" \
--assignee-object-id $MY_AZURE_ID \
--assignee-principal-type User
將開發中心的身分指定為 Key Vault 祕密使用者:
az role assignment create \
--scope $AZURE_KEYVAULT_ID \
--role "Key Vault Secrets User" \
--assignee-object-id $AZURE_DEVCENTER_PRINCIPAL_ID \
--assignee-principal-type ServicePrincipal
3. 建立並配置 GitHub 倉庫
在這個區塊中,你會建立一個新的 GitHub 倉庫來儲存目錄。 Azure Deployment Environments 支援 GitHub 和 Azure DevOps 兩個倉庫。 在這個教學中,你會使用 GitHub。
3.1 建立 GitHub 倉庫
在這個步驟中,你會在 GitHub 帳號建立一個新的倉庫,裡面有預設的目錄結構、分支和檔案。 這些項目是從範例範本庫產生的。
從 範例範本產生一個新的 GitHub 倉庫:
如果你沒有付費的 GitHub 帳號,請將你的儲存庫設為 公開。
選取 [建立存放庫]。
3.2 保護儲存庫的主分支
你可以透過設定分支保護規則來保護重要的分支。 保護規則定義共同作業者是否可以刪除分支或強制推送至該分支。 它們也會設定推送到分支的需求,例如通過狀態檢查或強制執行線性提交記錄。
備註
受保護的分支在 GitHub Free 個人版和組織版的公共倉庫中均可使用,也在 GitHub Pro、GitHub Team、GitHub Enterprise Cloud 和 GitHub Enterprise Server 的公共和私有倉庫中均可使用。 欲了解更多資訊,請參閱 GitHub 計畫。
如果還沒開啟,請前往你資料庫的主頁。
在視窗頂端的選單中選擇 設定 :
在左側邊欄的 程式碼與自動化 區塊 ,選擇分支:
在 分支保護規則中,選擇 新增分支規則集:
在 新分支規則集 頁面的 規則集名稱中,輸入 CI-CD-tutorial-ruleset:
在 目標分支中,選擇 新增目標,然後選擇 包含預設分支 或 包含所有分支:
在 分支規則中,選擇 「合併前要求拉取請求」:
你可以選擇性地啟用 更多保護規則。
選取 ,創建。
3.3 配置儲存庫變數
在側邊欄的安全區段,選擇秘密與變數,然後選擇動作:
選取 變數 索引標籤。
下表中每個項目:
- 選擇 新儲存庫變數。
- 在 名稱 欄位輸入變數名稱。
- 在 Value 欄位輸入表格中描述的值。
- 選擇 新增變數。
變數名稱 變數值 AZURE_DEVCENTER 你的開發中心名稱 AZURE_PROJECT 你的專案名稱 Azure 目錄 設定為 [環境]。 Azure 產品目錄項目 設定為 FunctionApp AZURE_SUBSCRIPTION_ID 你的 Azure 訂閱 ID AZURE_TENANT_ID 你的 Azure 租戶 ID
3.4 建立 GitHub 個人存取權杖
接著,建立 一個細粒度的個人存取權杖 ,讓你的 Azure 部署環境開發中心能連接到你的儲存庫並使用環境目錄。
備註
你可以在意見反應討論留下對更精細個人存取權杖的意見反應。
在 GitHub.com 頁面的右上角,選擇你的個人照片,然後選擇 設定。
在左側邊欄,選擇 開發者設定。
在左側邊欄,在 個人存取權杖下,選擇 細緻權杖,然後選擇 生成新權杖:
在 新的細粒度個人存取令牌 頁面,在 「令牌名稱」下輸入該令牌的名稱。
在 「過期」中,選擇該代幣的有效期限。
在 資源擁有者中,選擇你的 GitHub 使用者名稱。
在 儲存庫存取中,選擇 僅選擇儲存庫。 在 「選擇的儲存庫」中,搜尋並選擇你所建立的儲存庫:
在 權限中,選擇 儲存庫權限,然後將 內容 改為 唯讀:
選擇 [產生令牌。
複製並儲存你的個人存取權杖。 你將無法再觀看。
3.5 儲存你的個人存取權杖到金鑰保存庫
接著,將個人存取權杖儲存為名為 pat 的金鑰庫秘密:
az keyvault secret set \
--name pat \
--vault-name $AZURE_KEYVAULT \
--value <personalAccessToken>
4. 將目錄連接到你的開發中心
在 Azure 部署環境中, 目錄 是一個包含一組環境定義的儲存庫。 目錄項目由一個基礎設施即程式碼(IaC)範本和一個作為清單的環境檔案組成。 範本會定義環境,而環境定義提供有關範本的中繼資料。 開發團隊會利用目錄中的環境定義來建立環境。
你用來建立 GitHub 倉庫的範本中, 環境資料夾裡 有目錄。
把目錄加入你的開發中心
在以下指令中,請將 < Organization/Repository > 替換為你的 GitHub 組織及倉庫名稱:
az devcenter admin catalog create \
--name Environments \
--resource-group $AZURE_RESOURCE_GROUP \
--dev-center $AZURE_DEVCENTER \
--git-hub path="/Environments" branch="main" secret-identifier="https://$AZURE_KEYVAULT.vault.azure.net/secrets/pat" uri="https://github.com/< Organization/Repository >.git"
5. 配置部署身份
OpenID Connect with GitHub Actions 是一種使用短期權杖以增強安全性的認證方法。 這是認證 GitHub Actions 到 Azure 的推薦方式。
你也可以直接用秘密來驗證服務主體,但這超出本教學範圍。
5.1 產生部署識別
為三種環境類型登錄 Microsoft Entra 應用程式與服務主體 。
為 開發者建立 Microsoft Entra 應用程式:
az ad app create --display-name "$AZURE_PROJECT-Dev"此命令會輸出你在使用 Graph API 建立同盟認證時所用的具
idJSON,以及appId(也稱API為 用戶端識別碼)。設定下列環境變數:
DEV_AZURE_CLIENT_ID=<appId> DEV_APPLICATION_ID=<id>測試時重複以下步驟:
az ad app create --display-name "$AZURE_PROJECT-Test"TEST_AZURE_CLIENT_ID=<appId> TEST_APPLICATION_ID=<id>為 生產重複同樣步驟:
az ad app create --display-name "$AZURE_PROJECT-Prod"PROD_AZURE_CLIENT_ID=<appId> PROD_APPLICATION_ID=<id>為每個應用程式建立一個服務主體。
執行以下指令來為 開發建立新的服務主體:
az ad sp create --id $DEV_AZURE_CLIENT_ID這個指令會產生一個帶有不同
id的 JSON 輸出,並會在下一步中使用。設定以下環境變數:
DEV_SERVICE_PRINCIPAL_ID=<id>測試時重複以下步驟:
az ad sp create --id $TEST_AZURE_CLIENT_IDTEST_SERVICE_PRINCIPAL_ID=<id>將這些步驟重複用於Prod:
az ad sp create --id $PROD_AZURE_CLIENT_IDPROD_SERVICE_PRINCIPAL_ID=<id>執行以下指令,為每個 Microsoft Entra 應用程式 建立新的聯邦身份憑證 。
在接下來的三個指令中,分別用你的 GitHub 組織名稱和倉庫名稱替換
< Organization/Repository >。為 開發建立聯邦身份憑證:
az rest --method POST \ --uri "https://graph.microsoft.com/beta/applications/$DEV_APPLICATION_ID/federatedIdentityCredentials" \ --body '{"name":"ADEDev","issuer":"https://token.actions.githubusercontent.com","subject":"repo:< Organization/Repository >:environment:Dev","description":"Dev","audiences":["api://AzureADTokenExchange"]}'建立 測試 憑證:
az rest --method POST \ --uri "https://graph.microsoft.com/beta/applications/$TEST_APPLICATION_ID/federatedIdentityCredentials" \ --body '{"name":"ADETest","issuer":"https://token.actions.githubusercontent.com","subject":"repo:< Organization/Repository >:environment:Test","description":"Test","audiences":["api://AzureADTokenExchange"]}'建立 生產憑證:
az rest --method POST \ --uri "https://graph.microsoft.com/beta/applications/$PROD_APPLICATION_ID/federatedIdentityCredentials" \ --body '{"name":"ADEProd","issuer":"https://token.actions.githubusercontent.com","subject":"repo:< Organization/Repository >:environment:Prod","description":"Prod","audiences":["api://AzureADTokenExchange"]}'
5.2 將角色指派至部署身分識別
在專案中將每個部署身分識別指派為讀者角色:
az role assignment create \ --scope "$AZURE_PROJECT_ID" \ --role Reader \ --assignee-object-id $DEV_SERVICE_PRINCIPAL_ID \ --assignee-principal-type ServicePrincipalaz role assignment create \ --scope "$AZURE_PROJECT_ID" \ --role Reader \ --assignee-object-id $TEST_SERVICE_PRINCIPAL_ID \ --assignee-principal-type ServicePrincipalaz role assignment create \ --scope "$AZURE_PROJECT_ID" \ --role Reader \ --assignee-object-id $PROD_SERVICE_PRINCIPAL_ID \ --assignee-principal-type ServicePrincipal將部署環境使用者角色指派給每個部署身份的對應環境類型:
az role assignment create \ --scope "$AZURE_PROJECT_ID/environmentTypes/Dev" \ --role "Deployment Environments User" \ --assignee-object-id $DEV_SERVICE_PRINCIPAL_ID \ --assignee-principal-type ServicePrincipalaz role assignment create \ --scope "$AZURE_PROJECT_ID/environmentTypes/Test" \ --role "Deployment Environments User" \ --assignee-object-id $TEST_SERVICE_PRINCIPAL_ID \ --assignee-principal-type ServicePrincipalaz role assignment create \ --scope "$AZURE_PROJECT_ID/environmentTypes/Prod" \ --role "Deployment Environments User" \ --assignee-object-id $PROD_SERVICE_PRINCIPAL_ID \ --assignee-principal-type ServicePrincipal
6. 配置 GitHub 環境
在 GitHub 環境中,你可以設定帶有保護規則和秘密的環境。 參考環境的工作流作業必須遵守該環境的任何保護規則,才能執行或存取該環境的敏感資訊。
建立開發、測試和生產環境,這些環境對應到 Azure 部署環境專案中的環境類型。
備註
環境、環境祕密及環境保護規則皆可在所有產品的公開資料庫中取得。 若要存取環境、環境秘密及私有或內部倉庫中的部署分支,必須使用 GitHub Pro、GitHub Team 或 GitHub Enterprise。 若要存取私人或內部倉庫中的其他環境保護規則,必須使用 GitHub Enterprise。 欲了解更多資訊,請參閱 GitHub 計畫。
6.1 建立開發環境
在 GitHub 裡,前往你倉庫的主頁。
在您存放庫的名稱下,選取 [設定]。 如果你看不到 設定 標籤,請選擇 ...... 下拉選單,然後選擇 設定。
在左側側邊欄,選擇 環境。
選擇 新環境 ,並輸入 開發(Dev )作為環境名稱,然後選擇 配置環境:
在環境秘密中,選擇新增環境秘密,然後在名稱框輸入AZURE_CLIENT_ID。
在 Value 欄位中輸入你先前建立的 Dev Microsoft Entra 應用程式的客戶端 ID
appId,並將其作為$DEV_AZURE_CLIENT_ID環境變數儲存:選取 [新增祕密]。
6.2 建立測試環境
請在左側欄選擇「 環境 」回到主環境頁面。
選擇 新環境,輸入 測試 以取得環境名稱,然後選擇 配置環境。
在環境秘密中,選擇新增環境秘密,然後在名稱框輸入AZURE_CLIENT_ID。
在 Value 欄位輸入你先前建立的
appIdMicrosoft Entra 應用程式的用戶端 ID(),並儲存為$TEST_AZURE_CLIENT_ID環境變數。選取 [新增祕密]。
6.3 建立生產環境
再次回到主環境頁面,選擇左側側邊欄的 「環境 」。
選擇 新環境,輸入 生產 環境名稱,然後選擇 設定環境。
在環境秘密中,選擇新增環境秘密,然後在名稱框輸入AZURE_CLIENT_ID。
在 Value 欄位輸入你之前建立的
appIdMicrosoft Entra 應用程式的客戶端 ID(),該應用程式已儲存為$PROD_AZURE_CLIENT_ID環境變數。選取 [新增祕密]。
接著,將自己設定為此環境的必要審查員。 當嘗試部署到 生產環境時,GitHub Actions 會等待批准後才開始。 當工作等待核准時,狀態為 等待中。 如果工作在30天內未獲批准,該工作會自動失敗。
欲了解更多環境及所需核准資訊,請參閱 「使用環境進行部署」。
選擇 必修審稿人。
搜尋並選擇你的 GitHub 使用者名稱。 最多可派出六人或隊伍參賽。 只需要其中一位審查員批准該工作,工作就會繼續進行。
選擇 儲存保護規則。
最後,設定 main 為部署分支:
在部署分支與標籤列表中,選擇「已選取分支與標籤」。
選擇新增部署分支或標籤規則,確保選取 Ref 類型:分支,然後在名稱模式框中輸入 main。
選取新增規則。
7. 測試CI/CD管線
在這個章節中,你會對儲存庫做一些修改並測試 CI/CD 管線。
7.1 複製儲存庫
在 Git Bash 中,使用
cd切換到你想要在本地克隆儲存庫的資料夾。複製存放庫。 請務必在以下指令中替換
< Organization/Repository >成你的 GitHub 組織名稱和倉庫名稱。git clone https://github.com/< Organization/Repository >.git進入克隆的資料夾:
cd <repository>建立一個新分支並遠端發佈:
git checkout -b feature1git push -u origin feature1一個專門針對此分支的新環境會在 Azure 中建立。
在 GitHub 上,前往你新建立的儲存庫主頁。
在你的儲存庫名稱下,選擇 「動作」:
你應該會看到一個新的「建立環境」工作流程在運行。
7.2 修改程式碼
在 Visual Studio Code 中開啟本地克隆的儲存庫。
在 ADE.Tutorial 資料夾中,對檔案進行修改。
儲存變更。
7.3 推送你的變更以更新環境
暫存變更並推送至
feature1分支:git add . git commit -m '<commit message>' git push在你儲存庫的 動作 頁面上,你會看到一個新的更新環境工作流程正在執行。
7.4 建立拉取請求(Pull Request)
建立一個 GitHub 拉取請求
main <- feature1。在你儲存庫的 動作 頁面,你會看到一個新的工作流程開始,建立一個針對該拉取請求的環境。 使用的是測試環境類型。
7.5 合併提取要求
在 GitHub 中,移至你建立的提取要求。
合併拉取請求。
你的變更會發佈至生產環境,分支和提取要求環境會予以刪除。
清理資源
如果不打算使用所建立的任何資源,請予以刪除以免產生任何進一步的費用。 如果您已在不同的資源群組中部署應用程式範例,您可能會想要重複下列步驟。
若要使用 Azure 入口網站來刪除資源:
選取左上角的功能表按鈕,再選取 [資源群組]。
從清單中,選取您所建立的資源群組。
選擇 ,刪除資源群組。
輸入資源群組名稱。 接著選取刪除。
若要使用 Azure CLI 刪除資源,請輸入下列命令:
az group delete --name <my-dev-center-rg>
請記得,當您刪除資源群組時,也會刪除該資源群組內的所有資源。