教學課程:使用 GitHub 和 Azure 部署環境在 CI/CD 中部署環境
在本教學課程中,您瞭解如何將 Azure 部署環境整合到 CI/CD 管線中。 您可以使用支援 CI/CD 的任何 GitOps 提供者,例如 GitHub Actions、Azure Arc、GitLab 或 Jenkins。
持續整合和持續傳遞 (CI/CD) 是一種軟體開發方法,可協助小組自動化建置、測試及部署軟體變更的程序。 CI/CD 可讓您更頻繁且更放心地發佈軟體變更。
您可以使用具有三個分支的工作流程:main、dev 和 test。
- main 分支一律視為生產環境。
- 您可以從 main 分支建立功能分支。
- 您可以建立提取要求,將功能分支合併至 main。
此工作流程是本教學課程為了說明所舉的一個小範例。 真實世界的工作流程可能更複雜。
開始本教學課程之前,您可以參閱 Azure 部署環境的重要概念,以熟悉部署環境資源和概念。
在本教學課程中,您會了解如何:
- 建立和設定開發人員中心
- 建立金鑰保存庫
- 建立和設定 GitHub 存放庫
- 將目錄連線至您的開發人員中心
- 設定部署識別
- 設定 GitHub 環境
- 測試 CI/CD 管線
必要條件
1.建立和設定開發人員中心
在本節中,您會建立具有三種環境類型的 Azure 部署環境開發人員中心和專案:Dev、 Test 和 Prod。
- Prod 環境類型包含單一生產環境。
- 系統會在 Dev 中為每個功能分支建立新環境。
- 系統會在Test 中為每個提取要求建立新環境。
1.1 設定 Azure CLI
若要開始,請登入 Azure。 執行下列命令,並遵循提示來完成驗證程序。
az login
接下來,安裝適用於 Azure CLI 的 Azure 開發人員中心延伸模組。
az extension add --name devcenter --upgrade
現在已安裝最新的延伸模組,請註冊 Microsoft.DevCenter
命名空間。
az provider register --namespace Microsoft.DevCenter
提示
在本教學課程中,您會將數個值儲存為環境變數,以供稍後使用。 您也可以將這些值記錄到別處,以確保這些值在需要時可以使用。
取得您的使用者的識別碼,並將它設定為環境變數,以供稍後使用:
MY_AZURE_ID=$(az ad signed-in-user show --query id -o tsv)
擷取您目前訂用帳戶的訂用帳戶識別碼。
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 建立環境類型
在開發人員中心層級,環境類型會定義開發小組可建立的環境類型:例如開發、測試、沙箱、生產前或生產環境。
建立三個新的環境類型:Dev、Test 和 Prod。
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>
將新金鑰保存庫上的金鑰保存庫管理員角色指定給自己。
az role assignment create \
--scope $AZURE_KEYVAULT_ID \
--role "Key Vault Administrator" \
--assignee-object-id $MY_AZURE_ID \
--assignee-principal-type User
將金鑰保存庫秘密使用者的角色指派給開發人員中心的身分識別。
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 部署環境支援 GitHub 和 Azure DevOps 存放庫。 在本教學課程中,您會使用 GitHub。
3.1 建立新的 GitHub 存放庫
在此步驟中,您會在 GitHub 帳戶中建立新的存放庫,其中具有預先定義目錄結構、分支和檔案。 這些項目是從範例範本存放庫產生。
請使用此連結從範例範本產生新的 GitHub 存放庫。
如果您沒有付費 GitHub 帳戶,請將您的存放庫設定為 Public。
選取 [從範本建立存放庫]。
在 [動作] 索引標籤上,請注意到 [建立環境] 動作失敗。 這是預料中的狀況,可以繼續下一個步驟。
3.2 保護存放庫的主要分支
您可以藉由設定分支保護規則來保護重要的分支。 保護規則會定義共同作業者是否可以刪除或強制推送至分支。 規則也會設定任何推送至分支的需求,例如傳遞狀態檢查或線性提交歷程記錄。
注意
您可以在 GitHub Free 和適用於組織的 GitHub Free 公用存放庫,以及 GitHub Pro、GitHub Team、GitHub Enterprise Cloud 和 GitHub Enterprise Server 的公用和私人存放庫中使用受保護的分支。 如需詳細資訊,請參閱 GitHub 的產品。
若尚未開啟,請瀏覽至存放庫的主頁面。
在您存放庫的名稱下,選取 [設定]。 如果您看不到 [設定] 索引標籤,請選取 ... 下拉式功能表,然後選取 [設定]。
在提要欄位的 [程式碼和自動化] 區段中,選取 [分支]。
在 [分支保護規則] 下方,選取 [新增分支保護規則]。
在 [分支名稱模式] 下方,輸入
main
。在 [保護相符的分支] 下方,選取 [合併之前需要提取要求]。
您可以選擇性地啟用更多保護規則。
選取 建立。
3.3 設定存放庫變數
注意
GitHub Actions 的組態變數仍在進行測試,可能會有所變更。
在提要欄位的 [安全性] 區段中,選取 [秘密和變數],然後選取 [動作]。
選取變數索引標籤。
針對表格中的每個項目:
- 選取 [新的存放庫變數]。
- 在 [名稱] 欄位中,輸入變數名稱。
- 在 [值] 欄位中,輸入表格中所述的值。
- 選取 [新增變數]。
變數名稱 變數值 AZURE_DEVCENTER 您的開發人員中心名稱 AZURE_PROJECT 您的專案名稱 AZURE_CATALOG 設定為 "Environments" AZURE_CATALOG_ITEM 設定為 "FunctionApp" AZURE_SUBSCRIPTION_ID 您的 Azure 訂用帳戶識別碼 AZURE_TENANT_ID 您的 Azure 租用戶識別碼
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 存放庫的範本包含 Environment 資料夾中的目錄。
將目錄新增至您的開發人員中心
在以下命令中,將 < 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 搭配 GitHub Actions 是使用短期權杖來提供強化安全性的驗證方法。 這是 GitHub Actions 向 Azure 驗證的建議方式。
您也可以使用秘密來直接驗證服務主體,但這不在本教學課程的範圍內。
5.1 產生部署身分識別
針對這三種環境類型,註冊 Microsoft Entra 應用程式和服務主體 。
建立適用於 Dev的 Microsoft Entra 應用程式。
az ad app create --display-name "$AZURE_PROJECT-Dev"
此命令會輸出 JSON,其中包含您在使用 Graph API 建立同盟認證時所使用的
id
,以及appId
(也稱為用戶端識別碼。設定下列環境變數:
DEV_AZURE_CLIENT_ID=<appId> DEV_APPLICATION_ID=<id>
針對 Test 重複相同的動作。
az ad app create --display-name "$AZURE_PROJECT-Test"
TEST_AZURE_CLIENT_ID=<appId> TEST_APPLICATION_ID=<id>
也針對 Prod 重複相同的動作。
az ad app create --display-name "$AZURE_PROJECT-Prod"
PROD_AZURE_CLIENT_ID=<appId> PROD_APPLICATION_ID=<id>
建立每個應用程式的服務主體。
執行以下命令來為 Dev 建立新的服務主體。
az ad sp create --id $DEV_AZURE_CLIENT_ID
此命令會產生具有不同
id
的 JSON 輸出,並將在下一個步驟中使用。設定下列環境變數:
DEV_SERVICE_PRINCIPAL_ID=<id>
針對 Test 重複相同的動作。
az ad sp create --id $TEST_AZURE_CLIENT_ID
TEST_SERVICE_PRINCIPAL_ID=<id>
也針對 Prod 重複相同的動作。
az ad sp create --id $PROD_AZURE_CLIENT_ID
PROD_SERVICE_PRINCIPAL_ID=<id>
執行下列命令,為每個 Active Directory 應用程式建立新的同盟身分識別認證。
在下列三個命令中,將
< Organization/Repository >
取代為您的 GitHub 組織和存放庫名稱。為 Dev 建立同盟身分識別認證。
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"]}'
針對 Test
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"]}'
和 Prod 重複相同的動作。
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 ServicePrincipal
az role assignment create \ --scope "$AZURE_PROJECT_ID" \ --role Reader \ --assignee-object-id $TEST_SERVICE_PRINCIPAL_ID \ --assignee-principal-type ServicePrincipal
az 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 ServicePrincipal
az role assignment create \ --scope "$AZURE_PROJECT_ID/environmentTypes/Test" \ --role "Deployment Environments User" \ --assignee-object-id $TEST_SERVICE_PRINCIPAL_ID \ --assignee-principal-type ServicePrincipal
az 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 部署環境專案中環境類型的 Dev、Test 和 Prod 環境。
注意
環境、環境秘密和環境保護規則可在所有產品的公用存放庫中取得。 若要存取私人或內部存放庫中的環境、環境秘密和部署分支,您必須使用 GitHub Pro、GitHub Team 或 GitHub Enterprise。 若要存取私人或內部存放庫中的其他環境保護規則,您必須使用 GitHub Enterprise。 如需詳細資訊,請參閱 GitHub 的產品。
6.1 建立開發環境
在 GitHub 上,瀏覽至存放庫的主頁面。
在您存放庫的名稱下,選取 [設定]。 如果您看不到 [設定] 索引標籤,請選取 ... 下拉式功能表,然後選取 [設定]。
在左側邊欄中,選取 [環境]。
選取 [新增環境],然後輸入 Dev 作為環境名稱,然後選取 [設定環境]。
在 [環境秘密] 下方,選取 [新增秘密],然後在 [名稱] 輸入 AZURE_CLIENT_ID。
針對 [值],請輸入您稍早建立的 *Dev**Microsoft Entra app 的用戶端識別碼 (
appId
) (儲存為$DEV_AZURE_CLIENT_ID
環境變數)。選取 [新增祕密]。
6.2 建立測試環境
選取左側邊欄中的 [環境] ,以返回主要環境頁面。
選取 [新增環境],然後輸入 Test 作為環境名稱,然後選取 [設定環境]。
在 [環境秘密] 下方,選取 [新增秘密],然後在 [名稱] 輸入 AZURE_CLIENT_ID。
針對 [值],請輸入您稍早建立的 Test Microsoft Entra app 的用戶端識別碼 (
appId
) (儲存為$TEST_AZURE_CLIENT_ID
環境變數)。選取 [新增祕密]。
6.3 建立生產環境
同樣地,選取左側邊欄中的 [環境] ,以返回主要環境頁面。
選取 [新增環境],然後輸入 Prod 作為環境名稱,然後選取 [設定環境]。
在 [環境秘密] 下方,選取 [新增秘密],然後在 [名稱] 輸入 AZURE_CLIENT_ID。
針對 [值],請輸入您稍早建立的 Prod Microsoft Entra app 的用戶端識別碼 (
appId
) (儲存為$PROD_AZURE_CLIENT_ID
環境變數)。選取 [新增祕密]。
接下來,將您自己設定為此環境的必要的審核者。 嘗試部署至 Prod 時,GitHub Actions 會在開始之前等候核准。 當工作等候核准時,其狀態為 [等候中]。 如果作業在 30 天內未核准,即會自動失效。
如需環境和必要核准的詳細資訊,請參閱使用環境進行部署。
選取 [必要的檢閱者]。
搜尋並選取您的 GitHub 使用者。 您最多可以輸入六個人或小組。 只有其中一個必要的審核者需要核准作業,即能繼續進行。
選取 [儲存保護規則]。
最後,將 main
設定為部署分支:
在 [部署分支] 下拉式清單中,選擇 [選取的分支]。
選取 [新增部署分支規則],然後針對 [分支名稱模式] 輸入
main
。選取新增規則。
7.測試 CI/CD 管線
在本節中,您會對存放庫進行一些變更,並測試 CI/CD 管線。
7.1 複製存放庫
在您的終端中,使用 cd 前往您要在本機複製存放庫的資料夾。
複製存放庫。 請務必將以下命令中的
< Organization/Repository >
取代為您的 GitHub 組織和存放庫名稱。git clone https://github.com/< Organization/Repository >.git
瀏覽至複製的目錄。
cd <repository>
接下來,建立新的分支,並從遠端發佈。
git checkout -b feature1
git push -u origin feature1
系統會在 Azure 中建立專屬於此分支的新環境。
在 GitHub 上,瀏覽至您新建立的存放庫的主頁面。
在您的存放庫名稱下,選取 [動作]。
您應該會看到新的 [建立環境] 工作流程正在執行。
7.2 對程式碼進行變更
在 VS Code 中開啟本機複製的存放庫。
在 ADE.Tutorial 資料夾中,對檔案進行變更。
儲存您的變更。
7.3 推送變更以更新環境
暫存變更並推送至
feature1
分支:git add . git commit -m '<commit message>' git push
在存放庫的 [動作] 頁面上,您會看到新的 [更新環境] 工作流程正在執行。
7.4 建立提取要求
建立 GitHub 提取要求
main <- feature1
。在存放庫的 [動作] 頁面上,您會看到新的工作流程已開始使用 [測試] 環境類型來建立提取要求特定的環境。
7.5 合併提取要求
在 GitHub 上,瀏覽至您建立的提取要求。
合併提取要求。
您的變更會發佈至生產環境,並刪除分支和提取要求環境。
清除資源
如果不打算使用您建立的任何資源,請刪除以免產生任何進一步的費用。 如果您已在不同的資源群組中部署範例應用程式,您可能會想要重複下列步驟。
若要使用 Azure 入口網站刪除資源:
選取左上角的功能表按鈕,再選取 [資源群組]。
從清單中,選取您所建立的資源群組。
選取 [刪除資源群組]。
輸入資源群組名稱。 接著選取刪除。
若要使用 Azure CLI 刪除資源,請輸入下列命令:
az group delete --name <my-dev-center-rg>
請記得,當您刪除資源群組時,即會刪除群組內的所有資源。
相關內容
- 使用 Azure CLI 建立及存取環境
- 如需完整的命令清單,請參閱 Microsoft 開發箱和 Azure 部署環境 Azure CLI 文件