使用资源库源代码创建功能工作负载

您可以通过 IBM Cloud® Code Engine 控制台或 CLI 直接从 Git 代码库中的源代码创建函数。

代码包是代表功能代码的文件集合。 该代码包被注入运行时容器。 您的代码包由 Code Engine 创建,并存储在容器注册表中或与函数内联。 代码捆绑包不是开放容器倡议(OCI)标准容器映像。

在这种情况下,Code Engine 从 Git 资源库源代码构建代码包,自动将代码包上传到容器注册表,然后创建函数来引用已构建的代码包。 您只需提供函数的名称、URL 至 Git 资源库,以及函数的运行时间。 在这种情况下,Code Engine 会为您管理命名空间。 但是,如果要使用不同的容器注册表,则必须为该容器注册表指定代码捆绑包和注册表密 码。

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

从控制台使用版本库源代码创建功能工作负载

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

  1. 打开 Code Engine 控制台。
  2. 选择“开始创建”。
  3. 从可用项目列表中选择一个项目。 您也可以 新建一个。 您必须选择一个项目才能创建功能。
  4. 选择“功能”。
  5. 输入函数名称;例如,myfunction。 为函数起一个在该项目中唯一的名称。
  6. 为功能代码选择运行时映像。 更多信息,请参阅 运行时
  7. 选择“从源代码构建代码包”。 选择该选项时,将从源代码中创建函数并将其存储在容器注册表中。
  8. 选择一个源代码库,例如 https://github.com/IBM/CodeEngine。 如果选择使用示例源,则不需要凭据,因此可以选择 None 进行代码库访问。 您可以选择提供一个分支名称。 如果没有提供分支名称,也没有填写该字段,Code Engine 会自动使用指定版本库的默认分支。 单击 下一步
  9. 选择构建策略和构建资源。 有关构建选项的更多信息,请参阅 规划构建。 单击下一步
  10. 选择容器注册表位置,如 IBM Registry Dallas,以指定构建输出映像的存储位置。 如果您的注册表是私人的,您必须 设置访问
  11. 提供注册表信息,说明在何处存储构建输出的映像。 选择一个现有的 Registry 密钥,或创建一个新的。 如果您要将映像构建到您账户中的 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-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

函数的名称。 请使用项目中唯一的名称。 此值为必填项。

  • 名称必须以小写字母开头。
  • 名称必须以小写字母数字字符结尾。
  • 名称必须少于或等于 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  
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 模块依赖关系的函数。 在这种情况下,源代码和软件包文件位于同一文件夹中。

  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 --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 --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 命令更新功能。 --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