# Azure App Service 與 GitHub Actions 整合指南 在本指南中,我們將探討如何利用 GitHub Actions 和 Azure App Service 實現 CI/CD。 ## **前言:** 結合 GitHub Actions 和 Azure App Service,開發者能夠完整自動化從程式碼更改到應用程式部署的流程,從而提高開發效率和應用程式的穩定性。 --- ## **第一部分:設定 Azure App Service** 1. **建立新資源** 在Azure Portal中,創建新的App Service和相關的App Service Plan。選擇操作系統為 Linux 和 Docker Container。 - 在`發布`選擇`代碼` ![](https://hackmd.io/_uploads/HJr4u0jbp.png) - 啟用`Guthub Actions設定` ![](https://hackmd.io/_uploads/rJvwd0j-6.png) 2. **端口映射配置** 默認端口為 8000 port。要更改,請前往 設定 → 組態 → 應用程式定義 → +新增應用程式設定,並設定名稱為 WEBSITES_PORT。 3. **環境變量與啟動命令設定** 如果需要,您可以在 設定 → 組態 中添加應用程式設定或環境變量。另外, 啟動命令可在 設定 → 組態 → 一般設定中設置。 4. **連接Azure Container Registry (ACR)** 於設定 → Docker 容器 中選擇`私人`,然後填入您的ACR資訊。確保您的 App Service 可以從 ACR 拉取映像。 --- ## **第二部分:使用 GitHub Actions 部署到 Azure** 1. **預先準備** 在 Azure CLI 中,建立一個 Service Principal,並在 GitHub repository 的 secrets 中添加其憑證。 2. **建立 GitHub Actions 流程** 創建或編輯 `.github/workflows/YourAppName.yml` 文件,並添加以下配置: ```yaml= name: Deploy to Azure App Service on: push: branches: - main jobs: build-and-deploy: runs-on: ubuntu-latest steps: - name: Checkout repository uses: actions/checkout@v2 - name: Login to Azure CLI test uses: azure/login@v1 with: creds: ${{ secrets.AZURE_CREDENTIALS }} - name: Login to Azure ACR using Azure CLI run: | az acr login --name iqtcommonhealth # Build Docker image with build-args - name: Build Docker image run: | docker build --build-arg OPENAI_API_BASE=${{ secrets.OPENAI_API_BASE }} --build-arg OPENAI_API_KEY=${{ secrets.OPENAI_API_KEY }} --build-arg TOKENS_GITHUB=${{ secrets.TOKENS_GITHUB }} -t iqtcommonhealth.azurecr.io/bensonbs/bs_poc:1.1 . # Push the built Docker image to Azure Container Registry - name: Push Docker image to Azure Container Registry run: | docker push iqtcommonhealth.azurecr.io/bensonbs/bs_poc:1.1 - name: Deploy to Azure App Service uses: azure/webapps-deploy@v2 with: app-name: app-commonhealth-core-dev-002 slot-name: 'production' images: iqtcommonhealth.azurecr.io/bensonbs/bs_poc:1.1 - name: Logout of Azure ACR run: docker logout iqtcommonhealth.azurecr.io ``` 3. **設置 GitHub secrets** ![](https://hackmd.io/_uploads/B1bAwLRW6.png) `{{ secrets.AZURE_CREDENTIALS }}` 可以安全地存儲和參照在GitHub Actions中使用的敏感信息,例如Azure登入憑證。 您需要手動設置這個 secret。它不會自動填充。這樣可以確保敏感資料(如登入憑證)不會被不慎公開或提交到您的代碼庫中。 要設置 AZURE_CREDENTIALS,您需要執行以下步驟: #### 建立 Service Principal (如果您已經有了,則可以跳過此步驟): ``` az ad sp create-for-rbac --name <YOUR_SP_NAME> --sdk-auth --role acrpull --scope /subscriptions/<YOUR_SUBSCRIPTION_ID>/resourceGroups/<YOUR_RESOURCE_GROUP>/providers/Microsoft.ContainerRegistry/registries/<YOUR_ACR_NAME> ``` #### 配置 GitHub Secrets: 將上一步中的輸出(包括 clientId、clientSecret、tenantId)保存到 GitHub 的 Secrets 中,這樣您就可以在 GitHub Actions 工作流程中安全地使用它們。 ``` { "clientId": "<YOUR_APP_ID>", "clientSecret": "<YOUR_CLIENT_SECRET>", "tenantId": "<YOUR_TENANT_ID>", "subscriptionId": "<YOUR_SUBSCRIPTION_ID>" } ``` #### AZURE_CREDENTIALS參數查找 在 GitHub Actions 中使用 Azure Container Registry (ACR) 與 Azure CLI 進行交互,您需要以下參數和資訊: Service Principal 的憑證: - AZURE_CLIENT_ID: Service Principal 的 appId 或 clientId。 - AZURE_CLIENT_SECRET: Service Principal 的 password 或 clientSecret。 - AZURE_TENANT_ID: 服務主體的 tenant 或 tenantId。 其他必要資訊: - YOUR_ACR_NAME: 您要登入的 Azure Container Registry 名稱。 - YOUR_SUBSCRIPTION_ID: 您的 Azure 訂閱 ID。 - YOUR_RESOURCE_GROUP: 包含 ACR 的 Azure 資源組名稱(如果需要的話)。 #### 建立或取得 Service Principal: 如果您還沒有 Service Principal,則可以使用以下命令建立一個: ``` az ad sp create-for-rbac --name <YOUR_SP_NAME> --sdk-auth ``` 此命令將返回 clientId、clientSecret 和 tenantId。 #### 取得 ACR 名稱: 如果您不確定您的 ACR 名稱,可以使用以下命令查看: ``` az acr list --query "[].{acrName:name}" --output table ``` #### 取得 Azure 訂閱 ID: 使用以下命令取得您的 Azure 訂閱 ID: ``` az account show --query "{subscriptionId:id}" --output tsv ``` #### 取得資源組名稱: 如果您不確定包含 ACR 的資源組名稱,可以使用以下命令查找: ``` az acr show --name <YOUR_ACR_NAME> --query "{resourceGroup:resourceGroup}" --output tsv ``` 當您取得這些參數後,可以將它們保存到 GitHub 的 Secrets 中,然後在您的 GitHub Actions 工作流程中使用。這樣做的目的是保護這些機密資料,並確保它們不會公開或被不當使用。 ==Service Principal需具有ACR push權限,User需具有ACR pull權限== --- ## **第三部分:本地建構映像並推送至 Azure Container Registry (ACR)** 1. **登入 ACR** `az acr login --name iqtcommonhealth` 2. **標記 Docker 映像** `docker tag bensonbs/bs_poc:1.1 iqtcommonhealth.azurecr.io/bensonbs/bs_poc:1.1` 3. **推送映像至 ACR** `docker push iqtcommonhealth.azurecr.io/bensonbs/bs_poc:1.1` 4. **修改 deploy.yml** 從 deploy.yml 中移除 `Build Docker image` 部分。 ==User需具有ACR push權限== --- ## **參考資料** : [使用 GitHub Actions 自动执行开发任务](https://learn.microsoft.com/zh-cn/training/modules/github-actions-automate-tasks/) ---