使用儲存庫原始碼建立功能工作負載
您可以透過 IBM Cloud® Code Engine 主控台或 CLI,直接從 Git 套件庫中的原始碼建立函式。
程式碼束是代表您的函式碼的檔案集合。 這個程式碼束會注入到執行時容器中。 您的程式碼束由 Code Engine 建立,並儲存在容器註冊表或與函式內嵌。 程式碼束不是 Open Container Initiative (OCI) 標準的容器影像。
在這種情況下,Code Engine 從您的 Git 倉庫來源建立程式碼捆綁,自動將程式碼捆綁上傳到您的容器註冊表,然後創建您的函式以引用此建立的程式碼捆綁。 您只需要提供函數的名稱、URL 到 Git 儲存庫,以及函數的執行時間。 在這種情況下,Code Engine 會為您管理命名空間。 但是,如果要使用不同的容器註冊表,則必須指定該容器註冊表的代碼捆綁和註冊密碼。
如需存取影像註冊表所需權限的資訊,請參閱 設定影像註冊表的權限。
從控制台使用儲存庫原始碼建立函式工作負載
從控制台建立有原始碼的函式。
- 開啟 Code Engine 控制台。
- 選擇「開始建立」。
- 請從可用專案清單中選取一個專案。 您也可以 建立一個新的。 您必須選擇專案才能建立函式。
- 選擇功能。
- 輸入函數名稱;例如,
myfunction。 請為您的函式取一個在該專案中具有唯一性的名稱。 - 為您的功能代碼選擇 Runtime 映像。 如需詳細資訊,請參閱 Runtimes。
- 選取此選項,以從原始碼建立程式碼套件。 當您選擇此選項時,您的函式會從原始碼建立並儲存在容器註冊表中。
- 選擇來源儲存庫,例如
https://github.com/IBM/CodeEngine。 如果您選擇使用範例原始碼,您不需要要求憑證,因此您可以選擇None來存取 Code repo。 您可以選擇提供分支名稱。 如果您沒有提供分支名稱,也沒有填寫欄位,Code Engine 會自動使用指定儲存庫的預設分支。 按下一步。 - 為您的建置選擇策略,並為您的建置選擇資源。 有關建立選項的詳細資訊,請參閱 規劃建立。 按下一步。
- 選擇容器註冊表位置,例如
IBM Registry Dallas,指定儲存建立輸出映像的位置。 如果您的註冊表是私人的,您必須 設定存取權限。 - 提供有關儲存建立輸出映像的註冊資訊。 選擇現有的 Registry 機密,或建立一個新的。 如果您要將圖像建置到您帳戶中的 Container Registry 範例,您可以選擇
Code Engine managed secret,讓 Code Engine 為您建立和管理秘密。 - 為您的圖片選擇命名空間、名稱和標籤。 如果您要建立映像到您帳戶中的 IBM Cloud Container Registry 範例,您可以選擇現有的命名空間,或讓 Code Engine 為您建立和管理命名空間。 如需其他幫助,請按一下 「幫我指定代碼束」。 如需詳細資訊,請參閱 存取容器登錄。
- 指定您的資源資訊,包括 CPU 和記憶體組合 以及 Scale down 延遲。
- 可選擇指定 自訂網域 或 環境變數。 您可以稍後再新增這些選項。
- 按一下建立。
- 功能狀態變為 Ready 之後,您就可以測試功能了。 按一下測試功能,然後按一下傳送請求。 若要在網頁中開啟功能,請按一下功能 URL。
- 您也可以在編輯器視窗中變更功能代碼。 當您重新部署函式時,程式碼會內嵌儲存。
您可以按一下 Test function(測試函式),然後按一下 Send request(傳送請求 )來調用您的函式。
使用 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 函數建立後,您可以按一下控制台中的 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。