前言
首先介绍下在本文出现的几个比较重要的概念:
函数计算(Function Compute): 函数计算是一个事件驱动的服务,通过函数计算,用户无需管理服务器等运行情况,只需编写代码并上传。函数计算准备计算资源,并以弹性伸缩的方式运行用户代码,而用户只需根据实际代码运行所消耗的资源进行付费。函数计算更多信息 参考。
Fun: Fun 是一个用于支持 Serverless 应用部署的工具,能帮助您便捷地管理函数计算、API 网关、日志服务等资源。它通过一个资源配置文件(template.yml),协助您进行开发、构建、部署操作。Fun 的更多文档 参考。
备注: 本文介绍的技巧需要 Fun 版本大于等于 3.0.0+。
Fun Build 是什么,为什么需要 Fun Build?
在很多场景,源码距离交付物其实是有一定的距离,比如 java,写完 java 代码后,还要考虑如何编译、打包的问题。而对于函数计算来说,由于其只能接受一个 zip 或 jar 包,我们还要想一些方法,将我们的代码编译产物及其依赖一同打包的一个 jar 中,然后交付。
Fun Build 的职责就是完成从源码到交付产物的构建过程。
Fun Build 功能介绍
使用 fun build -h 可以查看 build 的帮助文档:
$ fun build -h
Usage: fun build [options] [[service/]function]
Build the dependencies.
Options:
-u, --use-docker Use docker container to build functions
-t, --template [template] path of fun template file.
-h, --help output usage information
最简单的使用方法是直接使用 fun build,如果想编译某个函数,可以使用 fun build serviceName/functionName 或者 fun build functionName。
默认情况下,fun build 构建时,是直接在宿主机上构建的,如果想避免因为环境差异带来的部署后的不兼容问题,可以在 build 时,指定 -u 或者 --use-docker 参数,表示会在本地使用函数计算模拟环境进行编译。
如果 template.yml 不在当前目录,可以通过 fun build -t templatePath
的方式指定。
Fun Build 的行为是将 template.yml 中列出的函数进行构建(不指定具体函数,则默认编译所有函数)。
使用示例
# 使用 fun build 对所有函数进行构建
fun build
# 使用 fun build 并且以本地模拟环境对所有函数进行构建
fun build --use-docker
# 使用 fun build 进行构建,构建完成后,立刻进行调用
fun build && fun local invoke
# 使用 fun build 进行构建,构建完成后,立刻进行部署
fun build && fun deploy
Fun Build 构建流程
Fun Build 的构建流程可以理解为,去函数代码目录查找特定的 manifest 文件(清单文件),然后根据这些 manifest 文件进行特定的构造、依赖下载、编译等操作。
目前 Fun 针对不同的语言分别提供了一些其主流的包管理器 manifest 文件的支持
- Fun 本身定义的不限语言的 [Funfile]()
- java maven 包管理器的 pom.xml
- node npm 包管理器的 package.json
- python pip 包管理器的 requirements.txt
- php composer 包管理器的 composer.json
比如,我这里有一个包含 php7.2、python2.7、python3、nodejs6、nodejs8、java8 的示例 template.yml 。
// 省略部分属性配置 ... ...
Resources:
localdemo:
Type: 'Aliyun::Serverless::Service'
php72:
Type: 'Aliyun::Serverless::Function'
Properties:
Runtime: php7.2
// 省略其它属性配置 ... ...
python27:
Type: 'Aliyun::Serverless::Function'
Properties:
Runtime: python2.7
// 省略其它属性配置 ... ...
python3:
Type: 'Aliyun::Serverless::Function'
Properties:
Runtime: python3
// 省略其它属性配置 ... ...
nodejs6:
Type: 'Aliyun::Serverless::Function'
Properties:
Runtime: nodejs6
// 省略其它属性配置 ... ...
nodejs8:
Type: 'Aliyun::Serverless::Function'
Properties:
Runtime: nodejs8
// 省略其它属性配置 ... ...
java8:
Type: 'Aliyun::Serverless::Function'
Properties:
Runtime: java8
// 省略其它属性配置 ... ...
当执行 fun build
时,会对这些函数依次进行构建,构建的产物,会被存放到项目根目录的 .fun/build/artifacts/
目录。
Build 示例
Java 示例
下面是一个初始化、构建、运行、修改、构建、运行的 java 示例:
总结
使用 Fun Build 可以直接实现从源码到交付产物的构建过程,节省用户的配置成本。