【Azure Developer】在Github Action中使用Azure/functions-container-action@v1配置Function App并成功部署Function Image

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 【Azure Developer】在Github Action中使用Azure/functions-container-action@v1配置Function App并成功部署Function Image

问题描述

使用Github Action,通过 Azure/functions-container-action@v1 插件来完成 yaml 文件的配置,并成功部署Function Image 的过程记录。

 

操作步骤

第一步: 准备Function的镜像文件

如在VS Code中,通过Terminal(命令行窗口),根据所使用的语言,创建或初始化DockerFile

func init --worker-runtime python --docker


# --docker 选项生成该项目的 Dockerfile,其中定义了适合用于 Azure Functions 和所选运行时的自定义容器 Python

执行后的效果为在Function 项目中添加Dockerfile文件。

参考文档 -- 在 Linux 上使用自定义容器创建函数:https://docs.azure.cn/zh-cn/azure-functions/functions-create-function-linux-custom-image?tabs=in-process%2Cbash%2Cazure-cli&pivots=programming-language-python

 

第二步:上传镜像到ACR

首先,在本地启动Docker Desktop后,使用Docker build 生产镜像文件。

然后,登录ACR(Azure Container Registry :Azure 容器注册表)。

命令示例如下:

## 本地生产Image文件
docker build --tag azurefunctionsimage:v1 .
## 登录Azure镜像库
docker login <your-registry-name>.azurecr.cn --username <your-registry-username>
## 设置tag,推送到ACR
docker tag azurefunctionsimage <your-registry-name>.azurecr.cn/azurefunctionsimage:v1
docker push <your-registry-name>.azurecr.cn/azurefunctionsimage:v1

参考文档 -- 向 Azure 容器注册表推送映像 : https://docs.azure.cn/zh-cn/app-service/tutorial-custom-container?pivots=container-linux#push-the-image-to-azure-container-registry

 

第三步:配置用户标识

启用用户标识,主要就是为了能够让它有权限去访问ACR并且拉取镜像文件

1:创建用户标识:Create User Assigned Managed Identity - Microsoft Azure 由世纪互联运营

2:在ACR中为用户标识赋予权限(Contributor or Reader):分配 Azure 角色的步骤 https://docs.azure.cn/zh-cn/role-based-access-control/role-assignments-steps

 

第四步:配置Github Action的 workflow yaml文件

Action的workflow文件中,有两段内容需要配置,一是设置 用户标识,二是设置镜像路径。

第一段,修改Function App的设置

- name: Azure App Service Settings
      uses: Azure/appservice-settings@v1
      with:
        # Name of the Azure Web App
        app-name: fun-name
        general-settings-json: '{"acrUseManagedIdentityCreds": "true", "acrUserManagedIdentityID": "user managed identity id xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"}'

第二段,配置Image 路径

- name: 'Run Azure Functions Container Action'
      uses: Azure/functions-container-action@v1
      id: fa
      with:
        app-name: fun-name
        image: youracrname.azurecr.cn/imagename:version

以上配置与 Azure Funciton 门户上 Development Center 的设置对比关系如下:

参考的github上yaml文件内容:https://github.com/Azure/actions-workflow-samples/tree/master/FunctionApphttps://github.com/Azure/actions-workflow-samples/blob/master/FunctionApp/linux-container-functionapp-on-azure.yml

修改后的yaml内容:

