使用资源库源代码创建功能工作负载
您可以通过 IBM Cloud® Code Engine 控制台或 CLI 直接从 Git 代码库中的源代码创建函数。
代码包是代表功能代码的文件集合。 该代码包被注入运行时容器。 您的代码包由 Code Engine 创建,并存储在容器注册表中或与函数内联。 代码捆绑包不是开放容器倡议(OCI)标准容器映像。
在这种情况下,Code Engine 从 Git 资源库源代码构建代码包,自动将代码包上传到容器注册表,然后创建函数来引用已构建的代码包。 您只需提供函数的名称、URL 至 Git 资源库,以及函数的运行时间。 在这种情况下,Code Engine 会为您管理命名空间。 但是,如果要使用不同的容器注册表,则必须为该容器注册表指定代码捆绑包和注册表密 码。
有关访问图像注册表所需权限的信息,请参阅 为图像注册表设置权限。
从控制台使用版本库源代码创建功能工作负载
从控制台创建带源代码的函数。
- 打开 Code Engine 控制台。
- 选择“开始创建”。
- 从可用项目列表中选择一个项目。 您也可以 新建一个。 您必须选择一个项目才能创建功能。
- 选择“功能”。
- 输入函数名称;例如,
myfunction。 为函数起一个在该项目中唯一的名称。 - 为功能代码选择运行时映像。 更多信息,请参阅 运行时。
- 选择“从源代码构建代码包”。 选择该选项时,将从源代码中创建函数并将其存储在容器注册表中。
- 选择一个源代码库,例如
https://github.com/IBM/CodeEngine。 如果选择使用示例源,则不需要凭据,因此可以选择None进行代码库访问。 您可以选择提供一个分支名称。 如果没有提供分支名称,也没有填写该字段,Code Engine 会自动使用指定版本库的默认分支。 单击 下一步。 - 选择构建策略和构建资源。 有关构建选项的更多信息,请参阅 规划构建。 单击下一步。
- 选择容器注册表位置,如
IBM Registry Dallas,以指定构建输出映像的存储位置。 如果您的注册表是私人的,您必须 设置访问。 - 提供注册表信息,说明在何处存储构建输出的映像。 选择一个现有的 Registry 密钥,或创建一个新的。 如果您要将映像构建到您账户中的 Container Registry 实例,您可以选择
Code Engine managed secret,让 Code Engine 为您创建和管理秘密。 - 为图片选择命名空间、名称和标签。 如果要将映像构建到账户中的 IBM Cloud Container Registry 实例,可以选择现有的命名空间,或让 Code Engine 为您创建和管理命名空间。 如需其他帮助,请单击帮助我指定代码包。 有关详细信息,请参阅 访问容器注册表。
- 指定资源信息,包括 CPU 和内存组合 以及 缩放延迟。
- 可选择指定 自定义域 或 环境变量。 您可以稍后添加这些选项。
- 单击创建。
- 功能状态变为就绪后,即可测试功能。 单击测试功能,然后单击发送请求。 要在网页中打开功能,请单击功能 URL。
- 您还可以在编辑器窗口中更改功能代码。 当您重新部署函数时,代码将以内联方式存储。
点击“测试功能”,然后点击“发送请求”,即可调用您的功能。
使用 CLI 创建带有资源库源代码的功能工作负载
使用 function create 命令从 Git 代码库源代码中构建代码捆绑包,并创建函数来引用已构建的代码捆绑包。 有关选项的完整列表,请参阅 ibmcloud ce function create 命令。
准备工作
- 设置 Code Engine CLI 环境。
- 创建项目并开展工作。
以下示例 function create 命令创建了 myfun 函数,该函数引用了位于 https://github.com/IBM/CodeEngine 中的代码。 该命令会自动构建代码包,并将其上传到您账户中的 IBM Cloud® Container Registry 命名空间。 该函数引用该内置代码包。 通过指定 --build-context-dir 选项,编译会使用 helloworld-samples/function-codebundle-nodejs 目录中的源代码。
ibmcloud ce function create --name myfun --runtime nodejs --build-source https://github.com/IBM/CodeEngine --build-context-dir /helloworld-samples/function-codebundle-nodejs
示例输出
Preparing function 'myfun' for build push...
Creating function 'myfun'...
Submitting build run 'myfun-run-230111-111212718'...
Creating image 'icr.io/ce--abcde-glxo4kabcde/function-myfun:230111-1532-vwo4o'...
Waiting for build run to complete...
Build run status: 'Running'
Build run completed successfully.
Run 'ibmcloud ce buildrun get -n myfun-run-230111-111212718' to check the build run status.
Waiting for function 'myfun' to become ready...
Function 'myfun' is ready.
OK
Run 'ibmcloud ce function get -n myfun' to see more details.
https://myfun.11a66hbi3rhz.us-south.codeengine.appdomain.cloud
注意 function create 命令的输出提供了函数创建前构建运行的进度信息。
在本例中,已构建的代码捆绑包被上传到 Container Registry 中的 ce--abcde-4svg40kna19 命名空间。
下表总结了本例中与 function create 命令中使用的选项。 有关该命令及其选项的更多信息,请参阅 ibmcloud ce function create 命令。
| 选项 | 描述 |
|---|---|
--name |
函数的名称。 请使用项目中唯一的名称。 此值为必填项。
|
--build-source |
包含源代码的 Git 资源库的 URL;例如,https://github.com/IBM/CodeEngine。 |
--build-context-dir |
版本库中包含代码的目录。 此值是可选的。 |
--runtime |
该函数的运行时间。 |
下面的输出显示了 function get 命令的结果,包括构建信息。
示例输出
Getting function 'myfun'
'...
OK
Name: myfun
Project Name: sample
Project ID: abcdefgh-abcd-abcd-abcd-1a2b3c4d5e6f
Age: 27m
Created: 2023-06-27T21:07:26Z
Visibility: public
URL: https://myfun.13c66hbi3rhz.us-south.codeengine.appdomain.cloud
Internal URL: http://myfun.13c66hbi3rhz.function.cluster.local
Resources:
CPU: 0.25
Memory: 500M
Timeout: 60 seconds
Scale Down Delay: 1 seconds
Trusted profiles: disabled
Environment Variables:
Type Name Value
Literal CE_API_BASE_URL https://api.us-south.codeengine.cloud.ibm.com
Literal CE_DOMAIN us-south.codeengine.appdomain.cloud
Literal CE_FUNCTION myfun
Literal CE_REGION us-south
Literal CE_SUBDOMAIN 13c66hbi3rhz
Literal CE_PROJECT_ID abcdefgh-abcd-abcd-abcd-1a2b3c4d5e6f
Build Information:
Build Run Name: myfun-run-230111-111212718
Build Type: git
Build Strategy: codebundle-nodejs-22
Timeout: 600
Source: https://github.com/IBM/CodeEngine
Context Directory: /helloworld-samples/function-codebundle-nodejs
Build Run Status: Succeeded
Build Run Reason: All Steps have completed executing
Run 'ibmcloud ce buildrun get -n myfun-run-230111-111212718' for details.
Function Code:
Runtime: nodejs-22
Bundle Secret: ce-auto-icr-us-south
Code Bundle: cr://icr.io/ce--abcde-glxo4kabcde/function-myfun:230111-1532-vwo4o
Main: main
Status: Ready
URL: https://myfun.13c66hbi3rhz.us-south.codeengine.appdomain.cloud
现在您的函数已从版本库源代码中创建,您可以使用 ibmcloud ce function update 命令更新函数,以满足您的需要。 --build-source 如果要更新源代码以便与函数一起使用,必须在 function update 选项。
使用 CLI 从版本库源代码或 本地源代码 创建功能时,生成的构建运行并不基于构建配置。 已完成的构建运行最终会被自动删除。 如果构建运行成功,不基于构建配置的构建运行会在 1 小时后被删除。 如果构建运行不成功,该构建运行将在 24 小时后删除。 您只能通过 CLI 显示此构建运行的相关信息。 您无法在控制台中查看此构建运行。
为函数添加依赖项
您可以使用多种不同的编程语言创建函数。 当函数代码变得复杂时,可以添加代码模块作为函数的依赖项。 每种语言都有自己的模块,可与功能代码一起使用。 例如,Node.js 依赖的通常是现有的 npm 模块,而 Python 则使用 Python 软件包。 这些依赖项必须在源代码文件中声明和创建
包括 Node.js 功能的模块
通过创建 package.json 文件,创建一个包含特定 Node.js 模块依赖关系的函数。 在这种情况下,源代码和软件包文件位于同一文件夹中。
-
将代码写入
main.js文件,创建源代码。 例如,将以下代码示例复制到名为main.js的文件中。/** * The `main` function is the entry-point into the function. * It has one optional argument, which carries all the * parameters the function was invoked with. */ function main(params /* optional */) { // use third-party 'lorem-ipsum' package to generate random words const LoremIpsum = require("lorem-ipsum").LoremIpsum; const lorem = new LoremIpsum(); // Since functions are invoked through http(s), we return an HTTP response. return { headers: { "Content-Type": "text/plain;charset=utf-8" }, body: lorem.generateWords(10), }; } // This step is necessary, if you gave your main function a different name. // We include it here for documentation purposes only. module.exports.main = main; -
创建
package.json文件,其中包含函数所需的依赖项。 对于前面的代码示例,package.json文件的内容如下。{ "name": "function", "version": "1.0.0", "main": "main.js", "dependencies" : { "lorem-ipsum" : "2.0.8" } } -
在 Code Engine 中以函数形式创建文件。 之前的两个文件都必须可以在版本库中访问。 如果是在私有存储库中,则创建 私人代码库访问,然后通过
--build-git-repo-secret选项提供该值。 如果文件位于 main 目录之外的其他目录,请使用--build-context-dir选项提供该目录的路径。 下面的示例从https://github.com/IBM/CodeEngine公共存储库中提取文件。ibmcloud ce fn create -n nodelorem -runtime nodejs --build-source https://github.com/IBM/CodeEngine --build-context-dir /helloworld-samples/function-codebundle-nodejs/ -
运行提供的
fn get命令,查找有关功能的详细信息。 -
将 URL 粘贴到网络浏览器中,调用您的函数。 您的浏览器会显示一段
lorem ipsum。
有关 fn create 命令及其选项的更多信息,请参阅 创建函数。
包括 Python 功能的模块
通过创建 requirements.txt 文件,创建一个包含特定 Python 模块依赖关系的函数。 在这种情况下,源代码和需求文件位于同一个文件夹中。
-
将代码保存到
__main__.py文件中,创建函数# use third-party 'lorem-ipsum' package to generate random words from lorem_text import lorem # The `main` function is the entry-point into the function. # It has one optional argument, which carries all the # parameters the function was invoked with. def main(params): words = 10 # since functions are invoked through http(s), we return an HTTP response return { "headers": { "Content-Type": "text/plain;charset=utf-8", }, "body": lorem.words(words), } def main(params): words = 10 return { "headers": { "Content-Type": "text/plain;charset=utf-8", }, "body": lorem.words(words), } -
创建
requirements.txt,其中包含函数所需的依赖项lorem-text -
在 Code Engine 中以函数形式创建文件。 之前的两个文件都必须可以在版本库中访问。 如果是在私有存储库中,则创建 私人代码库访问,然后通过
--build-git-repo-secret选项提供该值。 如果文件位于 main 目录之外的其他目录,请使用--build-context-dir选项提供该目录的路径。 下面的示例从https://github.com/IBM/CodeEngine公共存储库中提取文件。ibmcloud ce fn create -n pylorem -runtime python --build-source https://github.com/IBM/CodeEngine --build-context-dir /helloworld-samples/function-codebundle-python/ -
运行提供的
fn get命令,查找有关功能的详细信息。 -
将 URL 粘贴到网络浏览器中,调用您的函数。 您的浏览器会显示一段
lorem ipsum。
有关 fn create 命令及其选项的更多信息,请参阅 创建函数。
后续步骤
-
URL 创建函数后,您可以通过点击控制台中的测试函数或使用
function get命令访问您的函数。 -
您可以创建 自定义域映射,并将其分配给您的功能。
-
创建并部署函数后,您可以通过控制台或使用
ibmcloud ce function update命令更新功能。--build-source如果要更新源代码以便与函数一起使用,必须在function update选项。
创建函数后,您可以通过以下任何一种方式更新函数及其引用代码,与创建或更新函数的方式无关:
-
如果您有一个现有的代码捆绑包,那么您只需提供对映像的引用,该引用会在您部署应用程序时指向容器注册表的位置。 有关更多信息,请参阅 从现有代码包创建功能工作负载。
如果您使用
function create命令创建了函数,并指定了--build-source选项从本地或资源库源代码构建代码包,如果想更改函数以指向不同的代码包,则必须先从函数中移除构建的关联。 例如,运行ibmcloud ce function update -n FUN_NAME --build-clear。 从函数中移除构建的关联后,就可以更新函数以引用不同的图像。 -
如果您使用的是 Git 代码库中的源代码,您可以选择让 Code Engine 从源代码中构建代码包,只需一次操作即可创建函数。 在这种情况下,Code Engine 将您的代码捆绑包上传到 IBM Cloud® Container Registry。 要了解更多信息,请参阅 从版本库源代码创建功能。
-
如果您使用的是本地工作站上的源代码,您可以选择 Code Engine 从源代码中构建代码包,并使用单个 CLI 命令创建功能。 在这种情况下,Code Engine 将您的源代码和代码包上传到 IBM Cloud® Container Registry。
例如,您可能会选择 Code Engine 来构建本地源代码,同时继续开发功能源代码。 然后,在代码捆绑成熟后,您可以更新您的函数,以引用您想要的特定代码捆绑。 您可以根据需要重复这一过程。
想了解更多代码示例? 查看 样本 IBM Cloud Code Engine GitHub repo。