使用儲存庫原始碼建立功能工作負載

您可以透過 IBM Cloud® Code Engine 主控台或 CLI,直接從 Git 套件庫中的原始碼建立函式。

程式碼束是代表您的函式碼的檔案集合。 這個程式碼束會注入到執行時容器中。 您的程式碼束由 Code Engine 建立,並儲存在容器註冊表或與函式內嵌。 程式碼束不是 Open Container Initiative (OCI) 標準的容器影像。

在這種情況下,Code Engine 從您的 Git 倉庫來源建立程式碼捆綁,自動將程式碼捆綁上傳到您的容器註冊表,然後創建您的函式以引用此建立的程式碼捆綁。 您只需要提供函數的名稱、URL 到 Git 儲存庫,以及函數的執行時間。 在這種情況下,Code Engine 會為您管理命名空間。 但是,如果要使用不同的容器註冊表,則必須指定該容器註冊表的代碼捆綁和註冊密碼。

如需存取影像註冊表所需權限的資訊,請參閱 設定影像註冊表的權限

從控制台使用儲存庫原始碼建立函式工作負載

從控制台建立有原始碼的函式。

  1. 開啟 Code Engine 控制台。
  2. 選擇「開始建立」。
  3. 請從可用專案清單中選取一個專案。 您也可以 建立一個新的。 您必須選擇專案才能建立函式。
  4. 選擇功能
  5. 輸入函數名稱;例如,myfunction。 請為您的函式取一個在該專案中具有唯一性的名稱。
  6. 為您的功能代碼選擇 Runtime 映像。 如需詳細資訊,請參閱 Runtimes
  7. 選取此選項,以從原始碼建立程式碼套件。 當您選擇此選項時,您的函式會從原始碼建立並儲存在容器註冊表中。
  8. 選擇來源儲存庫,例如 https://github.com/IBM/CodeEngine。 如果您選擇使用範例原始碼,您不需要要求憑證,因此您可以選擇 None存取 Code repo。 您可以選擇提供分支名稱。 如果您沒有提供分支名稱,也沒有填寫欄位,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 和記憶體組合 以及 Scale down 延遲
  14. 可選擇指定 自訂網域環境變數。 您可以稍後再新增這些選項。
  15. 按一下建立
  16. 功能狀態變為 Ready 之後,您就可以測試功能了。 按一下測試功能,然後按一下傳送請求。 若要在網頁中開啟功能,請按一下功能 URL
  17. 您也可以在編輯器視窗中變更功能代碼。 當您重新部署函式時,程式碼會內嵌儲存。

您可以按一下 Test function(測試函式),然後按一下 Send request(傳送請求 )來調用您的函式。

使用 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 函數建立後,您可以按一下控制台中的 Test function,或使用 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 建立您的本機原始碼,而您則發展您的功能原始碼開發。 然後,在程式碼捆綁成熟之後,您就可以更新您的函式,以引用您想要的特定程式碼捆綁。 您可以根據需要重複此過程。

尋找更多程式碼範例? 查看 Samples for IBM Cloud Code Engine GitHub repo