IBM Cloud Docs
使用存储库源代码创建函数工作负载

使用存储库源代码创建函数工作负载

您可以从 IBM Cloud® Code Engine 控制台或使用 CLI 直接从位于 Git 存储库中的源代码创建函数。

代码束是表示函数代码的文件的集合。 此代码束将注入到运行时容器中。 代码束由 Code Engine 创建,并存储在容器注册表中或与函数直接插入。 代码束不是开放式容器计划 (OCI) 标准容器映像。

在此场景中,Code Engine 从 Git 存储库源构建代码束,自动将代码束上载到容器注册表,然后创建函数以引用此构建的代码束。 您只需为函数提供一个名称、URL 到 Git 存储库的链接以及函数的运行时。 在这种情况下,Code Engine 将为您管理命名空间。 但是,如果要使用其他容器注册表,那么必须为该容器注册表指定代码束和注册表私钥。

有关访问映像注册表所需的许可权的信息,请参阅 设置映像注册表的权限

使用控制台中的存储库源代码创建函数工作负载

从控制台创建具有源代码的函数。

  1. 打开 Code Engine 控制台。
  2. 选择 让我们开始
  3. 选择功能
  4. 输入函数的名称,例如 myfunction。 为您的功能起一个在项目中独一无二的名称。
  5. 从可用项目列表中选择一个项目。 您还可以 创建新的。 您必须选择项目以创建函数。
  6. 为函数代码选择 运行时映像。 有关更多信息,请参阅 运行时
  7. 选择从源代码生成代码包。 选择此选项时,将根据源代码创建函数并将其存储在容器注册表中。
  8. 选择源存储库,例如 https://github.com/IBM/CodeEngine。 如果选择使用样本源,那么不需要凭证,因此可以选择 None 作为 代码存储库访问权。 您可以选择提供分支名称。 如果未提供分支名称,并且将该字段留空,那么 Code Engine 将自动使用指定存储库的缺省分支。 单击 下一步
  9. 选择构建的策略和构建的资源。 有关构建选项的更多信息,请参阅 规划构建。 单击下一步
  10. 选择容器注册表位置,例如 IBM Registry Dallas,以指定在何处存储构建输出的映像。 如果您的注册表是专用注册表,那么必须 设置对其的访问权
  11. 提供有关在何处存储构建输出的映像的注册表信息。 选择现有的注册表机密或创建一个新的注册表机密。 如果要将映像构建到帐户中的 Container Registry 实例,那么可以选择 Code Engine managed secret 并让 Code Engine 为您创建和管理私钥。
  12. 为映像选择名称空间,名称和标记。 如果要将映像构建到帐户中的 IBM Cloud Container Registry 实例,那么可以选择现有名称空间,或者让 Code Engine 为您创建并管理名称空间。 要获取其他帮助,请单击 帮助我指定代码束。 有关更多信息,请参阅 访问容器注册表
  13. 指定资源信息,包括 CPU 和内存组合缩放延迟
  14. (可选) 指定 定制域环境变量。 您可以稍后添加这些选项。
  15. 单击创建
  16. 在功能状态更改为 就绪后,您可以测试功能。 单击 测试功能,然后单击 发送请求。 要在网页中打开该功能,请点击功能 URL
  17. 您还可以在“编辑器”窗口中更改函数代码。 重新部署函数时,将以内联方式存储代码。

您可以通过单击 测试函数,然后单击 发送请求来调用函数。

使用 CLI 通过存储库源代码创建函数工作负载

使用 function create 命令可从 Git 存储库源构建代码束,并创建函数以引用此构建的代码束。 有关选项的完整列表,请参阅 ibmcloud ce function create 命令。

准备工作

以下示例 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 模块依赖关系的函数。 在这种情况下,源代码和包文件都位于同一文件夹中。

  1. 通过将代码写入 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;
    
  2. 创建包含函数的必需依赖关系的 package.json 文件。 对于先前的代码示例,请对 package.json 文件使用以下内容。

    {
      "name": "function",
      "version": "1.0.0",
      "main": "main.js",
      "dependencies" : {
    		    "lorem-ipsum" : "2.0.8"
     	}
    }
    
  3. 在 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/
    
  4. 运行提供的 fn get 命令以查找有关功能的详细信息。

  5. 将 URL 粘贴到浏览器中即可调用您的功能。 您的浏览器显示 lorem ipsum 的段落。

有关 fn create 命令及其选项的更多信息,请参阅 创建函数

包含 Python 函数的模块

通过创建 requirements.txt 文件来创建包含特定 Python 模块依赖关系的函数。 在这种情况下,源代码和需求文件都位于同一文件夹中。

  1. 通过将代码保存到 __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),
          }
    
  2. 创建包含函数的必需依赖关系的 requirements.txt

    lorem-text
    
  3. 在 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/
    
  4. 运行提供的 fn get 命令以查找有关功能的详细信息。

  5. 将 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 存储库