# Action Requires
# 1. Setup the AZURE_CREDENTIALS secrets in your GitHub Repository
# 2. Setup the REGISTRY_USERNAME secrets in your GitHub Repository
# 3. Setup the REGISTRY_PASSWORD secrets in your GitHub Repository
# 4. Replace REGISTRY, NAMESPACE, IMAGE, TAG in the following template with proper values
# 5. Add this yaml file to your project's .github/workflows/
# 6. Push your local project to your GitHub Repository
name: Linux_Container_Workflow
on: [push]
#on:
#  push:
#    branches:
#    - master
jobs:
  build-and-deploy:
    runs-on: ubuntu-latest
    environment: dev
    steps:
    - name: 'Checkout GitHub Action'
      uses: actions/checkout@v3
    #- name: 'Login via Azure CLI'
    #  uses: Azure/login@v1.4.6
    #  with:
    #    creds: ${{ secrets.AZURE_CREDENTIALS }}
    #    environment: AzureChinaCloud
    #    #allow-no-subscriptions: true
    
    - name: 'set subscriptions'
      run: |
          az cloud set --name AzureChinaCloud
          az login -u your azure user name -p "password" 
          az account set --subscription "your subscription id"
    - name: 'Docker Login'
      uses: azure/docker-login@v1
      with:
        login-server: youracrname.azurecr.cn
        username: ${{ secrets.REGISTRY_USERNAME }}
        password: ${{ secrets.REGISTRY_PASSWORD }}
      
    # - name: 'Compose Customized Docker Image'
    #   shell: bash
    #   run: |
    #     # If your function app project is not located in your repository's root
    #     # Please change the path to your directory for docker build
    #     docker build . -t REGISTRY/NAMESPACE/IMAGE:TAG
    #     docker push REGISTRY/NAMESPACE/IMAGE:TAG
    - name: Azure App Service Settings
      uses: Azure/appservice-settings@v1
      with:
        # Name of the Azure Web App
        app-name: functionappname
        general-settings-json: '{"acrUseManagedIdentityCreds": "true", "acrUserManagedIdentityID": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"}'
    - name: 'Run Azure Functions Container Action'
      uses: Azure/functions-container-action@v1
      id: fa
      with:
        app-name: functionappname
    #image: REGISTRY/NAMESPACE/IMAGE:TAG
        image: youracrname.azurecr.cn/azurefunctionimage:v1
    #- name: 'use the published functionapp url in upcoming steps'
    #  run: |
    #    echo "${{ steps.fa.outputs.app-url }}"
    - name: Azure logout
      run: |
        az logout
# For more information on GitHub Actions:
#   https://help.github.com/en/categories/automating-your-workflow-with-github-actions

以上操作完成后,即可上传workflow yaml文件到 .github/workflows/ 目录下。因为条件设置为 on: [push],所以任何对代码库的push操作就会触发该workflow。

 

成功的效果图如本文最开始“问题描述”中的图片一致。

 

在Azure Function的log中,也能发现类似的Container启动日志:

