應用中心內建了自訂工作範本,用於執行使用者自訂的流水線邏輯。本文介紹自訂工作範本的實現原理、描述樣本和使用方法。
實現原理
應用中心在任務執行階段,按照RunnerConfig的描述,為使用者部署任務節點(TaskWorker),並將執行內容資訊作為payload的一部分,傳入任務節點。任務節點在收到payload後,會按照Steps定義的步驟進行執行。
使用者通過在執行內容中定義RunnerConfig以及Steps,完成對任務節點邏輯的自訂。
自訂工作範本描述樣本
以下是自訂工作範本的描述樣本。通過在spec.worker.presetWorker中指定預置的serverless-runner,可以讓執行引擎調度相應的任務節點,並在此節點上運行使用者自訂的步驟。
kind: TaskTemplate
name: serverless-runner-task
description: ''
createdTime: '2023-04-11T08:43:58Z'
deletionTime:
generation: 0
labels:
source: system
resourceVersion: 0
spec:
description: |-
Run customized scripts on a serverless runner.
在Serverless執行個體上運行自訂地指令碼。
worker:
# 指定runner類型為應用中心預置的serverless-runner。
# serverless-runner的執行引擎會識別runnerConfig以及steps參數。
presetWorker: serverless-runner
executeCondition:
# 在執行內容中,運算式enable == true的時候才會執行。
expression: enable == true
contextSchema: {}在流水線模板中使用自訂工作範本的樣本
自訂工作範本可以在流水線模板中使用。使用樣本如下。
kind: PipelineTemplate
name: demo-template
spec:
context:
data:
deployFile: s.yaml
# 自訂任務節點部署配置。如果不指定,將在應用中心的某個沙箱環境中執行。
# 此處設定的runnerConfig將會影響模板中定義的所有任務。
# runnerConfig:
# 指定在新加坡地區部署。
# regionId: ap-southeast-1
# 日誌搜集配置。運行時產生的日誌將會投遞到指定SLS日誌庫中。
# logConfig:
# logstore: function-log
# project: my-project
# 網路設定。啟動並執行網路VPC資訊。
# vpcConfig:
# securityGroupId: xxx
# vSwitchIds: ["xxx"]
# vpcId: xxx
# 運行規格。採用1核2 GB的計算執行個體。
# cpu: 1
# memory: 2048
# 服務端逾時時間。此處設定為15分鐘。
# timeout: 900
# 運行在Debug模式。runner對應的FC函數在短時間內不會被回收。一般不建議開啟Debug模式。
# debugMode: true
# 任務節點的環境變數配置。
# environmentVariables:
# DEBUG: '*'
tasks:
# 構建並部署。
- name: build-and-deploy
context:
data:
# 開啟任務執行,預設關閉。
enable: true
# 同樣可以在此處聲明或修改runnerConfig。
# runnerConfig:
# 執行步驟。下述步驟將會採用開源專案serverless-cd提供的engine進行執行。
steps:
# 第一步,checkout代碼。
# 這裡採用了plugin機制,運行serverless-cd社區的外掛程式。
# @serverless-cd/checkout是一個社區提供的外掛程式,它會將代碼checkout到預設路徑。
# Function Compute會陸續為社區提供更多的外掛程式。
- plugin: '@serverless-cd/checkout'
- run: |
echo "Setup Serverless Devs ing..."
# 開啟偵錯模式,將命令輸出。
set -x
ls -al
# aliyun cloud authentication infos.
access_key_id=${{ sts.accessKeyId || "dummy-ak" }}
access_key_secret=${{ sts.accessKeySecret || "dummy-sk" }}
security_token=${{ sts.securityToken || "dummy-token" }}
uid=${{ uid || "dummy-uid" }}
# account info alias
alias=my-account
s --version
if [[ $? -ne 0 ]]; then
echo "Serverless Devs is not installed."
exit 1
fi
s config add --AccessKeyID "${access_key_id}" --AccessKeySecret "${access_key_secret}" \
--AccountID "${uid}" --SecurityToken "${security_token}" --access "${alias}" -f
if [[ $? -ne 0 ]]; then
echo "Failed to setup Serverless Devs."
exit 1
fi
echo "Setup Serverless Devs success."
# 執行s-deploy。
- run: |
echo "Deploy by Serverless Devs ing..."
set -x
alias=my-account
deploy_file=${{ ctx.data.deployFile || "" }}
if [[ -z "${deploy_file}" ]]; then
if [[ -f "s.yaml" ]]; then
deploy_file="s.yaml"
elif [[ -f "s.yml" ]]; then
deploy_file="s.yml"
fi
fi
if [[ ! -f "${deploy_file}" ]]; then
echo "Failed to find s.yaml file."
exit 1
fi
echo "s.yaml file location: ${deploy_file}"
s deploy --access "${alias}" -t "${deploy_file}" --use-local --assume-yes --skip-push
echo "Deploy by Serverless Devs success."
# 工作範本指定為內建的模板serverless-runner-task。
taskTemplate: serverless-runner-task
# 執行順序。不依賴任何任務,立刻執行。
runAfters: []
---使用RunnerConfig描述任務節點
以下情境中,使用者需要自訂RunnerConfig,來定義CI/CD運行環境。
代碼倉庫在GitHub,將節點部署到中國內地以外的地區,以解決拉取不到代碼導致構建失敗的問題。
提升任務節點的規格,以解決記憶體不足或構建速度慢的問題。
通過鏡像自訂構建環境,以解決構建環境時無法找到依賴的問題。
在自己的VPC內構建,以解決私人資源擷取不到的問題。
如果指定了RunnerConfig,任務節點將按照描述部署在當前帳號下。如果不指定RunnerConfig,任務節點將部署在阿里雲沙箱環境。
RunnerConfig的定義如下。
參數 | 類型 | 說明 | 是否必填 | 參考值 |
regionID | String | 部署任務節點到指定的地區,預設為cn-shanghai。 | 否 | cn-shanghai |
logConfig | 收集任務節點日誌到Log ServiceSLS。 | 否 | 請參見LogConfig | |
vpcConfig | 部署任務節點到指定的VPC。 | 否 | 請參見VPCConfig | |
nasConfig | 將NAS掛載到任務節點檔案目錄。 | 否 | 請參見NASConfig | |
serviceRole | String | 指定部署任務節點和執行步驟的RAM角色。預設為 | 否 | acs:ram::198613743****:role/fc-public-test |
internetAccess | Boolean | 配置任務節點的訪問公網的能力。預設開啟此功能。 | 否 | true |
timeout | Integer | 配置任務節點的逾時時間。預設為900秒,最大為3000秒。 | 否 | 900 |
cpu | Float | 配置任務節點的CPU規格。預設為1核。 | 否 | 1 |
memory | Integer | 配置任務節點的記憶體規格。預設為2048 MB。 | 否 | 2048 |
environmentVariables | Map<String, String> | 為任務節點指定環境變數配置。 | 否 | |
debugMode | Boolean | Debug模式。開啟此模式時,將禁用Runner的即時GC,用於排查問題。 | 否 | true |
使用Steps描述任務節點執行
使用者需要通過定義Steps,描述任務節點執行。Steps是一個數組,執行引擎會按順序執行每一個Step,每一個Step都是執行引擎的獨立子進程。
命令類型Step
命令類型Step可以讓使用者使用Shell命令描述構建行為。Shell命令支援模板文法,可以通過分割符['${{', '}}']來擷取上下文中的變數。例如,列印當前執行內容中的應用程式名稱,可以通過echo ${{ ctx.data.appName }}實現。
需要特別說明的是,分割符['${{', '}}']與Shell命令中的$文法沒有關係。在run命令中,使用${{ key }}與${key}具有完全不同的含義,前者是通過模板文法從當前執行內容中擷取變數,後者是通過Shell文法擷取當前進程中的變數,包括環境變數。
上下文資料結構如下。
參數 | 類型 | 說明 | 參考值 |
ctx | Object | 執行引擎傳遞給任務的執行內容。 | |
uid | String | 阿里雲帳號ID。 | 198613743**** |
requestId | String | 當前處理的請求ID。 | 94AB79CA-624B-4FBE-89BC-0F94BC1E1E15 |
sts | Object | 阿里雲STS臨時授權資訊,用於調用雲端服務。其許可權由RunnerConfig.serviceRole指定。 | |
pipeline | Object | 當前流水線的詳情。 | 請參見Pipeline |
task | Object | 當前任務的詳情。 | 請參見Task |
Steps的資料結構如下。
參數 | 類型 | 說明 | 是否必填 | 參考值 |
run | String | 當前步驟啟動並執行Shell命令。 | 是 | make setup |
id | String | 步驟ID,用於唯一標識當前步驟。 | 否 | s-setup |
env | Map<String, String> | 當前步驟的環境變數。 | 否 | |
working-directory | String | 執行當前步驟命令的路徑,支援相對路徑。預設為engine進程當前路徑。 | 否 | ./ |
continue-on-error | Boolean | 是否忽略執行異常,預設不允許忽略執行異常。取值說明如下:
| 否 | false |
if | String | 條件執行運算式。如果執行結果為true,則繼續執行此步驟,否則忽略此步驟。 | 否 | |
外掛程式類型Step
外掛程式由應用中心官方維護。將重複和繁瑣的構建行為抽象為外掛程式後,只需聲明外掛程式名稱,即可完成大段代碼才能完成的工作。例如,需要完成checkout代碼工作,只需聲明外掛程式為@serverless-cd/checkout即可實現。
參數 | 類型 | 說明 | 是否必填 | 參考值 |
plugin | String | 當前步驟啟動並執行外掛程式。 | 是 | @serverless-cd/checkout |
id | String | 步驟ID,用於唯一標識當前步驟。 | 否 | s-setup |
env | Map<String, String> | 當前步驟的環境變數。 | 否 | |
continue-on-error | Boolean | 是否忽略執行異常,預設不允許忽略執行異常。取值說明如下:
| 否 | false |
inputs | Object | 執行外掛程式後接收的參數。 | 否 | |
if | String | 條件執行運算式。如果執行結果為true,則繼續執行此步驟,否則忽略此步驟。 | 否 | |
支援的外掛程式列表