Share via


教學課程:使用 GitHub Actions 將 ASP.NET Core 應用程式和資料庫部署至 Azure 容器應用程式

在本教學課程中,您將會了解如何使用 Visual Studio 和 GitHub Actions 將 ASP.NET Core 應用程式和 SQL Database 部署到 Azure 容器應用程式。 您也將會了解如何在 GitHub Actions 中管理 Entity Framework 移轉和資料庫更新,不過概念也可以套用至其他 CI/CD 工具和環境。

必要條件

您需要安裝 Visual Studio 2022 以及 ASP.NET 與 Web 開發Azure 開發工作負載。

如果您已經安裝 Visual Studio:

  • 選取 [說明]>[檢查更新],在 Visual Studio 中安裝最新的更新。
  • 藉由選取 [工具]> [取得工具和功能],確認已安裝 ASP.NET 與 Web 開發Azure 開發工作負載。

在本機設定範例應用程式

使用 ToDo 範例應用程式來遵循本教學課程。 使用以下命令,從 GitHub 複製應用程式:

git clone https://github.com/Azure-Samples/msdocs-app-service-sqldb-dotnetcore.git
cd msdocs-app-service-sqldb-dotnetcore

瀏覽至專案資料夾,並在 Visual Studio 中開啟 DotNetCoreSqlDb.sln 解決方案。

ToDo 應用程式已準備就緒,但是您必須建立與 Visual Studio 中可用 localdb SQL Server 的連線。 連線到 localdb 可讓您執行應用程式,並且在本機工作時保存 todos。

  1. 以滑鼠右鍵按一下 Visual Studio 方案總管中的 [已連線的服務] 節點,然後選取 [新增] > [SQL Server Database]
  2. 在 [連線至相依性] 對話方塊中,選取 [SQL Server Express LocalDB (本機)],然後選取 [下一步]
  3. 在 [連線到 SQL Server Express LocalDB (本機)] 對話方塊中,設定下列值:
    • 連接字串名稱:保留預設值。
    • 連接字串值:保留預設值。
    • 將連接字串值儲存在:選取 [無]
    • 選取下一個
  4. 在 [變更摘要] 畫面上,將設定保留為其預設值,然後選取 [完成] 以完成工作流程。

Visual Studio 會顯示服務相依性的摘要,包括與 LocalDB 的連線。

A screenshot showing how to add a migration using Visual Studio.

接下來,您需要建立初始移轉,並使用它以正確的 Todo 應用程式結構描述更新本機資料庫。

  1. 選取 LocalDB 連線旁邊的服務相依性清單右側 [...] 圖示,然後選擇 [新增移轉]
  2. 在 [Entity Framework 移轉] 對話方塊中,等候 Visual Studio 找出專案中包含的 DbContext 類別。 載入值之後,請選取 [完成]
  3. Visual Studio 會在專案中產生 Migrations 資料夾,並建立初始移轉類別。 這個類別可用來使用正確的結構描述更新資料庫。
  4. 再次選取 LocalDB 服務旁的 [...] 圖示,然後選取 [更新資料庫]
  5. 在 [Entity Framework 移轉] 對話方塊中,再次等候 Visual Studio 找出 DbContext 類別,然選擇 [完成]。 Visual Studio 會執行移轉,並在 LocalDB 伺服器中建立資料庫的結構描述。

選取 Visual Studio 頂端的 DotNetCoreSqlDb 執行按鈕,以啟動專案。

當應用程式載入時,輸入新的 Todo 來確認資料庫是否正常運作。 Todo 會出現在應用程式首頁的主要清單檢視上。

探索應用程式啟動設定

範例應用程式會在 Program.cs 檔案中包含下列程式碼:

if(builder.Environment.IsDevelopment())
{
    builder.Services.AddDbContext<MyDatabaseContext>(options =>
        options.UseSqlServer(builder.Configuration.GetConnectionString("Default")));
}
else
{
    builder.Services.AddDbContext<MyDatabaseContext>(options =>
        options.UseSqlServer(Environment.GetEnvironmentVariable("AZURE_SQL_CONNECTIONSTRING")));
}

此程式碼會套用下列設定:

  • 當應用程式在本機執行時,會從 appsettings.json 檔案提取 localdb 連接字串,並提供給 Entity Framework。 此設定可讓 localdb 連接字串簽入原始程式碼控制,讓其他開發人員在開發期間輕鬆連線到本機資料庫。 也允許 Entity Framework 移轉在本機執行。 根據預設,Entity Framework 不會在執行移轉時探索儲存在環境變數中的連接字串。
  • 當應用程式在 GitHub Actions 工作流程或生產環境中執行時,連接字串會從環境變數提取。 環境變數可以防止生產安全連接字串簽入原始程式碼控制或包含在組態檔中。