2023-01-13T03:09:36.682Z INFO  - Logging is not enabled for this container.
Please use https://aka.ms/linux-diagnostics to enable logging to see container logs here.
2023-01-13T03:09:45.209Z INFO  - Initiating warmup request to container funtest01_1_b4054967_msiProxy for site funtest01
2023-01-13T03:09:45.261Z INFO  - Container funtest01_1_b4054967_msiProxy for site funtest01 initialized successfully and is ready to serve requests.
2023-01-13T03:09:45.268Z INFO  - Initiating warmup request to container funtest01_1_b4054967 for site funtest01
2023-01-13T03:10:01.707Z INFO  - Waiting for response to warmup request for container funtest01_1_b4054967. Elapsed time = 16.4981389 sec
2023-01-13T03:10:13.069Z INFO  - Container funtest01_1_b4054967 for site funtest01 initialized successfully and is ready to serve requests.
2023-01-13T03:10:13.089Z INFO  - Initiating warmup request to container funtest01_1_b4054967_middleware for site funtest01
2023-01-13T03:10:17.032Z INFO  - Container funtest01_1_b4054967_middleware for site funtest01 initialized successfully and is ready to serve requests.
2023-01-13T03:22:40.065Z INFO  - Recycling container because of AppSettingsChange and isMainSite = True
2023-01-13T03:22:55.207Z INFO  - Pulling image: mcr.microsoft.com/azure-functions/dotnet:3.0-appservice-quickstart
2023-01-13T03:22:56.079Z INFO  - 3.0-appservice-quickstart Pulling from azure-functions/dotnet
2023-01-13T03:22:56.080Z INFO  -  Digest: sha256:99f2de1ba2d097fe7fca8098351bd7d9d2e1cabbc32e3c3506321f7f1811bd1b
2023-01-13T03:22:56.081Z INFO  -  Status: Image is up to date for mcr.microsoft.com/azure-functions/dotnet:3.0-appservice-quickstart
2023-01-13T03:22:56.084Z INFO  - Pull Image successful, Time taken: 0 Minutes and 0 Seconds
2023-01-13T03:22:56.157Z INFO  - Starting container for site
2023-01-13T03:22:56.165Z INFO  - docker run -d --expose=80 --name funtest01_2_24a23a85 -e WEBSITE_CORS_ALLOWED_ORIGINS=https://portal.azure.cn -e WEBSITE_CORS_SUPPORT_CREDENTIALS=False -e WEBSITES_ENABLE_APP_SERVICE_STORAGE=false -e WEBSITE_SITE_NAME=funtest01 -e WEBSITE_AUTH_ENABLED=False -e PORT=80 -e WEBSITE_ROLE_INSTANCE_ID=0 -e WEBSITE_HOSTNAME=funtest01.chinacloudsites.cn -e WEBSITE_INSTANCE_ID=50a285a49ae3758d44951d408c7ec6cb3077821b90868ed2bf52d6c32be391fa -e WEBSITE_USE_DIAGNOSTIC_SERVER=False mcr.microsoft.com/azure-functions/dotnet:3.0-appservice-quickstart  
2023-01-13T03:22:56.166Z INFO  - Logging is not enabled for this container.
Please use https://aka.ms/linux-diagnostics to enable logging to see container logs here.
2023-01-13T03:23:10.342Z INFO  - Initiating warmup request to container funtest01_2_24a23a85_msiProxy for site funtest01
2023-01-13T03:23:10.745Z INFO  - Container funtest01_2_24a23a85_msiProxy for site funtest01 initialized successfully and is ready to serve requests.
2023-01-13T03:23:10.753Z INFO  - Initiating warmup request to container funtest01_2_24a23a85 for site funtest01
2023-01-13T03:23:27.483Z INFO  - Waiting for response to warmup request for container funtest01_2_24a23a85. Elapsed time = 17.1407378 sec
2023-01-13T03:23:38.014Z INFO  - Container funtest01_2_24a23a85 for site funtest01 initialized successfully and is ready to serve requests.
2023-01-13T03:23:38.023Z INFO  - Initiating warmup request to container funtest01_2_24a23a85_middleware for site funtest01
2023-01-13T03:23:54.109Z INFO  - Container funtest01_2_24a23a85_middleware for site funtest01 initialized successfully and is ready to serve requests.
2023-01-13T06:14:26.600Z INFO  - Recycling container because of AppFrameworkVersionChange and appFrameworkVersion = <youracrname>.azurecr.cn/azurefunctionimage:v1
2023-01-13T06:14:50.804Z INFO  - Pulling image: <youracrname>.azurecr.cn/azurefunctionimage:v1
2023-01-13T06:14:51.203Z INFO  - v1 Pulling from azurefunctionimage
2023-01-13T06:14:51.228Z INFO  - 3f4ca61aafcd Pulling fs layer
2023-01-13T06:14:51.233Z INFO  - 3f487a3359db Pulling fs layer
2023-01-13T06:14:51.233Z INFO  - cf20d7997674 Pulling fs layer
2023-01-13T06:14:51.234Z INFO  - 8fa944797ac7 Pulling fs layer
2023-01-13T06:14:51.234Z INFO  - 268581bec5af Pulling fs layer
2023-01-13T06:14:51.235Z INFO  - 320a9b97d2ed Pulling fs layer
2023-01-13T06:14:51.235Z INFO  - 14bf15bf0e2a Pulling fs layer
2023-01-13T06:14:51.235Z INFO  - 888c871585b1 Pulling fs layer
2023-01-13T06:14:51.243Z INFO  - dc54e8c78a21 Pulling fs layer
2023-01-13T06:14:51.244Z INFO  - 0b8d318d756a Pulling fs layer
2023-01-13T06:14:51.244Z INFO  - 686f382362d7 Pulling fs layer
2023-01-13T06:14:51.252Z INFO  - a108b4c555c7 Pulling fs layer
2023-01-13T06:14:51.253Z INFO  - 07a70c22a7c4 Pulling fs layer
2023-01-13T06:14:52.512Z INFO  - 3f487a3359db Downloading 799KB / 1MB
...
2023-01-13T06:17:09.734Z INFO  - 07a70c22a7c4 Extracting 9MB / 9MB
2023-01-13T06:17:09.938Z INFO  - 07a70c22a7c4 Pull complete
2023-01-13T06:17:09.955Z INFO  -  Digest: sha256:26a409b16044e27bdd97627a14118e33e84f840052d9fe4711f1ca471b09d22b
2023-01-13T06:17:09.957Z INFO  -  Status: Downloaded newer image for <youracrname>.azurecr.cn/azurefunctionimage:v1
2023-01-13T06:17:10.056Z INFO  - Pull Image successful, Time taken: 2 Minutes and 19 Seconds
2023-01-13T06:17:10.688Z INFO  - Starting container for site
2023-01-13T06:17:10.699Z INFO  - docker run -d --expose=80 --name funtest01_3_e9514d82 -e WEBSITE_CORS_ALLOWED_ORIGINS=https://portal.azure.cn -e WEBSITE_CORS_SUPPORT_CREDENTIALS=False -e WEBSITES_ENABLE_APP_SERVICE_STORAGE=false -e WEBSITE_SITE_NAME=funtest01 -e WEBSITE_AUTH_ENABLED=False -e PORT=80 -e WEBSITE_ROLE_INSTANCE_ID=0 -e WEBSITE_HOSTNAME=funtest01.chinacloudsites.cn -e WEBSITE_INSTANCE_ID=50a285a49ae3758d44951d408c7ec6cb3077821b90868ed2bf52d6c32be391fa -e WEBSITE_USE_DIAGNOSTIC_SERVER=False <youracrname>.azurecr.cn/azurefunctionimage:v1  
2023-01-13T06:17:10.707Z INFO  - Logging is not enabled for this container.
Please use https://aka.ms/linux-diagnostics to enable logging to see container logs here.
2023-01-13T06:17:20.451Z INFO  - Initiating warmup request to container funtest01_3_e9514d82_msiProxy for site funtest01
2023-01-13T06:17:20.721Z INFO  - Container funtest01_3_e9514d82_msiProxy for site funtest01 initialized successfully and is ready to serve requests.
2023-01-13T06:17:20.722Z INFO  - Initiating warmup request to container funtest01_3_e9514d82 for site funtest01
2023-01-13T06:17:36.951Z INFO  - Waiting for response to warmup request for container funtest01_3_e9514d82. Elapsed time = 16.4996091 sec
2023-01-13T06:17:44.426Z INFO  - Container funtest01_3_e9514d82 for site funtest01 initialized successfully and is ready to serve requests.
2023-01-13T06:17:44.427Z INFO  - Initiating warmup request to container funtest01_3_e9514d82_middleware for site funtest01
2023-01-13T06:17:45.431Z INFO  - Container funtest01_3_e9514d82_middleware for site funtest01 initialized successfully and is ready to serve requests.

 

 

