如何使用 GitHub Actions 部署至 Azure?
本單元將討論如何使用 GitHub Actions 將容器型 Web 應用程式部署至 Microsoft Azure Web Apps。 內容包含觸發工作流程的一些選項。 接下來,您將學習如何在工作流程中使用條件。 最後,學習如何使用 GitHub Actions 建立和刪除 Azure 資源。
觸發 CD 工作流程的選項
有數個選項可啟動 CD 工作流程。 在使用 GitHub Actions 進行 CI 的上一個課程模組中,您已瞭解如何從推送至 GitHub 存放庫觸發工作流程。 不過,對於 CD,您可能會想在某個其他事件上觸發部署工作流程。
其中一個選項是使用 ChatOps 觸發工作流程。 ChatOps 會使用聊天用戶端、聊天機器人和即時通訊工具來執行工作。 例如,您可能會在可啟動聊天機器人的提取要求中留下特定的註解。 該聊天機器人可能會回覆一些統計資料,或執行工作流程。
另一個選項 (在我們的範例中使用的選項) 是在您的提取要求中使用標籤。 不同的標籤可以啟動不同的工作流程。 例如,新增階段標籤,開始預備環境的部署工作流程。 或者,新增啟動環境 標籤以執行建立 Microsoft Azure 資源的工作流程,以便您用於部署。 若要使用標籤,您的工作流程看起來會像這樣:
on:
pull_request:
types: [labeled]
使用作業條件控制執行
您通常只在某些條件為 true 時執行工作流程。
GitHub 工作流程提供此情節的 if
條件。 該條件使用在執行階段評估的運算式。 例如,如果階段標籤新增至提取要求,表示您想要執行此工作流程。
if: contains(github.event.pull_request.labels.*.name, 'stage')
使用 GitHub Secrets 儲存認證
您不會想在工作流程檔案中公開機密資訊。 GitHub Secrets 是能將工作流程所需的敏感性資訊予以妥善儲存的安全位置。 以下是範例。
為了部署至 Azure 資源,GitHub Actions 必須具有存取資源的權限。 您不希望在工作流程檔案中以明顯的方式儲存 Azure 認證。 您可以將認證儲存在 GitHub 祕密中。
若要將資訊儲存在 GitHub Secrets 中,請在入口網站上建立祕密。
然後,就可以在工作流程中使用您所建立的祕密名稱 (無論何處需要該資訊)。 例如,使用在 Azure login
動作的 creds:
屬性中儲存於 GitHub Secrets 的 Azure 認證。
steps:
- name: "Login via Azure CLI"
uses: azure/login@v1
with:
creds: ${{ secrets.AZURE_CREDENTIALS }}
使用 GitHub Actions 部署至 Microsoft Azure
GitHub Marketplace 有數個可協助您自動化 Azure 相關工作的動作。
您也可以直接在存放庫的工作流程編輯器中搜尋和瀏覽 GitHub Actions。 您可以在側邊欄中搜尋特定的動作、檢視精選動作,以及瀏覽精選類別。
尋找動作:
- 在存放庫中,瀏覽至想要編輯的工作流程檔案。
- 選取檔案檢視右上角中的編輯圖示。
- 使用編輯器右邊的 GitHub Marketplace 側邊欄瀏覽 Actions。
假設您想要將以容器為基礎的 Web 應用程式部署至 Azure Web Apps。 如果您搜尋 GitHub Marketplace,則會發現下列動作:
如果您將這些動作新增至 Deploy-to-Azure
作業,您的工作流程看起來會像這樣:
Deploy-to-Azure:
runs-on: ubuntu-latest
needs: Build-Docker-Image
name: Deploy app container to Azure
steps:
- name: "Login via Azure CLI"
uses: azure/login@v1
with:
creds: ${{ secrets.AZURE_CREDENTIALS }}
- uses: azure/docker-login@v1
with:
login-server: ${{env.IMAGE_REGISTRY_URL}}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Deploy web app container
uses: azure/webapps-deploy@v1
with:
app-name: ${{env.AZURE_WEBAPP_NAME}}
images: ${{env.IMAGE_REGISTRY_URL}}/${{ github.repository }}/${{env.DOCKER_IMAGE_NAME}}:${{ github.sha }}
- name: Azure logout
run: |
az logout
請注意,此作業與先前的作業 Build-Docker-Image
有關。 先前的作業會建立已部署的成品。
azure/login@v1 動作需要認證,才能登入您的 Azure 帳戶,以便存取您想要部署的 Azure 資源。 在這裡,使用儲存於 GitHub Secrets 的認證。
同樣也適用於 azure/docker-login@v1 動作。 因為您要部署容器映像,所以必須登入您的私人容器登錄。
azure/webapps-deploy@v1 動作會執行部署。 取決於兩個上述動作。
使用 GitHub Actions 建立和刪除 Azure 資源
由於 CD 是自動化程序,因此您已經決定使用基礎結構即程式碼來建立和終止您部署的環境。 GitHub Actions 可讓 Azure 上的這些工作自動化,您可以將這些動作包含在您的工作流程中。
注意
請務必記得關閉您不再使用的資源,以避免不必要的費用產生。
其中一個選項是建立包含兩個工作的新工作流程,其中一個工作會啟動資源,另一個則會刪除資源。 然後,使用條件僅執行您需要的作業。 在此範例中,條件會尋找提取要求中的標籤,如果標籤是啟動環境,即執行 set-up-azure-resources
作業,如果標籤是destroy-azure-resources
終結環境,則執行 作業。
jobs:
set-up-azure-resources:
runs-on: ubuntu-latest
if: contains(github.event.pull_request.labels.*.name, 'spin up environment')
...
destroy-azure-resources:
runs-on: ubuntu-latest
if: contains(github.event.pull_request.labels.*.name, 'destroy environment')
...
作業會使用 Azure CLI 建立和終結 Azure 資源。 如需 Azure CLI 的詳細資訊,請參閱 Azure CLI 的概觀。
以下是 set-up-azure-resources
作業步驟的範例:
steps:
- name: Checkout repository
uses: actions/checkout@v2
- name: Azure login
uses: azure/login@v1
with:
creds: ${{ secrets.AZURE_CREDENTIALS }}
- name: Create Azure resource group
if: success()
run: |
az group create --location ${{env.AZURE_LOCATION}} --name ${{env.AZURE_RESOURCE_GROUP}} --subscription ${{secrets.AZURE_SUBSCRIPTION_ID}}
- name: Create Azure app service plan
if: success()
run: |
az appservice plan create --resource-group ${{env.AZURE_RESOURCE_GROUP}} --name ${{env.AZURE_APP_PLAN}} --is-linux --sku F1 --subscription ${{secrets.AZURE_SUBSCRIPTION_ID}}
- name: Create webapp resource
if: success()
run: |
az webapp create --resource-group ${{ env.AZURE_RESOURCE_GROUP }} --plan ${{ env.AZURE_APP_PLAN }} --name ${{ env.AZURE_WEBAPP_NAME }} --deployment-container-image-name nginx --subscription ${{secrets.AZURE_SUBSCRIPTION_ID}}
- name: Configure webapp to use GitHub Packages
if: success()
run: |
az webapp config container set --docker-custom-image-name nginx --docker-registry-server-password ${{secrets.GITHUB_TOKEN}} --docker-registry-server-url https://docker.pkg.github.com --docker-registry-server-user ${{github.actor}} --name ${{ env.AZURE_WEBAPP_NAME }} --resource-group ${{ env.AZURE_RESOURCE_GROUP }} --subscription ${{secrets.AZURE_SUBSCRIPTION_ID}}
請注意,您會使用 GitHub 動作簽出存放庫,並登入 Azure。 之後,您會建立所需的資源,並使用 Azure CLI 來部署容器。