建立 Azure 服務

應用程式需要建立下列 Azure 服務,才能成功部署:

  • 容器應用程式:裝載及執行已部署應用程式的必要項目。
  • Container Registry:儲存容器化應用程式的建置映像成品。
  • SQL Database:用來儲存應用程式資料的 Azure SQL 資料庫。

Visual Studio 的發佈功能可以為您處理建立這些資源。

建立 Azure 容器應用程式和 Azure Container Registry

  1. 在 Visual Studio 方案總管中,以滑鼠右鍵按一下最上層專案節點,然後選取 [發佈]

  2. 在發佈對話方塊中,選取 [Azure] 作為部署目標,然後選取 [下一步]。

  3. 針對特定目標,選取 [Azure 容器應用程式 (Linux)],然後選取 [下一步]

  4. 建立要部署的新容器應用程式。 選取 [+ 建立新項目] 按鈕以開啟新的對話方塊,然後輸入下列值:

    A screenshot showing how to create a container app.

    • 容器應用程式名稱:保留預設值或輸入名稱。
    • 訂用帳戶名稱:選取要部署的訂用帳戶。
    • 資源群組:選取 [新增],然後建立名為 msdocs-app-db-ef 的新資源群組。
    • 容器應用程式環境:選取 [新增] 以開啟容器應用程式環境對話方塊,然後輸入下列值:
      • 環境名稱:請保留預設值。
      • 位置:選取與您接近的位置。
      • Azure Log Analytics 工作區:選取 [新增] 以開啟記錄分析工作區對話方塊。
        • 名稱:保留預設值。
        • 位置:選取靠近您的位置,然後選取 [確定] 以關閉對話方塊。
      • 選取 [確定] 以關閉容器應用程式環境對話方塊。
    • 選取 [建立] 以關閉原始容器應用程式對話方塊。 Visual Studio 會在 Azure 中建立容器應用程式資源。
  5. 建立資源之後,請確定在容器應用程式清單中選取該資源,然後選取 [下一步]

  6. 您需要建立 Azure Container Registry 來儲存您應用程式的已發佈映像成品。 選取容器登錄畫面上的綠色 + 圖示。

    A screenshot showing how to create a new container registry.

  7. 保留預設值,然後選取 [建立]

  8. 建立容器登錄之後,請確定已選取該容器登錄,然後選取 [下一步]。

  9. 在 [部署類型] 畫面上,選取 [使用 GitHub Actions 工作流程 (產生 YML 檔案) 的 CI/CD],然後選擇 [完成]。 如果 Visual Studio 提示您讓系統管理員使用者存取已發佈的 Docker 容器,請選取 [是]

Visual Studio 會建立和顯示發行設定檔。 大部分的發佈步驟和詳細資料都會在 GitHub Actions .yml 檔案中描述,您可以按一下發行設定檔摘要檢視上的 [編輯工作流程] 按鈕來檢視。 本文稍後會更深入討論此檔案。

建立 Azure SQL 資料庫

  1. 在 [方案總管] 中,以滑鼠右鍵按一下 [已連線的服務] 節點,然後選取 [新增] > [SQL Server Database]
  2. 在 [連線至相依性] 對話方塊中,選取 [Azure SQL Database],然後選擇 [下一步]
  3. 請選取 [+ 建立新的] 新增新資料庫。
  4. 在 [Azure SQL Database] 對話方塊中,輸入下列值:
    • 資料庫名稱:保留預設值。
    • 訂用帳戶名稱:選取與先前相同的訂用帳戶。
    • 資源群組:選取先前建立的相同 msdocs-app-db-ef 群組。
    • 資料庫伺服器:選取 [新增...],然後在新的快顯中輸入下列值:
      • 資料庫伺服器名稱:輸入唯一的伺服器名稱,或將亂數附加至自動產生名稱的結尾。
      • 位置:選取靠近您的位置。
      • 系統管理員使用者名稱:輸入您選擇的值。
      • 系統管理員密碼:輸入您選擇的值。
      • 系統管理員密碼 (確認):輸入相同的密碼進行確認。 選取 [確定] 關閉 [SQL Server] 對話方塊
    • 選取 [建立] 來建立 SQL Server 和資料庫。
    • 作業完成時,請從清單中選取伺服器,然後選擇 [下一步]
  5. 在 [連線到 Azure SQL Database ] 對話方塊中,保留預設值,但是請確定已在 [將連接字串值儲存在] 選項底部選取 [無]
  6. 選取 [完成],Visual Studio 將會建立 SQL 資源。

