使用 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 服務 進行驗證的建議方式是使用 OpenID Connect。 您也可以使用服務主體或發行配置文件進行驗證。

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

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

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

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

    注意

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

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

設定用於驗證的 GitHub 祕密

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

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

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

YAML
- 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,但相同的動作也適用於其他登錄。

YAML
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。

yml
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 }}     

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

YAML
name: Windows Container Workflow
on: [push]
jobs:
  build:
    runs-on: windows-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。

yml
name: Windows Container Workflow
on: [push]
jobs:
  build:
    runs-on: windows-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
YAML
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 }}'
YAML
name: Windows_Container_Workflow

on: [push]

jobs:
  build:
    runs-on: windows-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。