使用存储库源代码创建函数工作负载
您可以从 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
,以指定在何处存储构建输出的映像。 如果您的注册表是专用注册表,那么必须 设置对其的访问权。 - 提供有关在何处存储构建输出的映像的注册表信息。 选择现有的注册表机密或创建一个新的注册表机密。 如果要将映像构建到帐户中的 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-nodejs
目录中的源。
ibmcloud ce function create --name myfun --runtime nodejs-20 --build-source https://github.com/IBM/CodeEngine --build-context-dir /helloworld-samples/function-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 |
函数的名称。 请使用项目中唯一的名称。 此值是必需的。 -名称必须以小写字母开头。 -名称必须以小写字母数字字符结尾。 -名称必须不超过 63 个字符,并且可以包含字母,数字和连字符 (-)。 |
--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
URL: https://myfun.13c66hbi3rhz.us-south.codeengine.test.appdomain.cloud
Status: Ready
Resources:
CPU: 0.25
Memory: 500M
Max Execution Time: 60 seconds
Build Information:
Build Run Name: myfun-run-230111-111212718
Build Type: git
Build Strategy: codebundle-nodejs-20
Timeout: 600
Source: https://github.com/IBM/CodeEngine
Context Directory: /helloworld-samples/function-nodejs
Build Run Summary: Succeeded
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-20 (managed)
Bundle Secret: ce-auto-icr-us-south
Code Bundle: cr://icr.io/ce--abcde-glxo4kabcde/function-myfun:230111-1532-vwo4o
Main: main()
既然您的函数是从存储库源代码创建的,那么可以使用 ibmcloud ce function update
命令更新该函数以满足您的需求。 如果要更新源以用于功能,那么必须在 function update
命令上提供
--build-source
选项。
使用 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-20 --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-3.11 --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
命令更新函数以满足您的需求。 如果要更新源以用于功能,那么必须在function update
命令上提供--build-source
选项。
创建函数后,您可以使用以下 任何 方法来更新函数及其引用的代码,而与您创建或先前更新函数的方式无关:
-
如果您有现有代码束,那么只需要提供对映像的引用,该引用指向部署应用程序时容器注册表的位置。 有关更多信息,请参阅 从现有代码束创建函数工作负载。
如果使用
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 存储库。