您可以使用 GitHub Actions 工作流程來定義工作流程,以在 Azure Functions 中自動建置程式碼並將其部署至函式應用程式。
定義工作流程設定的 YAML 檔案 (.yml) 是在存放庫的 /.github/workflows/ 路徑中維護。 此定義包含組成工作流程的動作和參數,其專屬於函式的開發語言。 不論語言為何,Functions 的 GitHub Actions 工作流程都會執行下列工作:
- 設定環境。
- 建置程式碼專案。
- 將套件部署至 Azure 中的函數應用程式。
Azure Functions 動作會處理部署至 Azure 中現有的函數應用程式。
您可以手動建立部署的工作流程組態檔。 您也可以透過下列其中一種方式,從一組語言特定範本產生檔案:
- 在 Azure 入口網站
- 使用 Azure CLI
- 從 GitHub 存放庫
如果您不想手動建立 YAML 檔案,請選取文章頂端的不同方法。
先決條件
具有有效訂用帳戶的 Azure 帳戶。
免費建立帳戶。
GitHub 帳戶。 如果您沒有帳戶,請免費註冊。
裝載在 Azure 上且具有 GitHub 存放庫中原始程式碼的運作中函數應用程式。
-
在本機開發時,Azure CLI。 您也可以在 Azure Cloud Shell 中使用 Azure CLI。
產生部署認證
由於 GitHub Actions 會在部署期間使用發行設定檔來存取函數應用程式,因此您必須先取得發行設定檔,並將其安全地儲存為 GitHub 祕密。
重要事項
發行設定檔是一種寶貴的認證,可讓您存取 Azure 資源。 請務必一律安全地傳輸及儲存這個設定檔。 在 GitHub 中,發行設定檔只能儲存在 GitHub 祕密中。
下載您的發行設定檔
若要下載函式應用程式的發佈設定檔:
在 Azure 入口網站中,找出函數應用程式的頁面,展開左側資料行中的 [設定組態]>。
在 [組態] 頁面中,選取 [一般設定] 索引標籤,並確定 SCM 基本驗證發佈認證已 [開啟]。 當此設定為 [關閉] 時,您無法使用發佈設定檔,因此請選取 [開啟],然後選取 [儲存]。
返回函數應用程式的 [概觀] 頁面,然後選取 [取得發佈設定檔]。
儲存並複製檔案的內容。
新增 GitHub 秘密
在 GitHub (英文) 中,前往您的存放庫。
移至 [設定] 。
選取 [祕密和變數]> [動作].
選取 [新增存放庫祕密]。
新增名稱為 AZURE_FUNCTIONAPP_PUBLISH_PROFILE 的新祕密,並將值設定為發行設定檔的內容。
選取 [新增祕密]。
GitHub 現在可以向 Azure 中的函式應用程式進行驗證。
從範本建立工作流程
手動建立工作流程設定的最佳方式是從正式支援的範本開始。
選擇 [Windows] 或 [Linux],以確定您取得正確的作業系統範本。
部署至 Windows 會使用 runs-on: windows-latest。
部署至 Linux 會使用 runs-on: ubuntu-latest。
使用下列連結,從 Azure Functions 動作存放庫複製語言特定範本:
Windows 不支援 Python 函式。 請改為選擇 Linux。
使用 Azure 中的函數應用程式資源名稱更新 env.AZURE_FUNCTIONAPP_NAME 參數。 您可以選擇性地更新參數,設定應用程式所使用的語言版本,例如針對 C# 為 DOTNET_VERSION。
在存放庫的 /.github/workflows/ 路徑中新增這個 YAML 檔案。
在入口網站中建立工作流程設定
當您使用入口網站來啟用 GitHub Actions 時,Functions 會根據應用程式堆疊建立工作流程檔案,並將其認可至正確目錄中的 GitHub 存放庫。
入口網站會自動取得您的發行設定檔,並將其新增至存放庫的 GitHub 祕密。
函數應用程式建立期間
當您在 Azure 入口網站中建立函式時,可以透過 [部署] 索引標籤快速開始使用 GitHub Actions。 若要在您建立新的函數應用程式時新增 GitHub Actions 工作流程:
在 Azure 入口網站中,在 [建立函數應用程式] 流程中選取 [部署]。
如果您想要讓每個程式碼更新觸發程式碼推送至 Azure 入口網站,請啟用 [持續部署]。
輸入您的 GitHub 組織、存放庫和分支。
完成函數應用程式的設定。 您的 GitHub 存放庫現在會在 /.github/workflows/ 中包含新的工作流程檔案。
針對現有的函數應用程式
若要將 GitHub Actions 工作流程新增至現有的函數應用程式:
瀏覽至 Azure 入口網站中的函數應用程式,然後選取 [部署中心]。
針對 [來源],選取 [GitHub]。 如果您沒有看到「使用 GitHub Actions 建置」的預設訊息,請選取 [變更提供者]、選擇 [GitHub Actions],然後選取 [確定]。
如果您尚未授權 GitHub 存取權,請選取 [授權]。 提供您的 GitHub 認證,然後選取 [登入]。 若要授權不同的 GitHub 帳戶,請選取 [變更帳戶],並使用另一個帳戶登入。
輸入您的 GitHub [組織]、[存放庫] 和 [分支]。 若要使用 GitHub Actions 進行部署,您必須具有此存放庫的寫入權限。
在 [驗證設定] 中,選擇是否要讓 GitHub Actions 使用使用者指派的身分識別或使用基本驗證認證進行驗證。 針對基本驗證,系統會使用目前的認證。
選取 [預覽檔案],以查看將會在 github/workflows/ 中新增至 GitHub 存放庫的工作流程檔案。
選取 [儲存] 以將工作流程檔案新增至存放庫。
將工作流程設定新增至您的存放庫
您可以使用 az functionapp deployment github-actions add 命令,從函數應用程式的正確範本產生工作流程組態檔。 新的 YAML 檔案接著會儲存在您提供的 GitHub 存放庫中的正確位置 (/.github/workflows/),而您應用程式的發行設定檔檔會新增至相同存放庫中的 GitHub 祕密。
執行此 az functionapp 命令,取代 githubUser/githubRepo、MyResourceGroup 和 MyFunctionapp 的值:
az functionapp deployment github-actions add --repo "githubUser/githubRepo" -g MyResourceGroup -n MyFunctionapp --login-with-github
此命令會使用互動式方法來擷取 GitHub 帳戶的個人存取權杖。
在終端機視窗中,您應該會看到類似下列訊息的項目:
Please navigate to https://github.com/login/device and enter the user code XXXX-XXXX to activate and retrieve your GitHub personal access token.
複製唯一 XXXX-XXXX 程式碼、瀏覽至 https://github.com/login/device,然後輸入您複製的程式碼。 在輸入您的程式碼之後,您應該會看到類似下列訊息的項目:
Verified GitHub repo and branch
Getting workflow template using runtime: java
Filling workflow template with name: func-app-123, branch: main, version: 8, slot: production, build_path: .
Adding publish profile to GitHub
Fetching publish profile with secrets for the app 'func-app-123'
Creating new workflow file: .github/workflows/master_func-app-123.yml
移至您的 GitHub 存放庫並且選取 [動作]。 確認您的工作流程已執行。
建立工作流程組態檔
您可以直接從 GitHub 存放庫,從 Azure Functions 範本建立 GitHub Actions 工作流程組態檔。
在 GitHub (英文) 中,前往您的存放庫。
選取 [動作],然後選取 [新增工作流程]。
搜尋函式。
在 Microsoft Azure 所撰寫的顯示函數應用程式工作流程中,尋找符合程式碼語言的工作流程,然後選取 [設定]。
在新建立的 YAML 檔案中,使用 Azure 中的函數應用程式資源名稱更新 env.AZURE_FUNCTIONAPP_NAME 參數。 您可以選擇性地更新參數,設定應用程式所使用的語言版本,例如針對 C# 為 DOTNET_VERSION。
確認新的工作流程檔案儲存在 /.github/workflows/ 中,然後選取 [認可變更...]。
更新工作流程設定
如果基於某些原因,您需要更新或變更現有的工作流程設定,只要瀏覽至存放庫中的 /.github/workflows/ 位置、開啟特定 YAML 檔案、進行任何必要的變更,然後將更新認可至存放庫。
範例:工作流程組態檔
下列範本範例使用 functions-action 的版本 1 和 publish profile 進行驗證。 範本取決於您選擇的語言,以及部署函數應用程式的作業系統:
如果您的函數應用程式在 Linux 上執行,請選取 [Linux]。
如果您的函數應用程式在 Windows 上執行,請選取 [Windows]。
name: Deploy DotNet project to Azure Function App
on:
[push]
env:
AZURE_FUNCTIONAPP_NAME: 'your-app-name' # set this to your function app name on Azure
AZURE_FUNCTIONAPP_PACKAGE_PATH: '.' # set this to the path to your function app project, defaults to the repository root
DOTNET_VERSION: '6.0.x' # set this to the dotnet version to use (e.g. '2.1.x', '3.1.x', '5.0.x')
jobs:
build-and-deploy:
runs-on: windows-latest
environment: dev
steps:
- name: 'Checkout GitHub Action'
uses: actions/checkout@v3
- name: Setup DotNet ${{ env.DOTNET_VERSION }} Environment
uses: actions/setup-dotnet@v3
with:
dotnet-version: ${{ env.DOTNET_VERSION }}
- name: 'Resolve Project Dependencies Using Dotnet'
shell: pwsh
run: |
pushd './${{ env.AZURE_FUNCTIONAPP_PACKAGE_PATH }}'
dotnet build --configuration Release --output ./output
popd
- name: 'Run Azure Functions Action'
uses: Azure/functions-action@v1
id: fa
with:
app-name: ${{ env.AZURE_FUNCTIONAPP_NAME }}
package: '${{ env.AZURE_FUNCTIONAPP_PACKAGE_PATH }}/output'
publish-profile: ${{ secrets.AZURE_FUNCTIONAPP_PUBLISH_PROFILE }}
name: Deploy DotNet project to Azure Function App
on:
[push]
env:
AZURE_FUNCTIONAPP_NAME: 'your-app-name' # set this to your function app name on Azure
AZURE_FUNCTIONAPP_PACKAGE_PATH: '.' # set this to the path to your function app project, defaults to the repository root
DOTNET_VERSION: '6.0.x' # set this to the dotnet version to use (e.g. '2.1.x', '3.1.x', '5.0.x')
jobs:
build-and-deploy:
runs-on: ubuntu-latest
environment: dev
steps:
- name: 'Checkout GitHub Action'
uses: actions/checkout@v3
- name: Setup DotNet ${{ env.DOTNET_VERSION }} Environment
uses: actions/setup-dotnet@v3
with:
dotnet-version: ${{ env.DOTNET_VERSION }}
- name: 'Resolve Project Dependencies Using Dotnet'
shell: bash
run: |
pushd './${{ env.AZURE_FUNCTIONAPP_PACKAGE_PATH }}'
dotnet build --configuration Release --output ./output
popd
- name: 'Run Azure Functions Action'
uses: Azure/functions-action@v1
id: fa
with:
app-name: ${{ env.AZURE_FUNCTIONAPP_NAME }}
package: '${{ env.AZURE_FUNCTIONAPP_PACKAGE_PATH }}/output'
publish-profile: ${{ secrets.AZURE_FUNCTIONAPP_PUBLISH_PROFILE }}
name: Deploy Java project to Azure Function App
on:
[push]
env:
AZURE_FUNCTIONAPP_NAME: 'your-app-name' # set this to your function app name on Azure
POM_XML_DIRECTORY: '.' # set this to the directory which contains pom.xml file
JAVA_VERSION: '8' # set this to the java version to use (e.g. '8', '11', '17')
jobs:
build-and-deploy:
runs-on: windows-latest
environment: dev
steps:
- name: 'Checkout GitHub Action'
uses: actions/checkout@v3
- name: Setup Java Sdk ${{ env.JAVA_VERSION }}
uses: actions/setup-java@v1
with:
java-version: ${{ env.JAVA_VERSION }}
- name: 'Restore Project Dependencies Using Mvn'
shell: pwsh
run: |
pushd './${{ env.POM_XML_DIRECTORY }}'
mvn clean package
popd
- name: 'Run Azure Functions Action'
uses: Azure/functions-action@v1
id: fa
with:
app-name: ${{ env.AZURE_FUNCTIONAPP_NAME }}
package: '${{ env.POM_XML_DIRECTORY }}' # if there are multiple function apps in same project, then this path will be like './${{ env.POM_XML_DIRECTORY }}/target/azure-functions/${{ env.POM_FUNCTIONAPP_NAME }'
publish-profile: ${{ secrets.AZURE_FUNCTIONAPP_PUBLISH_PROFILE }}
respect-pom-xml: true
name: Deploy Java project to Azure Function App
on:
[push]
env:
AZURE_FUNCTIONAPP_NAME: 'your-app-name' # set this to your function app name on Azure
POM_XML_DIRECTORY: '.' # set this to the directory which contains pom.xml file
JAVA_VERSION: '8' # set this to the java version to use (e.g. '8', '11', '17')
jobs:
build-and-deploy:
runs-on: ubuntu-latest
environment: dev
steps:
- name: 'Checkout GitHub Action'
uses: actions/checkout@v3
- name: Setup Java Sdk ${{ env.JAVA_VERSION }}
uses: actions/setup-java@v1
with:
java-version: ${{ env.JAVA_VERSION }}
- name: 'Restore Project Dependencies Using Mvn'
shell: bash
run: |
pushd './${{ env.POM_XML_DIRECTORY }}'
mvn clean package
popd
- name: 'Run Azure Functions Action'
uses: Azure/functions-action@v1
id: fa
with:
app-name: ${{ env.AZURE_FUNCTIONAPP_NAME }}
package: '${{ env.POM_XML_DIRECTORY }}' # if there are multiple function apps in same project, then this path will be like './${{ env.POM_XML_DIRECTORY }}/target/azure-functions/${{ env.POM_FUNCTIONAPP_NAME }'
publish-profile: ${{ secrets.AZURE_FUNCTIONAPP_PUBLISH_PROFILE }}
respect-pom-xml: true
name: Deploy Node.js project to Azure Function App
on:
[push]
env:
AZURE_FUNCTIONAPP_NAME: 'your-app-name' # set this to your function app name on Azure
AZURE_FUNCTIONAPP_PACKAGE_PATH: '.' # set this to the path to your function app project, defaults to the repository root
NODE_VERSION: '16.x' # set this to the node version to use (e.g. '8.x', '10.x', '12.x')
jobs:
build-and-deploy:
runs-on: windows-latest
environment: dev
steps:
- name: 'Checkout GitHub Action'
uses: actions/checkout@v3
- name: Setup Node ${{ env.NODE_VERSION }} Environment
uses: actions/setup-node@v3
with:
node-version: ${{ env.NODE_VERSION }}
- name: 'Resolve Project Dependencies Using Npm'
shell: pwsh
run: |
pushd './${{ env.AZURE_FUNCTIONAPP_PACKAGE_PATH }}'
npm install
npm run build --if-present
npm run test --if-present
popd
- name: 'Run Azure Functions Action'
uses: Azure/functions-action@v1
id: fa
with:
app-name: ${{ env.AZURE_FUNCTIONAPP_NAME }}
package: ${{ env.AZURE_FUNCTIONAPP_PACKAGE_PATH }}
publish-profile: ${{ secrets.AZURE_FUNCTIONAPP_PUBLISH_PROFILE }}
name: Deploy Node.js project to Azure Function App
on:
[push]
env:
AZURE_FUNCTIONAPP_NAME: 'your-app-name' # set this to your function app name on Azure
AZURE_FUNCTIONAPP_PACKAGE_PATH: '.' # set this to the path to your function app project, defaults to the repository root
NODE_VERSION: '16.x' # set this to the node version to use (e.g. '8.x', '10.x', '12.x')
jobs:
build-and-deploy:
runs-on: ubuntu-latest
environment: dev
steps:
- name: 'Checkout GitHub Action'
uses: actions/checkout@v3
- name: Setup Node ${{ env.NODE_VERSION }} Environment
uses: actions/setup-node@v3
with:
node-version: ${{ env.NODE_VERSION }}
- name: 'Resolve Project Dependencies Using Npm'
shell: bash
run: |
pushd './${{ env.AZURE_FUNCTIONAPP_PACKAGE_PATH }}'
npm install
npm run build --if-present
npm run test --if-present
popd
- name: 'Run Azure Functions Action'
uses: Azure/functions-action@v1
id: fa
with:
app-name: ${{ env.AZURE_FUNCTIONAPP_NAME }}
package: ${{ env.AZURE_FUNCTIONAPP_PACKAGE_PATH }}
publish-profile: ${{ secrets.AZURE_FUNCTIONAPP_PUBLISH_PROFILE }}
Windows 不支援 Python 函式。 請改為選擇 Linux。
name: Deploy Python project to Azure Function App
on:
[push]
env:
AZURE_FUNCTIONAPP_NAME: 'your-app-name' # set this to your function app name on Azure
AZURE_FUNCTIONAPP_PACKAGE_PATH: '.' # set this to the path to your function app project, defaults to the repository root
PYTHON_VERSION: '3.9' # set this to the python version to use (e.g. '3.6', '3.7', '3.8')
jobs:
build-and-deploy:
runs-on: ubuntu-latest
environment: dev
steps:
- name: 'Checkout GitHub Action'
uses: actions/checkout@v3
- name: Setup Python ${{ env.PYTHON_VERSION }} Environment
uses: actions/setup-python@v4
with:
python-version: ${{ env.PYTHON_VERSION }}
- name: 'Resolve Project Dependencies Using Pip'
shell: bash
run: |
pushd './${{ env.AZURE_FUNCTIONAPP_PACKAGE_PATH }}'
python -m pip install --upgrade pip
pip install -r requirements.txt --target=".python_packages/lib/site-packages"
popd
- name: 'Run Azure Functions Action'
uses: Azure/functions-action@v1
id: fa
with:
app-name: ${{ env.AZURE_FUNCTIONAPP_NAME }}
package: ${{ env.AZURE_FUNCTIONAPP_PACKAGE_PATH }}
publish-profile: ${{ secrets.AZURE_FUNCTIONAPP_PUBLISH_PROFILE }}
scm-do-build-during-deployment: true
enable-oryx-build: true
name: Deploy PowerShell project to Azure Function App
on:
[push]
env:
AZURE_FUNCTIONAPP_NAME: 'your-app-name' # set this to your function app name on Azure
AZURE_FUNCTIONAPP_PACKAGE_PATH: '.' # set this to the path to your function app project, defaults to the repository root
jobs:
build-and-deploy:
runs-on: windows-latest
environment: dev
steps:
- name: 'Checkout GitHub Action'
uses: actions/checkout@v3
- name: 'Run Azure Functions Action'
uses: Azure/functions-action@v1
id: fa
with:
app-name: ${{ env.AZURE_FUNCTIONAPP_NAME }}
package: ${{ env.AZURE_FUNCTIONAPP_PACKAGE_PATH }}
publish-profile: ${{ secrets.AZURE_FUNCTIONAPP_PUBLISH_PROFILE }}
name: Deploy PowerShell project to Azure Function App
on:
[push]
env:
AZURE_FUNCTIONAPP_NAME: 'your-app-name' # set this to your function app name on Azure
AZURE_FUNCTIONAPP_PACKAGE_PATH: '.' # set this to the path to your function app project, defaults to the repository root
jobs:
build-and-deploy:
runs-on: ubuntu-latest
environment: dev
steps:
- name: 'Checkout GitHub Action'
uses: actions/checkout@v3
- name: 'Run Azure Functions Action'
uses: Azure/functions-action@v1
id: fa
with:
app-name: ${{ env.AZURE_FUNCTIONAPP_NAME }}
package: ${{ env.AZURE_FUNCTIONAPP_PACKAGE_PATH }}
publish-profile: ${{ secrets.AZURE_FUNCTIONAPP_PUBLISH_PROFILE }}
Azure Functions 動作
Azure Functions 動作 (Azure/functions-action) 會定義如何將程式碼發佈至 Azure 中的現有函數應用程式,或發佈至應用程式中的特定位置。
參數
所有函數應用程式方案都需要以下參數:
| 參數 |
說明 |
|
app-name |
函式應用程式的名稱。 |
|
package |
這是您的專案中要發佈的位置。 根據預設,此值會設定為 .,這表示會部署 GitHub 存放庫中的所有檔案和資料夾。 |
彈性使用量方案需要下列參數:
| 參數 |
說明 |
|
sku |
使用 publish-profile 進行驗證時,將此項設定為 flexconsumption。 當使用 RBAC 認證或部署到非彈性使用量方案時,Action 可以解析該值,因此不需要包含該參數。 |
|
remote-build |
將此項設定為 true,以在將套件部署到彈性使用量應用程式時啟用由 Kudu 執行的組建動作。 在彈性使用量中進行遠端組建期間,一律會執行 Oryx 組建;因此不要設定 scm-do-build-during-deployment 或 enable-oryx-build。 根據預設,此參數會設定為 false。 |
下列參數專屬於使用量、彈性進階和 App Service (專用) 方案:
| 參數 |
說明 |
|
scm-do-build-during-deployment |
(選用) 允許 Kudu 網站 (例如 https://<APP_NAME>.scm.azurewebsites.net/) 執行預先部署作業,例如遠端組建。 根據預設,此項會設定為 false。 當您確實想要使用 Kudu 來控制部署行為,而不是解析 GitHub 工作流程中的相依性時,請此項設定為 true。 如需詳細資訊,請參閱 SCM_DO_BUILD_DURING_DEPLOYMENT 設定。 |
|
enable-oryx-build |
(選用) 允許 Kudu 網站使用 Oryx 解析您的專案相依性。 根據預設,此項會設定為 false。 如果您想要使用 Oryx 來解析相依性,而不是 GitHub 工作流程,請將 scm-do-build-during-deployment 和 enable-oryx-build 設定為 true。 |
適用於所有函數應用程式方案的選用參數:
| 參數 |
說明 |
|
slot-name |
這是要部署至其中的部署位置名稱。 根據預設,此值是空的,這表示 GitHub Action 會部署到您的生產網站。 當此設定指向非生產位置時,請確定 publish-profile 參數包含位置的認證,而不是生產網站。
目前在彈性使用量中不受支援。 |
|
publish-profile |
包含發行設定檔的 GitHub 祕密名稱。 |
|
respect-pom-xml |
僅用於 Java 函數。 您的應用程式部署成品是否需要從 pom.xml 檔案衍生。 部署 Java 函數應用程式時,您應該將此參數設定為 true,並將 package 設定為 .。 根據預設,此參數會設定為 false,這表示 package 參數必須指向應用程式的成品位置,例如 ./target/azure-functions/ |
|
respect-funcignore |
GitHub Actions 是否會接受您的 .funcignore 檔案以排除在其中定義的檔案和資料夾。 當您的存放庫具有 .funcignore 檔案且您想要用來排除路徑和檔案時,例如文字編輯器設定、.vscode/ 或 Python 虛擬環境 (.venv/),請將此值設定為 true。 預設值是 false。 |
考量
使用 Azure Functions 動作時,請記住下列考量:
使用 GitHub Actions 時,程式碼的部署方式取決於您的裝載方案,如下表所示:
* 在使用量方案中在 Linux 上執行應用程式的能力計劃即將淘汰。 如需詳細資訊,請參閱 Azure Functions 消耗方案主機代管。
GitHub 連線至 Azure 以進行部署所需的認證會儲存為 GitHub 存放庫中的祕密,並在部署中以 secrets.<SECRET_NAME> 的形式存取。
GitHub Actions 向 Azure Functions 驗證以進行部署最簡單的方式是使用發行設定檔。 您也可以使用服務主體進行驗證。 若要深入了解,請參閱此 GitHub Actions 存放庫。
設定環境和執行組建的動作會從範本產生,而且是語言特定。
範本會使用 env 元素來定義組建和部署唯一的設定。
後續步驟