DataWorks提供內建的流程檢查,如任務發布前程式碼檢閱、資料治理中心治理項的內建檢查項校正,此外,DataWorks還支援您自訂校正邏輯並接入DataWorks,實現DataWorks流程管控。本文以在提交與發布時校正代碼中是否存在MAX_PT函數為例,為您介紹如何基於擴充程式實現工作空間中不允許使用特定函數。
情境說明
本實踐樣本的情境為校正提交發布的代碼中是否有MAX_PT函數,樣本的校正流程為:
序號 | 核心流程 | 核心功能點 |
1 | 將工作空間中的檔案提交與發布訊息(例如提交、發布節點)通過OpenEvent發布至EventBridge,後續通過EventBridge過濾事件訊息,並將訊息發送至您的服務。 | 開啟訊息訂閱的時候,通過事件規則指定訂閱的事件類型為檔案提交與發布(dataworks:FileChange:CommitFile和dataworks:FileChange:DeployFile) 配置詳情請參見開啟並配置訊息訂閱(OpenEvent)。 |
2 | 本地或線上服務接收訊息,通過對擴充程式的設定,實現:
|
|
開啟並配置訊息訂閱(OpenEvent)
開啟並配置訊息訂閱的詳細步驟請參見開啟訊息訂閱,以下為本實踐中的核心配置流程與注意事項。
- 在EvenBridge控制台,跳過事件來源等配置,快速建立一個自訂匯流排。
- 在EvenBridge控制台對應的事件匯流排中,建立事件規則。本實踐定義該EventBridge自訂匯流排可接收DataWorks檔案提交事件訊息和檔案發布事件訊息,配置demo與核心參數配置如下。
- 配置事件模式。
{ "source": [ "acs.dataworks" ], "type": [ "dataworks:FileChange:CommitFile", "dataworks:FileChange:DeployFile" ] }
- source:定義事件的產品名稱標識,配置為acs.dataworks。
- type:定義產品下事件的類型標識,配置為dataworks:FileChange:CommitFile、dataworks:FileChange:DeployFile。您可以在下方的事件模式調試中,將source、type取值進行補充修改,然後進行事件測試,測試成功後單擊下一步。
- 配置事件目標中,服務類型選擇為HTTPS,並填寫合適的URL,其他參數可保持預設。
- 配置事件模式。
- 進入DataWorks控制台的開放平台頁面,在OpenEvent頁簽添加事件分發通道。
- 在DataWorks控制台的開放平台頁面,啟用上述訊息分發通道。
註冊並配置擴充程式(Extensions)
註冊並配置擴充程式的詳細步驟請參見準備工作,以下為本實踐中的核心配置流程與注意事項。
- 註冊擴充程式。
進入DataWorks控制台的開放平台頁面,在擴充程式頁簽單擊註冊擴充程式。
本實踐以在資料開發頁面提交節點的事件為樣本,註冊擴充程式時,核心參數配置說明如下,其他參數可根據介面提示進行配置。核心參數 配置說明 處理的擴充點 需選擇為檔案提交前置事件、檔案發布前置事件。 擴充程式參數配置 您可通過本參數的配置來控制擴充程式的生效範圍,在指定工作空間下: - 提交節點(檔案提交前置事件)時不觸發擴充程式校正、不阻塞提交節點的流程。
- 發布節點(檔案發布前置事件)時觸發擴充程式校正,如果不滿足校正通過條件會阻塞發布節點的流程。
需配置為
extension.project.commit-file.disabled=YourProjectId
。其中YourProjectId需替換為擴充程式不生效的擴充點事件所在的工作空間ID。擴充程式選項配置 需配置為以下樣本內容,用於後續設定不滿足校正條件後的回應程式式,以下樣本中指定的回應程式式包括警示和禁用。 { "type":"object", "properties":{ "checkStatus":{ "type":"number", "title":"MAX-PT函數檢查方式", "x-decorator":"FormItem", "x-component":"Radio.Group", "x-decorator-props":{ "tooltip":"描述檔案" }, "x-component-props":{ "dataSource":[ { "value":"WARN", "label":"警示" }, { "value":"FAIL", "label":"禁用" } ], "mode":"multiple" } } } }
- 開發部署擴充程式。配置DataWorks的SDK,配置詳情請參見安裝Java SDK,本實踐的範例程式碼如下。
package com.aliyun.dataworks.demo; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.aliyun.dataworks.config.Constants; import com.aliyun.dataworks.config.EventCheckEnum; import com.aliyun.dataworks.config.ExtensionParamProperties; import com.aliyun.dataworks.services.DataWorksOpenApiClient; import com.aliyuncs.IAcsClient; import com.aliyuncs.dataworks_public.model.v20200518.*; import com.aliyuncs.exceptions.ClientException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; /** * @author dataworks demo */ @RestController @RequestMapping("/extensions") public class ExtensionsController { @Autowired(required = false) private DataWorksOpenApiClient dataWorksOpenApiClient; @Autowired private ExtensionParamProperties extensionParamProperties; /** * 接收eventBridge推送過來的訊息 * @param jsonParam */ @PostMapping("/consumer") public void consumerEventBridge(@RequestBody String jsonParam){ JSONObject jsonObj = JSON.parseObject(jsonParam); String eventCode = jsonObj.getString(Constants.EVENT_CODE_FILED); if(Constants.COMMIT_FILE_EVENT_CODE.equals(eventCode) || Constants.DEPLOY_FILE_EVENT_CODE.equals(eventCode)){ //初始化client IAcsClient client = dataWorksOpenApiClient.createClient(); try { //當前事件參數資訊 String messageId = jsonObj.getString("id"); JSONObject data = jsonObj.getObject("data", JSONObject.class); Long projectId = data.getLong("projectId"); //初始化事件回調 UpdateIDEEventResultRequest updateIDEEventResultRequest = new UpdateIDEEventResultRequest(); updateIDEEventResultRequest.setMessageId(messageId); updateIDEEventResultRequest.setExtensionCode(extensionParamProperties.getExtensionCode()); //查詢觸發擴充點事件時的擴充點資料快照 GetIDEEventDetailRequest getIDEEventDetailRequest = new GetIDEEventDetailRequest(); getIDEEventDetailRequest.setMessageId(messageId); getIDEEventDetailRequest.setProjectId(projectId); GetIDEEventDetailResponse getIDEEventDetailResponse = client.getAcsResponse(getIDEEventDetailRequest); String content = getIDEEventDetailResponse.getEventDetail().getCommittedFile().getContent(); //判斷代碼是否包含限制函數 if(content.contains(Constants.CHECK_CODE)){ //擷取擴充程式選項配置在專案空間下的配置 GetOptionValueForProjectRequest getOptionValueForProjectRequest = new GetOptionValueForProjectRequest(); getOptionValueForProjectRequest.setProjectId(String.valueOf(projectId)); getOptionValueForProjectRequest.setExtensionCode(extensionParamProperties.getExtensionCode()); GetOptionValueForProjectResponse getOptionValueForProjectResponse = client.getAcsResponse(getOptionValueForProjectRequest); JSONObject jsonObject = JSON.parseObject(getOptionValueForProjectResponse.getOptionValue()); //注意:這裡需根據在DataWorks上實際設定格式來填寫 String checkStatus = jsonObject.getString("checkStatus"); updateIDEEventResultRequest.setCheckResult(checkStatus); updateIDEEventResultRequest.setCheckResultTip("代碼中存在限制函數"); }else{//成功回調 updateIDEEventResultRequest.setCheckResult(EventCheckEnum.OK.getCode()); updateIDEEventResultRequest.setCheckResultTip(EventCheckEnum.OK.getName()); } //回調DataWorks UpdateIDEEventResultResponse acsResponse = client.getAcsResponse(updateIDEEventResultRequest); //請求的唯一標識,用於後續錯誤排查使用 System.out.println("acsResponse:" + acsResponse.getRequestId()); } catch (ClientException e) { //請求的唯一標識,用於後續錯誤排查使用 System.out.println("RequestId:" + e.getRequestId()); //錯誤狀態代碼 System.out.println("ErrCode:" + e.getErrCode()); //錯誤描述資訊 System.out.println("ErrMsg:" + e.getErrMsg()); } }else{ System.out.println("未能過濾其他事件,請檢查配置步驟"); } } }
- 啟用擴充程式。擴充程式註冊完成後,單擊擴充程式管理,進入管理中心,在擴充程式頁面開啟上述註冊的擴充程式的啟動開關,根據介面提示完成授權啟用擴充程式,完成後單擊操作列的設定,設定工作空間對MAX_PT函數使用的管控力度。
- 本地部署運行。下載工程:
- 依賴環境:java8及以上,maven構建工具。
- 工程下載連結:extensions-demo-maxpt.zip (219 KB)。
獲得可直接啟動並執行jar後執行:mvn clean package -Dmaven.test.skip=true spring-boot:repackage
此時會成功啟動工程,如下圖所示:在瀏覽器輸入java -jar target/extensions-demo-maxpt-1.0.jar
http://localhost:8080/index
會得到"hello world!"
,表示應用成功部署,打通網路後即可訂閱EventBridge的訊息了。
結果驗證
完成上述實踐配置後,您可以在工作空間進行驗證。本樣本中,檔案提交事件(如提交節點)與檔案發布事件(如發布節點)會觸發擴充程式校正,但通過擴充程式的參數配置,對指定的工作空間的檔案提交事件不生效,所以在指定工作空間內提交包含MAX_PT函數的節點時,不會觸發擴充程式校正,當發布該包含MAX_PT函數的節點時,將觸發該擴充程式校正。