介绍
企业的发展越来越快,企业内部需要使用到的企业级应用也越来越多。有些需求和流程与流程编程相关。每当遇到这种需求都会去找流程编排相关的框架,毕竟没必要为了做了一个应用来造个轮子。使用建木来作为底层流程编排是一个不错的选择。
如何做
- 在建木平台上创建流程,获得流程的webhook地址
- 使用自己的平台来触发建木流程
- 在建木第一个节点回调到自己的系统,感知到流程已经开始执行
- 流程其他节点执行业务逻辑
- 建木流程最后一个节点回到自己系统,感知到流程执行结束
示例
用建木在多台机器上执行脚本
- 编写一个流程执行shell脚本,DSL如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
| name: 远程执行shell脚本
trigger: type: webhook param: - name: task_id type: STRING exp: $.body.json.id - name: task_record_id type: STRING exp: $.body.json.taskExecRecordDetailId - name: shell_script type: STRING exp: $.body.json.script - name: ssh_ip type: STRING exp: $.body.json.sshIp - name: ssh_port type: NUMBER exp: $.body.json.sshPort - name: ssh_user type: STRING exp: $.body.json.sshUser - name: ssh_private_key_name type: STRING exp: $.body.json.sshKeySecretName global: tag: ${trigger.tag} concurrent: true param: callback_url: http://10.11.12.13
pipeline: startx: type: local/autoops_callback:1.0.1 param: callback_url: ${global.callback_url} callback_api: /api/v1/task_exec/start/${trigger.task_id}/${trigger.task_record_id} callback_params_env: '{"recordId":"JM_INSTANCE_ID","triggerId":"JM_TRIGGER_ID","projectId":"JM_PROJECT_ID"}' callback_type: start get_uuid: type: local/get_uuid:1.0.0 scp_shell_script: type: "scp_resource:1.3.0" param: ssh_private_key: "((${trigger.ssh_private_key_name}))" ssh_ip: "${trigger.ssh_ip}" ssh_port: "${trigger.ssh_port}" ssh_user: "${trigger.ssh_user}" remote_file: "/tmp/${get_uuid.uuid}.sh" file_content: "${trigger.shell_script}" remote_execution: type: local/remote_execution:1.0.0 param: ssh_private_key: "((${trigger.ssh_private_key_name}))" ssh_ip: "${trigger.ssh_ip}" ssh_port: (${trigger.ssh_port}) ssh_user: "${trigger.ssh_user}" execution_cmd: "sh /tmp/${get_uuid.uuid}.sh" clear_remote_file: type: ssh_cmd:1.0.2 param: ssh_private_key: "((${trigger.ssh_private_key_name}))" ssh_ip: "${trigger.ssh_ip}" ssh_port: "${trigger.ssh_port}" ssh_user: "${trigger.ssh_user}" ssh_cmd: "rm -f /tmp/${get_uuid.uuid}.sh" finish: type: local/autoops_callback:1.0.1 param: callback_url: ${global.callback_url} callback_api: /api/v1/task_exec/finish/${trigger.task_id}/${trigger.task_record_id} callback_params_files: '{"log":"${remote_execution.log_path}"}' callback_type: finish work_status: (${remote_execution.inner.execution_status} == "EXECUTION_SUCCEEDED") status_true_flag: "SUCCEEDED"
|
- 在自己系统触发建木执行
在自己系统看到建木执行状态
使用到的接口
接口 |
说明 |
POST /webhook/** |
触发项目,执行流程 |
GET /view/workflow_instance/{triggerId} |
根据triggerId查询流程实例 |
PUT /workflow_instances/stop/{instanceId} |
流程终止接口 |
注意事项
正常情况下,在第一个节点回调平台传回triggerId
instanceId
等数据,平台感觉到流程开始执行。在最后一个节点回调平台,平感知到流程执行完毕。但是这中间只要有一个节点执行不成功,就会导致平台无法感知流程状态。为此需要使用定时任务去查询流程状态来补偿状态信息。如果查询出流程已经失败,是否需要终止流程、重试节点等操作,需要根据业务自行处理。这里会有一个问题,就是第一个节点也执行失败,那定时也是白费,因为没法获取本次执行的triggerId
导致流程无法控制。目前最新版本已经支持在webhook
触发时返回triggerId
了。