全部產品
Search
文件中心

:自訂工作範本

更新時間:Dec 04, 2024

應用中心內建了自訂工作範本,用於執行使用者自訂的流水線邏輯。本文介紹自訂工作範本的實現原理、描述樣本和使用方法。

實現原理

應用中心在任務執行階段,按照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

LogConfig

收集任務節點日誌到Log ServiceSLS。

請參見LogConfig

vpcConfig

VPCConfig

部署任務節點到指定的VPC。

請參見VPCConfig

nasConfig

NASConfig

將NAS掛載到任務節點檔案目錄。

請參見NASConfig

serviceRole

String

指定部署任務節點和執行步驟的RAM角色。預設為acs:ram::{uid}:role/aliyunfcserverlessdevsrole

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>

為任務節點指定環境變數配置。

{
    "DEBUG":"*"
}

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

執行引擎傳遞給任務的執行內容。

{
"appName": "my-application"
}

uid

String

阿里雲帳號ID。

198613743****

requestId

String

當前處理的請求ID。

94AB79CA-624B-4FBE-89BC-0F94BC1E1E15

sts

Object

阿里雲STS臨時授權資訊,用於調用雲端服務。其許可權由RunnerConfig.serviceRole指定。

{
"accessKeyId": "Lk89k****",
"accessKeySecret": "SEC******",
"securityToken":"KJHLS****"
}

pipeline

Object

當前流水線的詳情。

請參見Pipeline

task

Object

當前任務的詳情。

請參見Task

Steps的資料結構如下。

參數

類型

說明

是否必填

參考值

run

String

當前步驟啟動並執行Shell命令。

make setup

id

String

步驟ID,用於唯一標識當前步驟。

s-setup

env

Map<String, String>

當前步驟的環境變數。

{
    "debug":"*"
}

working-directory

String

執行當前步驟命令的路徑,支援相對路徑。預設為engine進程當前路徑。

./

continue-on-error

Boolean

是否忽略執行異常,預設不允許忽略執行異常。取值說明如下:

  • true:表示允許步驟執行失敗時通過。

  • false:表示不允許步驟執行失敗時通過。

false

if

String

條件執行運算式。如果執行結果為true,則繼續執行此步驟,否則忽略此步驟。

${{ steps['my-cache'].outputs['cache-hit'] != 'true' }}

外掛程式類型Step

外掛程式由應用中心官方維護。將重複和繁瑣的構建行為抽象為外掛程式後,只需聲明外掛程式名稱,即可完成大段代碼才能完成的工作。例如,需要完成checkout代碼工作,只需聲明外掛程式為@serverless-cd/checkout即可實現。

參數

類型

說明

是否必填

參考值

plugin

String

當前步驟啟動並執行外掛程式。

@serverless-cd/checkout

id

String

步驟ID,用於唯一標識當前步驟。

s-setup

env

Map<String, String>

當前步驟的環境變數。

{
    "debug":"*"
}

continue-on-error

Boolean

是否忽略執行異常,預設不允許忽略執行異常。取值說明如下:

  • true:表示允許步驟執行失敗時通過。

  • false:表示不允許步驟執行失敗時通過。

false

inputs

Object

執行外掛程式後接收的參數。

{
  "key1": "value1",
  "key2": "value2"
}

if

String

條件執行運算式。如果執行結果為true,則繼續執行此步驟,否則忽略此步驟。

${{ steps['my-cache'].outputs['cache-hit'] != 'true' }}

支援的外掛程式列表