使用 GitHub Actions 將自訂容器部署至 App Service

GitHub Actions 可讓您彈性地建置自動化軟體開發工作流程。 搭配 Azure Web 部署動作,您可以使用 GitHub Actions 將工作流程自動化,以將自訂容器部署至 App Service

工作流程是由您存放庫內 /.github/workflows/ 路徑中的 YAML (. yml) 檔案所定義的。 此定義包含工作流程中的各種步驟與參數。

針對 Azure App Service 容器工作流程,檔案有三個區段:

區段 工作
驗證 1.擷取服務主體或發行設定檔。
2.建立 GitHub 祕密。
建立 1.建立環境。
2.建置容器映像。
部署 1.部署容器映像。

必要條件

產生部署認證

使用 GitHub Actions 的 Azure App Services 進行驗證的建議方式是使用發行設定檔。 您也可以使用服務主體或 OpenID Connect 進行驗證,但此程序會需要更多步驟。

將您的發行設定檔認證或服務主體儲存為 GitHub 祕密,以搭配 Azure 進行驗證。 您將存取工作流程中的祕密。

發行設定檔是應用程式層級認證。 將發行設定檔設定為 GitHub 祕密。

  1. 前往 Azure 入口網站中的 App Service。

  2. 在 [概觀] 頁面上,選取 [取得發行設定檔]

    注意

    自 2020 年 10 月起,Linux Web 應用程式需要將應用程式設定 WEBSITE_WEBDEPLOY_USE_SCM 設定為 true才能下載檔案。 未來將移除此需求。 若要了解如何設定常見的 Web 應用程式設定,請參閱在 Azure 入口網站中設定 App Service 應用程式

  3. 儲存下載的檔案。 您將使用檔案的內容來建立 GitHub 祕密。

設定用於驗證的 GitHub 祕密

GitHub 中,瀏覽您的存放庫。 選取設定>安全性>秘密與變數>動作>新存放庫密碼

若要使用應用程式層級認證,請將所下載發行設定檔內容貼到祕密的值欄位中。 將祕密命名為 AZURE_WEBAPP_PUBLISH_PROFILE

設定 GitHub 工作流程時,您會在部署 Azure Web 應用程式動作中使用 AZURE_WEBAPP_PUBLISH_PROFILE。 例如:

- uses: azure/webapps-deploy@v2
  with:
    publish-profile: ${{ secrets.AZURE_WEBAPP_PUBLISH_PROFILE }}

設定登錄的 GitHub 祕密

定義要搭配 Docker 登入動作一起使用的祕密。 本文件中的範例會針對容器登錄使用 Azure Container Registry。

  1. 前往 Azure 入口網站或 Docker 中的容器,並複製使用者名稱與密碼。 您可以在 Azure 入口網站中的 [設定] > [存取金鑰] 下找到用於登錄的 Azure Container Registry 使用者名稱與密碼。

  2. 為名為 REGISTRY_USERNAME 的登錄使用者名稱定義新的祕密。

  3. 為名為 REGISTRY_PASSWORD 的登錄密碼定義新的祕密。

建置容器映像

下列範例顯示建置 Node.JS Docker 映像的部分工作流程。 使用 Docker 登入來登入私人容器登錄。 此範例會使用 Azure Container Registry,但相同的動作也適用於其他登錄。

name: Linux Container Node Workflow

on: [push]

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v2
    - uses: azure/docker-login@v1
      with:
        login-server: mycontainer.azurecr.io
        username: ${{ secrets.REGISTRY_USERNAME }}
        password: ${{ secrets.REGISTRY_PASSWORD }}
    - run: |
        docker build . -t mycontainer.azurecr.io/myapp:${{ github.sha }}
        docker push mycontainer.azurecr.io/myapp:${{ github.sha }}     

您也可以使用 Docker 登入同時登入多個容器登錄。 此範例包含兩個新的 GitHub 祕密,用於使用 docker.io 進行驗證。 此範例假設登錄的根層級有 Dockerfile。

name: Linux Container Node Workflow

on: [push]

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v2
    - uses: azure/docker-login@v1
      with:
        login-server: mycontainer.azurecr.io
        username: ${{ secrets.REGISTRY_USERNAME }}
        password: ${{ secrets.REGISTRY_PASSWORD }}
    - uses: azure/docker-login@v1
      with:
        login-server: index.docker.io
        username: ${{ secrets.DOCKERIO_USERNAME }}
        password: ${{ secrets.DOCKERIO_PASSWORD }}
    - run: |
        docker build . -t mycontainer.azurecr.io/myapp:${{ github.sha }}
        docker push mycontainer.azurecr.io/myapp:${{ github.sha }}     

部署至 App Service 容器

若要將映像部署至 App Service 中的自訂容器,請使用 azure/webapps-deploy@v2 動作。 此動作有七個參數:

參數 說明
app-name (必要) App Service 應用程式的名稱
publish-profile (選用) 適用於 Web Apps (Windows 與 Linux) 及 Web App Containers (linux)。 不支援多容器案例。 包含 Web Deploy 祕密的發行設定檔 (*.publishsettings) 檔案內容
slot-name (選擇性) 輸入生產位置以外的現有位置。
套件 (選用) 僅適用於 Web 應用程式:套件或資料夾的路徑。 要部署的 *.zip、*.war、*.jar 或資料夾
images (必要) 僅適用於 Web 應用程式容器:指定完整容器映像名稱。 例如:'myregistry.azurecr.io/nginx:latest' 或 'python:3.7.2-alpine/'。 針對多容器應用程式,可以提供多容器映像名稱 (多行分隔)
configuration-file (選用) 僅適用於 Web 應用程式容器:Docker-Compose 檔案的路徑。 應該是完整路徑或預設工作目錄的相對路徑。 多容器應用程式的必要項目。
startup-command (選用) 輸入啟動命令。 例如:dotnet run 或 dotnet filename.dll
name: Linux Container Node Workflow

on: [push]

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v2

    - uses: azure/docker-login@v1
      with:
        login-server: mycontainer.azurecr.io
        username: ${{ secrets.REGISTRY_USERNAME }}
        password: ${{ secrets.REGISTRY_PASSWORD }}

    - run: |
        docker build . -t mycontainer.azurecr.io/myapp:${{ github.sha }}
        docker push mycontainer.azurecr.io/myapp:${{ github.sha }}     

    - uses: azure/webapps-deploy@v2
      with:
        app-name: 'myapp'
        publish-profile: ${{ secrets.AZURE_WEBAPP_PUBLISH_PROFILE }}
        images: 'mycontainer.azurecr.io/myapp:${{ github.sha }}'

下一步

您可以在 GitHub 上找到分組到不同存放庫的一組動作,其中每一個都包含文件與範例,以協助您使用 GitHub 來進行 CI/CD,並將您的應用程式部署至 Azure。