將容器應用程式連線至 Azure SQL

  1. 在您建立的容器應用程式概觀頁面上,選取左側導覽上的 [服務連接器 (預覽)]

  2. 選取 [+ 建立] 以建立新連線。

  3. 在 [建立連線] 飛出視窗中,輸入下列值:

    • 容器:選取您建立的 dotnetcoresqldb 容器。

    • 服務類型:選取 [SQL Database]

    • 訂用帳戶:選取您用來建立容器應用程式的相同訂用帳戶。

    • 連線名稱:保留預設值。

    • SQL Server:選取您稍早建立的資料庫伺服器。

    • SQL 資料庫:選取您稍早建立的資料庫。

    • 用戶端類型:選取 [.NET]

      A screenshot showing how to use service connector.

  4. 選取 [下一步:驗證],然後輸入下列值:

    • 針對驗證類型選取 [連接字串]
    • 使用者名稱:輸入您在建立資料庫伺服器時所使用的使用者名稱。
    • 密碼:輸入您在建立資料庫伺服器時所使用的密碼。
  5. 將其餘設定保留為預設值,然後選取 [下一步:網路]

  6. 保留選取的預設值,然後選擇 [下一步:檢閱 + 建立]

  7. 在 Azure 驗證設定之後,選取 [建立]

稍待片刻,應該會出現與 SQL 資料庫的連線。 選取箭號以展開連線,並查看 AZURE_SQL_CONNECTIONSTRING 值。 此連線名稱會比對範例應用程式中定義的環境變數連接字串名稱。

設定 GitHub Actions 工作流程

Visual Studio 產生的 GitHub Actions 工作流程檔案可供 GitHub 用來建置應用程式,並在推送變更時部署至 Azure。 此程序目前可運作,但是已部署的應用程式會擲回例外狀況。 雖然已建立 Azure SQL 資料庫,但是必須將步驟新增至 GitHub Actions 工作流程,以產生結構描述。 Azure SQL 資料庫的連接字串可以安全地在 GitHub 中儲存為祕密,並在工作流程執行時擷取。

擷取連接字串,並將其新增至 GitHub 祕密

  1. 在 Azure 入口網站中,在主要搜尋列中搜尋您建立的資料庫,並從結果中選取。

  2. 在 [資料庫概觀] 頁面上,從左側導覽選取 [連接字串]

  3. 在 [ADO.NET] 索引標籤上,將連接字串從表單欄位複製出來。

    A screenshot showing how to retrieve the connection string.

  4. 瀏覽至應用程式的分支 GitHub 存放庫。

  5. 在 [設定] 索引標籤底下,從左側導覽中選取 [祕密] > [動作],然後選擇 [新增存放庫祕密]

  6. 在 [新增祕密] 頁面上,輸入下列值:

    • 名稱:輸入 DbConnection 的名稱。

    • 祕密:貼上從 Azure 複製的連接字串。 請務必將連接字串中的密碼預留位置取代為您在建立資料庫時所選擇的密碼。

    • 選取 [新增祕密]。

      A screenshot showing how to create a GitHub secret.

連接字串現在安全地儲存在 GitHub 存放庫祕密中,而且可以使用 GitHub 工作流程來擷取。

修改 GitHub Actions 工作流程以啟用移轉

  1. 選取發佈摘要頁面上的 [編輯工作流程] 按鈕,以開啟 Visual Studio 所產生的 GitHub Actions 工作流程 .yml 檔案。

    A screenshot showing how to edit the workflow.

  2. 將下列 YAML 附加至工作流程檔案的結尾:

    - name: Run EF 
      run: | 
        dotnet tool install --global dotnet-ef
        dotnet tool restore
        dotnet ef database update -p DotNetCoreSqlDb --connection '${{ secrets.DBConnection }}'
    

    此程式碼會安裝 Entity Framework 命令列工具,並執行應用程式移轉。 當工作流程執行時,程式碼也會使用 database update 命令的 connection 參數,使用新增至 GitHub 祕密的值,覆寫儲存在 appsettings.json 檔案中的 localdb 連接字串。

執行 GitHub Actions 工作流程並測試部署

  1. 使用下列命令認可對應用程式的變更,並推送至分支存放庫:

    git add --all
    git commit -m "Added GitHub Actions workflow"
    git push
    
  2. 請瀏覽至 GitHub 存放庫,然後選取 [動作] 索引標籤。如果推送成功,工作流程執行應該會自動觸發。

  3. 選取作用中的工作流程,在完成時檢視每個步驟的記錄詳細資料。 移轉會持續執行,以更新 Azure 中的資料庫。

    A screenshot showing the GitHub action workflow.

工作流程完成之後,應用程式會部署至 Azure 容器應用程式,並使用更新的結構描述連線至資料庫。

您可以瀏覽至容器應用程式的首頁並建立 todo 來測試部署,就像您在本機執行一樣。 您一律可以在 Azure 入口網站中應用程式的概觀頁面上找到容器應用程式的 URL。