
影刀RPA完全指南Git版本控制与RPA流程协作开发规范痛点切入团队使用影刀RPA半年后你大概率遇到过这些情况流程文件被同事覆盖、出问题后找不到上一版能用的流程、“最终版_v3_修好_真最终.json” 这种文件满天飞。更严重的是生产环境跑着某人的本地流程文件一旦挂了根本不知道是哪个版本回滚全靠运气。根本原因只有一个RPA流程没有版本控制。影刀RPA的流程文件是.json格式天生兼容Git管理。但现状是绝大多数RPA团队把Git当网盘用——全员往 main 分支直接push毫无协作规范可言。本文基于我在两个RPA项目组的真实经验给出一套从初始化到CI/CD的完整Git方案。核心方法1. 影刀RPA流程文件结构解析在开始Git之前先理解你管理的到底是什么。影刀流程保存后会生成一个项目目录核心文件如下project_name/ ├── project.json # 项目元数据名称、版本、描述 ├── flow/ # 流程定义目录 │ ├── main.flow.json # 主流程 │ ├── sub_01.flow.json # 子流程 │ └── sub_02.flow.json ├── app/ # 应用定义应用元素库 │ └── chrome.app.json ├── data/ # 测试数据 │ └── test_data.csv ├── screenshot/ # 截图资源 └── python/ # 自定义Python脚本 └── custom_logic.py关键点只把流程定义文件和代码纳入版本管理。screenshot/目录中的截图文件体积大且经常变化不应入库。data/中的测试数据视情况而定。2. Git仓库初始化在影刀项目根目录执行# 初始化Git仓库gitinit# 配置用户信息必须否则commit记录无法追溯gitconfig user.name林焱gitconfig user.emaillinyancompany.com3. .gitignore 精确配置这是最容易出问题的地方。配置不当会导致敏感信息泄露或仓库膨胀。# .gitignore 文件内容 — 影刀RPA项目专用# 依赖和运行时 node_modules/ __pycache__/ *.pyc .venv/ venv/# 截图和临时文件 screenshot/ *.png *.jpg *.bmp temp/ *.tmp# 本地配置含敏感信息 .env config.local.json credentials.json *.key *.pem# 日志文件 logs/ *.log# 操作系统文件 .DS_Store Thumbs.db desktop.ini# IDE配置 .vscode/ .idea/ *.swp *.swo# 测试数据如不需要版本管理 data/*.csv data/*.xlsx!data/example_*.csv# 保留示例数据执行# 生成.gitignorecat.gitignoreEOF # 粘贴上面完整内容 EOF# 首次提交gitadd.gitcommit-minit: 影刀RPA项目初始化配置Git版本控制4. 分支策略基于Git Flow简化版店群矩阵自动化突破运营极限别搞太复杂RPA团队通常不超过10人。我用的是三分支策略分支用途权限main生产环境在跑的版本仅通过PR合并禁止直接pushdevelop开发集成分支仅通过PR合并|feature/*| 功能开发分支 | 开发者自由push |操作流程# 1. 创建develop分支gitcheckout-bdevelopgitpush origin develop# 2. 从develop创建功能分支gitcheckout-bfeature/add-login-flow develop# 3. 开发完成后推送gitadd.gitcommit-mfeat(login): 新增登录流程支持验证码识别gitpush origin feature/add-login-flow# 4. 在Git平台GitLab/GitHub发起Merge Request到develop# 5. 测试通过后从develop发起MR到mainCommit message 规范基于Conventional Commitsfeat(模块): 新增功能描述 fix(模块): 修复问题描述 perf(模块): 性能优化描述 refactor(模块): 重构描述 docs: 文档更新示例feat(数据采集): 新增京东商品评论采集子流程 fix(登录): 修复验证码识别超时导致流程卡死 perf(数据导出): SQL批量写入替代逐条insert耗时从120s降至8s5. PR流程与Code ReviewMerge Request模板保存为.gitlab/merge_request_templates/rpa_mr_template.md## 变更类型 - [ ] 新增流程 - [ ] 修改流程 - [ ] Bug修复 - [ ] 性能优化 ## 变更说明 描述改了什么、为什么改 ## 测试结果 - [ ] 本地测试通过附截图 - [ ] 测试环境测试通过 - [ ] 影响范围评估是否影响其他流程 ## Checklist - [ ] 更新了流程文档 - [ ] 变量命名清晰 - [ ] 异常处理完整 - [ ] 无硬编码敏感信息 - [ ] 执行超时设置合理Code Review要点变量命名是否规范驼峰命名是否有未捕获的异常等待元素超时时间是否合理是否有硬编码的账号密码是否引入了死循环风险6. CI/CD管道集成用GitLab CI做示例核心任务是自动检查 → 自动部署到测试环境 → 审批后部署到生产环境。# .gitlab-ci.yml — 影刀RPA项目CI/CD配置stages:-validate# 校验阶段-deploy-test# 部署测试-deploy-prod# 生产部署需手动触发# 阶段1流程文件格式校验validate_flow:stage:validateimage:python:3.10script:# 验证所有flow JSON文件格式正确-pip install jsonschema-python ci/validate_flows.pyonly:-merge_requests-develop# 阶段2自动部署到测试环境deploy_to_test:stage:deploy-testimage:python:3.10script:-python ci/deploy.py--env test--version $CI_COMMIT_SHORT_SHAenvironment:name:testurl:http://rpa-test.internal/only:-develop# 阶段3手动部署到生产环境deploy_to_production:stage:deploy-prodimage:python:3.10script:-python ci/deploy.py--env prod--version $CI_COMMIT_SHORT_SHAenvironment:name:productionurl:http://rpa-prod.internal/when:manual# 必须手动触发only:-main# 仅允许特定人员触发# 在GitLab Settings → CI/CD → Variables中配置校验脚本ci/validate_flows.py#!/usr/bin/env python3# -*- coding: utf-8 -*- 影刀RPA流程文件校验脚本 用途CI阶段自动检查所有flow JSON文件的格式完整性 作者林焱 importjsonimportosimportsysfrompathlibimportPath# 必需的顶层字段 — 影刀flow.json必须包含这些REQUIRED_FIELDS[name,nodes,edges,variables]defvalidate_flow_file(filepath):校验单个flow文件的结构完整性try:withopen(filepath,r,encodingutf-8)asf:datajson.load(f)exceptjson.JSONDecodeErrorase:print(f[ERROR]{filepath}: JSON格式错误 —{e})returnFalseexceptExceptionase:print(f[ERROR]{filepath}: 文件读取失败 —{e})returnFalse# 检查必需字段forfieldinREQUIRED_FIELDS:iffieldnotindata:print(f[ERROR]{filepath}: 缺少必需字段 {field})returnFalse# 检查节点定义 — 每个节点必须有type和idnodesdata.get(nodes,[])ifnotisinstance(nodes,list):print(f[ERROR]{filepath}: nodes 不是数组)returnFalsefori,nodeinenumerate(nodes):ifidnotinnode:print(f[ERROR]{filepath}: 节点[{i}] 缺少id)returnFalseiftypenotinnode:print(f[ERROR]{filepath}: 节点[{i}] 缺少type)returnFalse# 检查是否有重复的节点idnode_ids[n[id]forninnodesifidinn]duplicates[nidfornidinnode_idsifnode_ids.count(nid)1]ifduplicates:print(f[ERROR]{filepath}: 存在重复节点id:{set(duplicates)})returnFalse# 检查流程变量定义variablesdata.get(variables,{})forvar_name,var_definvariables.items():# 检查是否硬编码了敏感信息ifisinstance(var_def,str):lower_valvar_def.lower()suspicious_keywords[password,token,secret,apikey]forkeywordinsuspicious_keywords:ifkeywordinlower_val:print(f[WARN]{filepath}: 变量 {var_name} 可能包含硬编码敏感信息)breakprint(f[OK]{filepath}: 校验通过 (节点数{len(nodes)}))returnTruedefmain():遍历项目目录校验所有flow文件project_rootPath(__file__).parent.parent flow_dirproject_root/flowifnotflow_dir.exists():print(f[SKIP] flow目录不存在:{flow_dir})sys.exit(0)flow_fileslist(flow_dir.glob(*.flow.json))ifnotflow_files:print(f[SKIP] 未找到flow文件)sys.exit(0)print(f找到{len(flow_files)}个流程文件开始校验...\n)all_passedTrueforfpinflow_files:ifnotvalidate_flow_file(fp):all_passedFalseifall_passed:print(f\n全部通过共校验{len(flow_files)}个文件。)sys.exit(0)else:print(f\n存在不通过项请修复后重新提交。)sys.exit(1)if__name____main__:main()部署脚本ci/deploy.py#!/usr/bin/env python3# -*- coding: utf-8 -*- 影刀RPA流程部署脚本 用途将流程文件部署到影刀服务端/Worker节点 作者林焱 importargparseimportosimportshutilimporthashlibimportdatetimefrompathlibimportPath# 影刀服务端API地址根据实际环境修改YINGDAO_API{test:http://yingdao-test.internal/api,prod:http://yingdao.internal/api}# 部署目标路径影刀Worker的流程目录DEPLOY_TARGETS{test:/opt/yingdao/worker/flows/test/,prod:/opt/yingdao/worker/flows/prod/}defcalculate_checksum(filepath):计算文件SHA256校验和用于部署验证sha256hashlib.sha256()withopen(filepath,rb)asf:forchunkiniter(lambda:f.read(8192),b):sha256.update(chunk)returnsha256.hexdigest()defbackup_existing(target_dir):部署前备份现有流程确保可回滚backup_dirtarget_dir.backup.datetime.datetime.now().strftime(%Y%m%d_%H%M%S)ifos.path.exists(target_dir):shutil.copytree(target_dir,backup_dir)print(f[INFO] 已备份到:{backup_dir})returnbackup_dirdefdeploy_flows(source_dir,target_dir,version):核心部署逻辑sourcePath(source_dir)/flowifnotsource.exists():print(f[ERROR] 源flow目录不存在:{source})returnFalse# 1. 备份backup_dirbackup_existing(target_dir)bak_logbackup_dir/deploy_info.txt# 2. 写入部署信息os.makedirs(os.path.dirname(bak_log),exist_okTrue)withopen(bak_log,w)asf:f.write(f部署版本:{version}\n)f.write(f部署时间:{datetime.datetime.now().isoformat()}\n)f.write(f操作人: 自动部署(CI/CD)\n)# 3. 复制流程文件os.makedirs(target_dir,exist_okTrue)forflow_fileinsource.glob(*.flow.json):destos.path.join(target_dir,flow_file.name)shutil.copy2(flow_file,dest)checksumcalculate_checksum(dest)print(f[DEPLOY]{flow_file.name}-{dest}(SHA256:{checksum[:12]}...))# 4. 写入版本信息文件version_fileos.path.join(target_dir,VERSION)withopen(version_file,w)asf:f.write(f{version}\n{datetime.datetime.now().isoformat()})print(f[SUCCESS] 部署完成版本:{version})print(f[INFO] 如需回滚恢复备份:{backup_dir})returnTrueif__name____main__:parserargparse.ArgumentParser(description影刀RPA流程部署工具)parser.add_argument(--env,choices[test,prod],requiredTrue,help目标环境)parser.add_argument(--version,requiredTrue,help部署版本号)argsparser.parse_args()source_diros.getcwd()target_dirDEPLOY_TARGETS[args.env]print(f[INFO] 开始部署到{args.env}环境)print(f[INFO] 源目录:{source_dir})print(f[INFO] 目标目录:{target_dir})print(f[INFO] 版本:{args.version})print(-*50)successdeploy_flows(source_dir,target_dir,args.version)ifnotsuccess:print([ERROR] 部署失败)exit(1)7. Git Hooks 安装阻止敏感信息提交# pre-commit钩子 — 阻止包含敏感信息的提交cat.git/hooks/pre-commitHOOK #!/bin/bash # 影刀RPA项目 pre-commit 钩子 # 功能阻止包含密码、Token等敏感信息的提交 SENSITIVE_PATTERNS( password\s*[:]\s*[]\S token\s*[:]\s*[]\S secret\s*[:]\s*[]\S api_key\s*[:]\s*[]\S ) FILES$(git diff --cached --name-only --diff-filterACM) HAS_ISSUE0 for FILE in $FILES; do for PATTERN in ${SENSITIVE_PATTERNS[]}; do if git diff --cached $FILE | grep -qiE $PATTERN; then echo [BLOCKED] 文件 $FILE 包含敏感信息禁止提交 HAS_ISSUE1 fi done done if [ $HAS_ISSUE -eq 1 ]; then echo echo 请将敏感信息移至环境变量或 .env 文件.env已加入.gitignore exit 1 fi echo [CHECK] 敏感信息检查通过 exit 0 HOOKchmodx .git/hooks/pre-commit常见问题速查Q1: 流程文件太大Git diff 根本看不懂现象.flow.json文件动辄几千行MR里的diff一塌糊涂。原因影刀在保存时会写入大量坐标、样式等运行时信息这些不属于核心逻辑。解决在影刀RPA编辑器里点击流程属性 → 勾选保存时精简JSON。或者用后处理脚本# cleanup_flow.py — 提交前清理冗余字段importjsondefcleanup_flow(filepath):withopen(filepath,r,encodingutf-8)asf:datajson.load(f)# 删除UI相关的冗余字段REDUNDANT_KEYS[position,style,viewState,expanded]fornodeindata.get(nodes,[]):forkeyinREDUNDANT_KEYS:node.pop(key,None)withopen(filepath,w,encodingutf-8)asf:json.dump(data,f,ensure_asciiFalse,indent2)Q2: 合并冲突怎么解决现象两人同时改了同一个流程merge 时 JSON 冲突。原因JSON 本质是纯文本Git 按行合并不理解 JSON 语义。解决在影刀编辑器中分别打开冲突双方的文件手动整合变更内容导出为新文件覆盖冲突文件git add . git commit预防拆分流程粒度一个人负责一个子流程文件尽量避免多人编辑同一个.flow.json。Q3: .gitignore 不生效现象已经tracked的文件加到.gitignore后仍然被追踪。原因Git 只忽略 untracked 文件已追踪的文件需要先移除缓存。解决gitrm-r--cachedscreenshot/gitrm-r--cacheddata/gitcommit-mchore: 移除不应追踪的文件Q4: 历史版本太多仓库体积爆炸temu店群自动化报活动案例现象仓库超过500MBclone 巨慢。原因截图等二进制文件被误提交到历史中。解决# 分析大文件gitrev-list--objects--all|gitcat-file --batch-check%(objecttype) %(objectname) %(objectsize) %(rest)|awk/^blob/ {print $3, $4}|sort-nr|head-20# 从历史中彻底删除大文件谨慎操作gitfilter-branch--force--index-filtergit rm --cached --ignore-unmatch screenshot/*.png--prune-empty --tag-name-filtercat----allgitreflog expire--expirenow--allgitgc--prunenow--aggressiveQ5: 生产环境流程被人直接改了怎么发现现象Git上的版本和生产跑的版本不一致。原因有人绕过Git直接在生产环境改文件。解决定时检查脚本配合告警。# check_integrity.py — 定期检查生产环境流程文件完整性importhashlibimportjson# 从版本文件中读取部署时的checksumwithopen(/opt/yingdao/worker/flows/prod/VERSION,r)asf:deployed_versionf.readline().strip()# 重新计算当前文件的checksumcurrent_checksumhashlib.sha256()forflow_fileinsorted(Path(/opt/yingdao/worker/flows/prod/).glob(*.flow.json)):withopen(flow_file,rb)asf:current_checksum.update(f.read())expectedget_expected_checksum(deployed_version)# 从Git读取ifcurrent_checksum.hexdigest()!expected:send_alert(生产环境流程文件被篡改)Q6: 多人协作时变量命名冲突现象合并后流程报错变量未定义。原因不同开发者在不同分支新增了同名变量但类型不同。解决制定全局变量命名规范用模块前缀g_orderId # g_ 全局变量 l_rowIndex # l_ 局部变量 p_pageNum # p_ 参数变量推荐资源Pro Git 中文版https://git-scm.com/book/zh/v2 — Git官方教程必读Conventional Commitshttps://www.conventionalcommits.org/zh-hans/ — commit规范GitLab CI/CD文档https://docs.gitlab.cn/jh/ci/ — 中文文档CI/CD配置参考影刀RPA开发者文档影刀官方帮助中心 → 开发者模式 → 流程文件说明pre-commithttps://pre-commit.com/ — 自动化Git hooks管理工具内容标签#影刀RPA#Git版本控制#DevOps#CI/CD#团队协作#RPA工程化作者林焱