使用 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.部署容器映像。 |
必要條件
- 具有有效訂用帳戶的 Azure 帳戶。 免費建立帳戶
- GitHub 帳戶。 如果您沒有 Microsoft 帳戶,請免費註冊。 您必須在 GitHub 存放庫中擁有程式碼,才能部署至 Azure App Service。
- 適用於容器的工作容器登錄與 Azure App Service 應用程式。 此範例使用 Azure Container Registry。 請務必針對容器完成 Azure App Service 的完整部署。 不同於一般 Web 應用程式,適用於容器的 Web 應用程式沒有預設登陸頁面。 發佈容器以取得工作範例。
產生部署認證
使用 GitHub Actions 的 Azure App Services 進行驗證的建議方式是使用發行設定檔。 您也可以使用服務主體或 OpenID Connect 進行驗證,但此程序會需要更多步驟。
將您的發行設定檔認證或服務主體儲存為 GitHub 祕密,以搭配 Azure 進行驗證。 您將存取工作流程中的祕密。
發行設定檔是應用程式層級認證。 將發行設定檔設定為 GitHub 祕密。
前往 Azure 入口網站中的 App Service。
在 [概觀] 頁面上,選取 [取得發行設定檔]。
注意
自 2020 年 10 月起,Linux Web 應用程式需要將應用程式設定
WEBSITE_WEBDEPLOY_USE_SCM
設定為true
,才能下載檔案。 未來將移除此需求。 若要了解如何設定常見的 Web 應用程式設定,請參閱在 Azure 入口網站中設定 App Service 應用程式。儲存下載的檔案。 您將使用檔案的內容來建立 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。
前往 Azure 入口網站或 Docker 中的容器,並複製使用者名稱與密碼。 您可以在 Azure 入口網站中的 [設定] > [存取金鑰] 下找到用於登錄的 Azure Container Registry 使用者名稱與密碼。
為名為
REGISTRY_USERNAME
的登錄使用者名稱定義新的祕密。為名為
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。