参考资料

Action Samples for deploying to Azure Functions :https://github.com/Azure/actions-workflow-samples/tree/master/FunctionApp

 

相关实践学习
通过容器镜像仓库与容器服务快速部署spring-hello应用
本教程主要讲述如何将本地Java代码程序上传并在云端以容器化的构建、传输和运行。
Kubernetes极速入门
Kubernetes(K8S)是Google在2014年发布的一个开源项目,用于自动化容器化应用程序的部署、扩展和管理。Kubernetes通常结合docker容器工作,并且整合多个运行着docker容器的主机集群。 本课程从Kubernetes的简介、功能、架构,集群的概念、工具及部署等各个方面进行了详细的讲解及展示,通过对本课程的学习,可以对Kubernetes有一个较为全面的认识,并初步掌握Kubernetes相关的安装部署及使用技巧。本课程由黑马程序员提供。 &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情:&nbsp;https://www.aliyun.com/product/kubernetes
相关文章
|
1月前
|
Java Windows
【Azure Function】部署Java Function失败:报错deploy [ERROR] Status code 401和警告 'China North 3' may not be a valid region
1:deploy [ERROR] Status code 401, (empty body). 2: China North 3 may not be a valid region,please refer to https://aka.ms/maven_function_configuration#supported-regions for values. 3:  <azure.functions.maven.plugin.version>1.36.0</azure.functions.maven.plugin.version>
38 11
|
3月前
|
存储 Linux 数据安全/隐私保护
一键部署 200+ 开源Github 2k+ 星星的软件
Websoft9面板是一款基于Web的PaaS/Linux面板,支持在个人服务器上一键部署200多种热门开源应用,适用于个人开发者、中小企业、创业团队、教育机构和技术爱好者。它集成了丰富的开源软件,提供便捷的部署方式、高效的资源利用、良好的可扩展性及低技术门槛,帮助用户快速搭建和管理各类应用。
|
4月前
|
Linux Python
【Azure Function】Python Function部署到Azure后报错No module named '_cffi_backend'
ERROR: Error: No module named '_cffi_backend', Cannot find module. Please check the requirements.txt file for the missing module.
110 2
|
5月前
|
网络协议 开发工具 git
hexo github部署,通过域名访问你的博客
本文介绍了如何使用Hexo命令部署博客到GitHub,并详细说明了如何通过自定义域名访问GitHub上部署的博客。
hexo github部署,通过域名访问你的博客
|
6月前
|
搜索推荐 前端开发
使用VitePress创建个人网站并部署到GitHub
该网站使用 VitePress 构建,记录了前端开发相关的笔记和教程,涵盖 Vue2 和 Vue3 等内容。网站支持暗黑模式和 Algolia 搜索服务,提供了详细的导航和侧边栏配置。通过自动化脚本进行部署,托管于 GitHub Pages。
使用VitePress创建个人网站并部署到GitHub
|
6月前
|
JavaScript 搜索推荐 资源调度
使用VitePress静态网站生成器创建组件库文档网站并部署到GitHub
本文详细介绍了如何使用 Vue3、TypeScript 和 Vite 开发并发布一个名为 Vue Amazing UI 的组件库至 npm。文章首先引导读者安装配置 VitePress,创建文档网站,并编写组件库文档。接着,通过一系列配置实现网站主题定制、全局样式设置以及 Algolia 搜索功能集成。最后,文章提供了自动化脚本,帮助开发者一键打包部署静态网站至 GitHub,并发布组件库到 npm。通过这些步骤,读者可以轻松搭建并维护一个美观且功能齐全的组件库文档网站。
使用VitePress静态网站生成器创建组件库文档网站并部署到GitHub
|
6月前
|
资源调度 搜索推荐 Shell
使用VitePress静态网站生成器创建组件库文档网站并部署到GitHub
本文介绍了如何使用 Vue3、TypeScript 和 Vite 开发组件库并将其发布到 npm。文章详细描述了安装依赖、配置项目、创建文档网站以及编写组件文档的步骤。通过使用 VitePress,可以轻松搭建组件库的文档站点,并实现 Algolia 搜索功能。此外,还提供了自动化脚本用于部署静态网站至 GitHub 以及发布组件库到 npm。最后,展示了完整的目录结构和网站效果。
211 1
使用VitePress静态网站生成器创建组件库文档网站并部署到GitHub
|
6月前
|
JavaScript 前端开发
【Azure Developer】在App Service上放置一个JS页面并引用msal.min.js成功获取AAD用户名示例
【Azure Developer】在App Service上放置一个JS页面并引用msal.min.js成功获取AAD用户名示例
|
6月前
|
Java Maven
【Azure Function App】Java Function部署到Azure后出现中文显示乱码问题
【Azure Function App】Java Function部署到Azure后出现中文显示乱码问题
|
6月前
|
C++
【Azure Function App】在VS Code中,创建好Function App后部署到Azure中,无法选择Subscriptions
【Azure Function App】在VS Code中,创建好Function App后部署到Azure中,无法选择Subscriptions

热门文章

最新文章

  • 1
    MNN-LLM App:在手机上离线运行大模型,阿里巴巴开源基于 MNN-LLM 框架开发的手机 AI 助手应用
  • 2
    【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
  • 3
    微信小程序 app.json 配置文件解析与应用
  • 4
    【Azure App Service】基于Linux创建的App Service是否可以主动升级内置的Nginx版本呢?
  • 5
    【05】flutter完成注册页面完善样式bug-增加自定义可复用组件widgets-严格规划文件和目录结构-规范入口文件-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
  • 6
    原生鸿蒙版小艺APP接入DeepSeek-R1,为HarmonyOS应用开发注入新活力
  • 7
    【Azure Logic App】使用MySQL 新增行触发器遇见错误 :“Unknown column 'created_at' in 'order clause'”
  • 8
    【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
  • 9
    阿里云APP备案流程图以及备案所需材料整理,跟着教程一步步操作
  • 10
    【07】flutter完成主页-完成底部菜单栏并且做自定义组件-完整短视频仿抖音上下滑动页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