流程编排,你还不知道建木还可以这么用?
2022-11-23 assembly-instr
流程编排,你还不知道建木还可以这么用?
作者:assembly-instr 发布时间:2022-11-23 14:00:00

介绍

企业的发展越来越快,企业内部需要使用到的企业级应用也越来越多。有些需求和流程与流程编程相关。每当遇到这种需求都会去找流程编排相关的框架,毕竟没必要为了做了一个应用来造个轮子。使用建木来作为底层流程编排是一个不错的选择。

如何做

  1. 在建木平台上创建流程,获得流程的webhook地址
  2. 使用自己的平台来触发建木流程
  3. 在建木第一个节点回调到自己的系统,感知到流程已经开始执行
  4. 流程其他节点执行业务逻辑
  5. 建木流程最后一个节点回到自己系统,感知到流程执行结束

示例

用建木在多台机器上执行脚本

  1. 编写一个流程执行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"

image-20221116175708794

  1. 在自己系统触发建木执行

image-20221116180019898

在自己系统看到建木执行状态

image-20221116180357896

使用到的接口

接口 说明
POST /webhook/** 触发项目,执行流程
GET /view/workflow_instance/{triggerId} 根据triggerId查询流程实例
PUT /workflow_instances/stop/{instanceId} 流程终止接口

注意事项

正常情况下,在第一个节点回调平台传回triggerId instanceId等数据,平台感觉到流程开始执行。在最后一个节点回调平台,平感知到流程执行完毕。但是这中间只要有一个节点执行不成功,就会导致平台无法感知流程状态。为此需要使用定时任务去查询流程状态来补偿状态信息。如果查询出流程已经失败,是否需要终止流程、重试节点等操作,需要根据业务自行处理。这里会有一个问题,就是第一个节点也执行失败,那定时也是白费,因为没法获取本次执行的triggerId导致流程无法控制。目前最新版本已经支持在webhook触发时返回triggerId了。