使用推斷的 DevSecOps 組態建立管道
將您的應用程式或微服務新增至 DevSecOps 持續整合 (CI) 工具鏈後,即可利用「推斷式 DevSecOps 管線配置」功能快速上手。 此功能:
- 為您推斷
.pipeline-config.yamlDevSecOps管道設定檔的內容 - 標識建置、測試和部署程式碼所需的腳本
- 提供這些腳本的程式碼,以便您可以專注於您的應用程式
透過此功能,您可輕鬆將微服務或應用程式整合至 DevSecOps 管道,並簡化採用 DevSecOps 流程。
無需額外步驟即可設定推論 DevSecOps 管道配置,因其已整合至 DevSecOps.
DevSecOps 持續部署(CD)工具鏈也具備預設的管道配置。 這使在持續整合(CI)端使用 Inferred DevSecOps 配置的採用者,能夠將相同的方法安全地延伸至其持續交付(CD)管道中。 部署動作是根據清點項目中的 app_artifacts 元資料所決定的。
DevSecOps「持續合規 (CC)」工具鏈亦可從推導出的 DevSecOps 配置中受益。 管線配置是根據清單項目中存在的儲存庫內容所推斷出來的。
必要條件
-
設定您的 DevSecOps 工具鏈,並整合 應用程式的原始碼倉庫。
不要使用預設的範例應用程式儲存庫。 相反,加入您自己的應用程式儲存庫。
-
查看 DevSecOps管道自訂的基礎知識,詳細了解可用的不同模板、支援選項以及其他重要信息,以幫助您開始使用DevSecOps。
開始使用
首先,配置您的工具鏈以使用您自己的原始程式碼儲存庫。 然後,運行您的第一個 DevSecOps CI 管道。 此功能預設為啟用,因此無需額外設定。 它動態推斷建置、測試和部署應用程式或服務所需的DevSecOps管道配置和腳本。
若要停用此功能,請設定與儲存庫中現有檔案相符的 pipeline-config 值。
具有推斷的DevSecOps管道配置的點
推斷的DevSecOps管道配置功能使用源自省和語言定義來識別來源儲存庫中的 spots。 spot 是程式碼中需要執行特定操作的位置。
每個點都具有以下屬性:
| 內容 | 說明 |
|---|---|
| 來源 | 將原始碼儲存庫中的位置標識為該點的上下文。 |
| 程序 | 指示要執行的操作類型的一個或多個進程。 |
| 工具 | 與進程關聯的數組,列出要啟動以執行操作的工具。 每個工具都可以有自己的一組屬性。 |
| 環境設定 | 引用將啟動的腳本檔案(或腳本命令),以設定要執行的流程操作(工具呼叫)的環境。 |
已識別斑點
推斷的DevSecOps管道配置功能目前可識別以下類型的 spots:
code 點、deployment 點、acceptance-test 點、dynamic-scan 點和 release 點。
代碼點
代碼點與受支援的源代碼語言相關,包括:
- Node.js (使用 npm、Yarn 或Gradle )
- Java (使用 Maven 或Gradle )
- Golang
- Python
- Dockerfile
- Terraform 配置語言
code 點處理以下程序:
building:定義執行給定原始碼建置的工具。unit-testing:找到對建置結果執行單元測試的工具。
部署點
deployment 點定位部署工具,包括部署資源和工具。deployment 點有一個列出部署工具的部署流程。 目前支援的部署車輛有:
-
Kubernetes資源定義,如
Pod、ReplicaSetReplicationController、'DaemonsetDeployment、StatefulSet、'code6'、Job、Cronjob、NetworkPolicy、Ingress、Service、Route- kubectl 作為工具 -
Open Liberty應用程式自訂資源- kubectl 作為工具
-
Helm圖表- Helm 作為工具
-
IBM Cloud Code Engine 已設定部署 時的 Dockerfile- IBM Cloud Code Engine CLI 為工具
驗收測試點
acceptance-test 點找到要執行的驗收測試套件。acceptance-test 點有一個 acceptance-testing 流程,用來識別執行驗收測試套件的工具。
動態掃描點
dynamic-scan 點標識動態掃描的位置。 動態掃描點有一個 scanning 進程來列出動態掃描期間呼叫的掃描工具。
OWASP ZAP 掃描 是唯一支援啟動子 Webhook 觸發器的工具。
發佈點
release 點定位發布流程。 發佈點有一個 releasing 流程,列出了發布階段要運行的工具。 目前支援的發布流程工具有:
- 語意釋放
- Maven 與
maven deploy階段。
範例polyglot-spots.json內容
推斷的DevSecOps管道配置功能提取點並產生以下 JSON 內容,以在 CI 管道階段觸發特定操作和工具。
{
"code": [
{
"source": "Dockerfile",
"language": "Dockerfile",
"building": {
"tools": [
{
"tool": "docker"
}
]
}
},
{
"source": "package.json",
"language": "NodeJS",
"building": {
"tools": [
{
"tool": "npm"
}
]
},
"unit-testing": {
"tools": [
{
"tool": "npm",
"command": "test"
}
]
}
}
],
"acceptance-test": [
{
"source": "package.json",
"acceptance-testing": {
"tools": [
{
"tool": "npm",
"command": "run acceptance-test"
}
]
}
}
],
"deployment": [
{
"source": "deployment_iks.yml",
"deploying": {
"tools": [
{
"tool": "kubectl"
}
],
"environment-setup": ".env.deploy.sh"
}
},
{
"source": "deployment_os.yml",
"deploying": {
"tools": [
{
"tool": "kubectl"
}
],
"environment-setup": ".env.deploy.sh"
}
}
],
"dynamic-scan": [
{
"source": "definitions/definitions1.json",
"scanning": {
"tools": [
{
"tool": "trigger-async-zap",
"kind": "api"
}
],
"environment-setup": "scripts/zap/zap-custom-scripts/.env.dynamic-scan.sh"
}
},
{
"source": "scripts/zap/uiscripts/run.sh",
"scanning": {
"tools": [
{
"tool": "trigger-async-zap",
"kind": "ui"
}
],
"environment-setup": "scripts/zap/zap-custom-scripts/.env.dynamic-scan.sh"
}
}
],
"release": []
}
進階配置
文件注入
推斷的DevSecOps管道配置功能使用 polyglot-spots.json 和 .pipeline-config.yaml 檔案的內容來自訂DevSecOps管道流程執行。
在 CI 管道的 finish 階段,polyglot-spots.json 和 .pipeline-config.yaml (對應於 CI 管道執行的靜態管道配置)都被加入到應用程式原始碼儲存庫中名為 inferred-devsecops (預設)的分支。
如果屬性 create-inferred-pipeline-configuration-v2 設定為 true (預設為 false ),也可以產生格式版本為 2 的管道組態 (例如可用於 compliance-pipelines 分支 v11 )。 然後,應用程式原始碼倉庫中名為 inferred-devsecops (預設) 的分支中會新增一個管道配置文件,如 .pipeline-config-v2.yaml。
配置注入分支
您可以使用 inferred-devsecops-branch 管道屬性配置用於注入DevSecOps推斷檔案的分支名稱。 預設值為 inferred-devsecops。
使用 push-inferred-pipeline-configuration-files 管道屬性 ( push-polyglot-files 屬性已被廢棄,改用 push-inferred-pipeline-configuration-files 屬性) 來啟用或停用 inferred-devsecops 分支的建立與更新:
| 值 | 說明 |
|---|---|
true (預設) |
設定檔被新增並推送到來源應用程式原始碼儲存庫的 inferred-devsecops 分支。 |
false |
設定檔不會加入到 inferred-devsecops 分支。 |
配置點提取
使用以下管道環境屬性配置點的提取:
忽略斑點
您可以使用正規表示式在擷取過程中忽略特定點。 可用的配置選項如下:
ignore-code-spot-pattern:忽略與指定正規表示式相符的代碼點。ignore-deployment-spot-pattern:忽略與指定正規表示式相符的部署點。ignore-dynamic-scan-spot-pattern:忽略與指定正規表示式相符的動態掃描點。ignore-acceptance-test-spot-pattern:忽略與指定正規表示式相符的驗收測試點。ignore-release-spot-pattern:忽略與指定正規表示式相符的發佈點。
Code Engine配置
如果您使用 IBM Cloud Code Engine 進行部署,請指定 Code Engine 專案,並使用下列管道環境屬性設定建立程序:
code-engine-project:指定Code Engine專案。code-engine-build-use-native-docker:(預設:false)指示是否使用Docker CLI 而不是ibmcloud code-engine buildrun命令。code-engine-disable-buildpacks-strategy: (預設false) 表示建立程序不應使用buildpacks策略 (僅在code-engine-project已設定時有效)root-as-build-context: (預設值:false) 表示Dockerfile相關建置工具 (如docker或code-engine) 的建置上下文應該使用儲存庫的根作為建置上下文,而不是包含 Dockerfile 的資料夾。
容器映像構建配置
container-image-builder: (預設為docker) 針對 Dockerfile 相關的建置作業,請指定用於建置容器映像的工具 (docker或podman)。root-as-build-context: (預設值:false) 表示相關建置工具(如docker,podman``Dockerfile或code-engine)的建置上下文應使用儲存庫根目錄作為建置上下文,而非包含 Dockerfile 的資料夾。
Golang 組態
若要設定 Golang 的點擷取程序,請設定下列管道環境屬性:
go-ignore-main:(預設:false)指示代碼點提取是否不關注主來源參數的主包和主函數檢測。go-output:指定 go build 指令的可執行輸出檔。
Gradle配置
若要設定 Gradle 設定、單元測試、建立工件和驗收測試的任務,請使用下列管道環境屬性:
gradle-setup-tasks:(預設:assemble)用於設定階段的Gradle任務的逗號分隔清單。gradle-unit-testing-tasks:(預設:test)單元測試階段的Gradle任務的逗號分隔清單。gradle-build-artifact-tasks:(預設:build)建構工件階段的Gradle任務的逗號分隔清單。gradle-acceptance-testing-tasks:用於驗收測試階段的Gradle任務的逗號分隔清單。
NPM配置
您可以設定NPM單元測試和驗收測試腳本檢測。
hint-npm-unit-testing-script:(預設:test)NPM 單元測試腳本偵測的提示。hint-npm-acceptance-testing-script:(預設:acceptance-test)NPM 驗收測試腳本偵測的提示。
Python配置
若要設定 Python Poetry 版本,請使用下列管道環境屬性:
hint-python-poetry-version:(預設:1.8.2) Python Poetry 版本的提示。discover-python-unittest-from-ancestor: (預設值:false) 表示使用祖先目錄作為 pythonunittest發現的起點 (例如,為了從儲存庫根目錄中包含requirements.txt的目錄而不是最接近 python unittest 檔案的requirements.txt(如果有的話) 發現單元測試)。
Terraform 配置
要配置 Terraform 部署流程,請使用下列管道環境屬性:
terraform-deployment:(預設值:false)停用Schematics作為部署工具,轉而使用 Terraform 和Cloud Object Storage進行狀態儲存。
Helm 配置
要設定 Helm 發布流程,請使用以下管道環境屬性:
helm-oci-registry-support: (預設為false) 啟用在發佈步驟中將 Helm 圖表推送至 OCI 註冊表的功能。configuration-file-pattern-<config_file_type>: 定義一個模式,用以識別特定類型的配置檔案。 例如,configuration-file-pattern-dev-config=chart/dev-values.yaml會選取檔案chart/dev-values.yaml作為類型為dev-config的構建產出。
工件上傳
若要設定工件上傳程序,請使用下列管道環境屬性:
artifact-upload-to-devsecops-cos:(預設值:false)透過使用DevSecOps CLI 工件上傳非影像儲存的工件,啟用工件上傳至Cloud Object Storage桶。
環境設定文件
每個原始程式碼儲存庫都需要針對給定階段進行特定設定或自訂。 推斷 DevSecOps Pipeline Configuration 功能提供了一種指定環境設定屬性的方法,該屬性可以定義為 bash 腳本。 該腳本是在為進程運行相應操作之前取得的。
在抽取點位時,此推斷 devsecops 組態功能會根據檔案名稱使用提示來確定環境設定檔案。 例如,在執行 npm 單元測試之前,一個名為 .env.npm-test.sh 的檔案會挑選作為環境設定腳本來啟用。
環境設定檔案的標準化格式就像 .env.<process>.sh 或 .env.<tool>-<process>.sh。
<process> 的值可以是 build, test, acceptance-test, deploy, dynamic-scan 或 release 之一。
對於 build 程序,<tool> 的值可以是 code-engine, docker, docker-maven-plugin, go, gradle, helm, maven, npm, pip,
pipenv, poetry, terraform 或 yarn 之一。
對於 test 和 acceptance-test 流程,<tool> 的值可以是 go, gradle, helm, maven, npm, pytest, python 或 terratest 之一。
對於 deploy 流程,<tool> 的值可以是 code-engine,helm, kubectl-liberty-app, kubectl, schematics 或 terraform 之一。
對於 dynamic-scan 流程,<tool> 的值可以是 trigger-async-zap。
對於 release 程序,<tool> 的值可以是 maven, poetry 或 semantic-release 之一。
以下是一些範例:
.env.build.sh檔案關聯,作為程式碼點中建立程序的環境設定。 它可以被範圍工具(如 docker、maven...)的環境設定檔覆蓋,例如.env.docker-build.sh,.env.maven-build.sh,....env.test.sh檔案關聯,作為在程式碼點進行單元測試的環境設定。 它可以被範圍工具(如 go、npm...)的環境設定檔覆寫,例如.env.go-test.sh,.env.npm-test.sh,....env.deploy.sh檔案關聯為部署點中程序的環境設定。 它可以被範圍工具(如 code-engine、helm、kubectl...)的環境設定檔覆寫,例如.env.code-engine-deploy.sh,.env.helm-deploy.sh,....env.acceptance-test.sh檔案關聯為驗收測試點中程序的環境設定。 它可以被範圍工具(如 go、maven、npm...)的環境設定檔覆蓋,例如.env.maven-acceptance-test.sh,.env.python-acceptance-test.sh,....env.dynamic-scan.sh檔案關聯為動態掃描點中進程的環境設定。.env.release.sh檔案關聯為發行版中的程序環境設定。 它可以由範圍工具 (如 maven、semantic-release...) 的環境設定檔案覆寫,例如.env.maven-acceptance-test.sh,.env.semantic-release-acceptance-test.sh,...
有關如何使用此腳本的範例,請參閱IBM Cloud上的 Hello Compliance App 儲存庫。
環境情境注入
推斷的DevSecOps管道配置功能將管道和觸發器屬性中的環境變數合併到各種項目上下文中。 專案背景如下:
- 管道執行階段
- Helm部署
- Code Engine部署
此功能可讓您根據規範化的屬性名稱從管道和觸發器屬性注入或設定上下文,例如環境變數。
某些工具使用注入特定上下文的規範化名稱來處理屬性,例如:
- docker 建置參數和/或 docker 建置秘密
- 用於Helm部署的補充
values.yaml文件 - 用於Code Engine部署的
configmap或secret
透過使用規範化的屬性名稱,您可以將環境變數和其他上下文注入管道和部署中。
管道執行階段的環境變數注入
推斷的DevSecOps管道配置功能提供了一個 export-properties 實用程序,用於在階段執行期間將管道和觸發器屬性匯出為環境變數。 在每個自訂階段都會呼叫此實用程式:
export-properties "GLOBAL" && export-properties "${STAGE^^}"
全域環境變數
命令 export-properties "GLOBAL" 導出具有規範化名稱的管道和觸發器屬性,其中 ENV_GLOBAL_<XXX> 作為環境變量,例如每個管道階段執行上下文中的 XXX。
全域環境變數範例
| 內容名稱 | 物業估價師 | 結果環境變數 |
|---|---|---|
ENV_GLOBAL_my_var |
my_value |
my_var=my_value |
階段特定的環境變量
命令 export-properties "${STAGE^^}" 將使用規範化名稱 ENV_<stage in upper case>_<XXX> 匯出與目前執行階段相關的管道或觸發器屬性作為給定執行階段中的環境變數。
特定於階段的環境變數範例
| 內容名稱 | 物業估價師 | 結果環境變數 |
|---|---|---|
ENV_SETUP_CGO_ENABLED |
true |
CGO_ENABLED=true |
在 CI 管道中,code-setup - run-stage 步驟將 CGO_ENABLED 環境變數設定為正確的值。
有關階段及其描述的列表,請參閱 階段描述。
此功能的典型用例是在運行單元測試之前註入環境變數以提供配置。 在這種情況下,屬性的規範化名稱將為ENV_TEST_<a_var>,<a_var>是可用於 test` 階段執行的匯出環境變數的名稱。
範例
| 內容名稱 | 物業估價師 | 結果環境變數 |
|---|---|---|
ENV_TEST_MY_VAR |
my_value |
MY_VAR=my_value |
使用此功能可以簡化管道配置並提高部署的一致性。
工具執行和配置
推斷DevSecOps管道配置功能中的一些工具使用管道和觸發器屬性來推斷補充配置。
Docker
- 建置參數:docker build 指令使用--build-arg參數完成,該參數基於管道和觸發器屬性,並具有規範化名稱(如
DOCKER_BUILD_ARG_。- 範例:新增名為
DOCKER_BUILD_ARG_my_arg的屬性會將參數--build-arg="my_arg="注入到 docker build 命令中。
- 範例:新增名為
- 建置秘密:docker build 指令透過基於管道和觸發器屬性的--secret參數完成,並具有規範化名稱(如
DOCKER_BUILD_SECRET_。- 例如,新增名為 DOCKER_BUILD_SECRET_my_secret 的屬性會將參數--secret id=my_secret,env= 注入到 docker build 指令中。
要了解更多信息,請參閱 docker 建置參數 和 docker 建置秘密
Helm
- 部署處理:可以根據標準化管道和觸發器屬性將其他值注入Helm部署流程。
- 如果屬性的名稱類似於
HELM_VALUE_,則由Helm處理工具管理的補充值檔案會新增一個條目a_value_property其中包含管道或觸發器屬性的值。 - 互補值檔案用作 helm 指令最後一個
-f | --values參數的參數。
- 如果屬性的名稱類似於
要了解更多信息,請參閱 互補價值觀內容。
Terraform
- 部署過程Terraform 工具依賴 compliance-commons terraform 提供的Terraform 輔助函數。
- 有關上下文注入的配置屬性的更多信息,請參閱 配置 Terraform 輸入變數。
Schematics
- 部署流程:Schematics工具依賴 compliance-commons 原理圖 提供的Schematics輔助函數。
- 有關上下文注入的配置屬性的更多信息,請參閱 配置Schematics工作區聲明的變數。
Code Engine
- 部署過程:可以透過定義與應用程式關聯的補充配置對應或秘密來建立應用程式的附加配置。
- 對於具有規範化名稱(例如
CE_ENV_<XXXX>的管道和觸發器屬性,將使用鍵<XXXX>創建互補配置映射或密鑰(與Code Engine應用程式或作業關聯)中的條目,並且其值基於的值設定對應的管道或觸發器屬性。
- 對於具有規範化名稱(例如
要了解更多信息,請參閱 code-engine configmap(s)來配置應用程式或作業,並參閱 code-engine Secret 來配置應用程式或作業
DevSecOps通用腳本庫
推斷的DevSecOps管道配置在某些階段使用公共庫中腳本中的腳本/函數,該庫提供了一組可重複使用腳本,如果您想開始自訂,可以為您提供協助。
有關公共腳本庫的更多信息,包括腳本、工具、用法和參數,請參見 公共腳本庫。
常見問題 (FAQ)
分支保護
預設啟用分支保護
DevSecOps PR 和 CI 管道預設啟用原始碼儲存庫上的分支保護。 此驗證發生在程式碼設定階段。
停用分支保護
若要停用分支保護,請將 setup-branch-protection 屬性設為 false。
自訂分支保護狀態檢查
若要自訂 分支保護狀態檢查的前綴,請設定 branch-protection-status-check-prefix 屬性。 預設前綴是 tekton。
配置和執行預提交鉤子
預設情況下,如果源碼倉庫中存在預提交配置檔案,則具有推斷 DevSecOps 配置的 PR 和 CI 管道會在設定階段執行預提交 掛勾 (預設為 .pre-commit-config.yaml )。 預提交配置檔案的名稱可透過 pipeline/trigger 屬性 pre-commit-config-file 設定為配置檔案名稱來指定。
某些預提交鉤子可能會被跳過(例如,因為特定的鉤子(如 detect-secrets )會在 PR 或 CI 管道的特定階段執行)。 若要指定要跳過的鈎子,請將 pipeline/trigger 屬性 pre-commit-skip-hooks 設定為以逗號分隔的要跳過的鈎子 id 清單。
具有自簽證書的 Sonarqube 伺服器
如果 sonarqube-config 設定為 custom 以使用 現有的 sonarqube 伺服器,而且伺服器有自簽的憑證,那麼為了讓聲納掃瞄器成功連線到 sonarqube 伺服器,就需要將自簽的憑證 加入受信任的 CA 憑證。
透過提供 PEM 格式的證書作為管道/觸發屬性 sonarqube-root-certificate 的值,推斷 DevSecOps 管道組態中的靜態掃描實作就會在使用 SonarScanner for maven、SonarScanner for gradle sonar 或 SonarScanner invoked with Docker 時相應地加入證書。
詩歌和私人存儲庫
為私有儲存庫配置詩歌
使用 Poetry 時( pyproject.toml 被標識為程式碼點)並定義替代來源或儲存庫來取得依賴項,例如:
[[tool.poetry.source]]
name = "local"
url = "<artifactory-url>"
secondary = true
或涉及 Poetry 時 (即 pyproject.toml 包含 build-system 區段,而 build-backend 等於 poetry.core.masonry.api 是已識別的釋放點),則可能需要提供憑證以驗證私有註冊表。
使用IBM Cloud中的私有儲存庫進行身份驗證
需要提供此 local 來源儲存庫的憑證。 有關憑證配置的 Poetry 文件 表示提供 http 使用者和密碼的環境變數應為 POETRY_HTTP_BASIC_LOCAL_USERNAME 和 POETRY_HTTP_BASIC_LOCAL_PASSWORD。
使用 環境變數注入 功能,並新增以下管道環境屬性:
- 具有適當值的
ENV_GLOBAL_POETRY_HTTP_BASIC_LOCAL_USERNAME(文字) - 具有適當安全值的
ENV_GLOBAL_POETRY_HTTP_BASIC_LOCAL_PASSWORD(安全性)
驗證以發佈至私人儲存庫
當涉及 Poetry 時 (即 pyproject.toml 包含 build-system 區段,而 build-backend 等於 poetry.core.masonry.api 是已識別的釋出點時),可以使用管道環境屬性來定義 token 或使用者名稱的設定,例如 (對於名為 local 的儲存庫 ):
- 具有適當值的
ENV_GLOBAL_POETRY_HTTP_BASIC_LOCAL_USERNAME(文字) - 具有適當安全值的
ENV_GLOBAL_POETRY_HTTP_BASIC_LOCAL_PASSWORD(安全性)
或
ENV_GLOBAL_POETRY_PYPI_TOKEN_LOCAL(安全) 與符號相對應的適當安全值
Maven、pom.xml、settings.xml與環境解析
在IBM Cloud中為自訂設定檔配置 Maven
如果您的 Maven 專案定義了具有自訂檔案名稱的特定設定文件,例如 ci-settings.xml,請在 PR、CI 管道中定義管道環境屬性 maven-user-settings-file-path 並將值設為 ci_settings.xml 或觸發電平屬性。
此外,如果有一些 env.<VARIABLE> 需要解決,例如:
<server>
<username>${env.MAVEN_USERNAME}</username>
<password>${env.MAVEN_PASSWORD}</password>
<id>central</id>
</server>
使用 環境變數注入 功能透過新增 2 個管道屬性(在 PR 和 CI 管道中)來提供這些變數:
ENV_GLOBAL_MAVEN_USERNAME(文字)以及用於 Maven 使用者名稱的值ENV_GLOBAL_MAVEN_PASSWORD(安全性)以及用於 Maven 密碼的值
Go 建構的強制靜態連結
為 Go 建置啟用靜態連結
預設情況下,go build 產生動態連結的二進位。 要在Docker容器中使用它,請在建置期間透過設定 CGO_ENABLED=0 來啟用靜態連結。
配置Go建構的環境變數
若要啟用靜態鏈接,請使用 環境變數注入 功能在 CI 管道中新增以下管道環境屬性:
ENV_SETUP_CGO_ENABLED其值設定為0
取得支援
IBM Cloud 的 AI 助手,它由 IBM 的 watsonx 驅動,旨在幫助您瞭解如何在 IBM Cloud 工作,以及如何利用可用的產品目錄建立解決方案。 請參閱 取得 AI 助理的協助。
如果您仍無法解決問題,則可以開立支援案例。 如需詳細資訊,請參閱 建立支援個案。 如果您想要提供回饋,請參閱 提交回饋。