尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

怎么给 Keploy CI 添加一个新的示例应用和对应矩阵任务?

怎么给 Keploy CI 添加一个新的示例应用和对应矩阵任务? 怎么给 Keploy CI 添加一个新的示例应用和对应矩阵任务【免费下载链接】keployOpen-source platform for creating safe, isolated production sandboxes for API, integration, and E2E testing.项目地址: https://gitcode.com/GitHub_Trending/ke/keployKeploy 的 CI 通过record → replay矩阵验证每次 PR先构建本 PR 的二进制和最新 release 二进制再对每个示例应用跑三组 record/replay 组合。当你有一个新的示例应用比如新协议、新依赖栈的测试靶子需要把它接进 CI让每次 PR 都自动跑它的 record/replay。整条路径涉及三处改动示例应用本身在keploy/samples-lang示例仓库、CI 测试脚本本仓库.github/workflows/test_workflow_scripts/、语言工作流的矩阵条目如 golang_linux.yml。本文按仓库内 CI_CONTRIBUTING.md、AGENTS.md 和 keploy-e2e-test 技能文档 给出的真实约定来走一遍。先确认改动落在哪三处仓库在 AGENTS.md 的 Where to look first for common changes 中给Adding a sample to CI 指的路径是一个示例仓库samples-go、samples-python、samples-typescript、samples-java里的应用目录.github/workflows/test_workflow_scripts/lang/script_dir/下的测试脚本对应语言工作流里的一个 matrix 条目。各语言脚本目录与示例仓库的对应关系来自 AGENTS.mdCI 工作流示例仓库示例位置golang_linux.yml、golang_docker.yml、grpc_linux.ymlkeploy/samples-gosamples-go/pathpython_linux.yml、python_docker.ymlkeploy/samples-pythonsamples-python/pathnode_linux.yml、node_docker.ymlkeploy/samples-typescriptsamples-typescript/pathjava_linux.ymlkeploy/samples-javasamples-java/path准备示例应用在 samples 仓库先在你对应的keploy/samples-lang仓库里放好应用。技能文档给出的要求保持最小一个二进制/模块、一个 HTTP 面、必要时一个依赖结构对照同一仓库里最小的现有示例Go 可参考samples-go/http-pokeapiPython 参考samples-python/flask-secret。示例应用不能直接合并进组织的示例仓库需要在那里单独开 PR。若本次任务范围不含这个 PR应如实说明并先提交示例内容而不是静默去 checkout 一个不存在的分支。编写 CI 测试脚本在 keploy 仓库新建.github/workflows/test_workflow_scripts/lang/script_dir/lang-linux.sh。命名约定script_dir取示例文件夹名的下划线小写形式例如echo-mysql→echo_mysql、http-pokeapi→http_pokeapi但go-grpc保留了连字符所以拿不准时照抄最接近的邻居不要盲目规范化。脚本内容直接复制同语言最接近的现有脚本作为模板。技能文档列出的规范参考Go HTTP.github/workflows/test_workflow_scripts/golang/http_pokeapi/golang-linux.shGo SQL/MySQLgolang/echo_mysql/golang-linux.shNode Mongonode/express_mongoose/node-linux.shPython Flaskpython/flask-secret/python-linux.shJava Postgresjava/spring_petclinic/java-linux.shgRPCgolang/go-grpc/grpc-linux.sh以 echo_mysql 的脚本 为例所有脚本的共同骨架AGENTS.md 也总结了同一列表断言RECORD_BIN/REPLAY_BIN已由调用方设置且是可执行路径这两个环境变量由工作流的download-binary步骤通过steps.id.outputs.path注入rm -rf keploy/ keploy.yml清理上一轮产物再$RECORD_BIN config --generate生成配置必要时用sed写入噪声规则如sed -i s/global: {}/global: {body: {updated_at:[]}}/ ./keploy.yml构建示例应用go build、npm ci、mvn package等启动依赖容器并等待就绪如wait_for_mysql循环定义流量驱动函数如send_request轮询健康端点后发请求用$RECORD_BIN record -c app cmd --generateGithubActionsfalse后台跑 1~2 轮记录日志重定向到文件记录日志中 grepERROR与WARNING: DATA RACE后者以及 DATA RACE 检查失败会直接让脚本返回非零停掉依赖容器强制 replay 走 mock能暴露 mock missed 回归用$REPLAY_BIN test -c app cmd --delay N --generateGithubActionsfalse重放遍历./keploy/reports/test-run-*/test-set-*-report.yaml取最新一个 test-run 目录逐个检查status:行任一不是PASSED就 exit 1。如果示例应用不在 samples 仓库的main分支上按echo_mysql、risk_profile、sse_preflight的现有模式在脚本开头git fetch origin git checkout origin/branch并在 samples 仓库侧的 PR 描述中注明该分支。在语言工作流里添加矩阵条目主路径是复用现有的语言工作流不新建顶层 workflow 文件——prepare_and_run.yml里的gate任务依赖的是既有工作流名run_golang_linux等新增 workflow 文件不会成为 required check。以 Go 原生 Linux 为例在 golang_linux.yml 的matrix.app下追加一条app: # ... 现有条目 ... - name: my-sample # 显示名 path: my-sample # samples-go 里的目录名 script_dir: my_sample # test_workflow_scripts/golang/ 下的目录名 enable_ssl: true # 可选该工作流特有的额外轴没有就删掉name、path、script_dir三个字段是必须项path是 samples 仓库里的目录script_dir是test_workflow_scripts/lang/下的目录再按该工作流已有的轴如mode、enable_ssl补充。config维度保留标准的三行不要裁剪config: - job: record_latest_replay_build record_src: latest replay_src: build - job: record_build_replay_latest record_src: build replay_src: latest - job: record_build_replay_build record_src: build replay_src: build这三行的作用是保证 mock 格式的前向与后向兼容你的改动必须能与最近一次 release 的二进制双向互操作。如果某个功能只能在两端都是新二进制时工作要按 risk_profile 脚本 的方式用能力探测脚本内对REPLAY_BIN是否为*/build/keploy分支处理把差异 gate 住而不是砍掉矩阵行。每个矩阵 job 的实际执行步骤照抄现有 job 即可- id: record uses: ./.github/actions/download-binary with: src: ${{ matrix.config.record_src }} - id: replay uses: ./.github/actions/download-binary with: src: ${{ matrix.config.replay_src }} - name: Checkout the samples-go repository uses: actions/checkoutv4 with: repository: keploy/samples-go path: samples-go ref: main - name: Run ${{ matrix.app.name }} application env: RECORD_BIN: ${{ steps.record.outputs.path }} REPLAY_BIN: ${{ steps.replay.outputs.path }} run: | cd samples-go/${{ matrix.app.path }} source $GITHUB_WORKSPACE/.github/workflows/test_workflow_scripts/golang/${{ matrix.app.script_dir }}/golang-linux.shdownload-binary是 复合 action它下载名为srcbuild、build-no-race或latest的工件chmod x其中的keploy并输出绝对路径path。job 的显示名会自动拼成app.name (config.job)所以一个新应用会展开成三个 CI job。矩阵里保留fail-fast: falseCI_CONTRIBUTING.md 解释了原因让所有组合都跑完单个失败不掩盖其他回归。可选分支确实需要新的 workflow 文件只有当现有语言工作流都不合适时才按 CI_CONTRIBUTING.md 的 checklist 新建文件复制同类的golang_linux.yml改名并把它接到 prepare_and_run.yml 的 fan-out 里run_new_workflow_name: needs: [build-and-upload, upload-latest] uses: ./.github/workflows/new_workflow_name.yml若该示例走 Docker 模式把build-docker-image-amd64macOS 侧为build-docker-image-arm64加入needs并在启动应用前插入download-image步骤加载docker-image-linux-amd64工件。同时注意gate的needs列表也要包含你的新任务名否则它不参与把关。本地先跑通再提交 CI提交前在本地用 CI 完全相同的姿势跑一遍脚本来自技能文档 Step 4# 与 CI 的 build-no-race 工件一致 go build -tagsviper_bind_struct -o ./out/build-no-race/keploy . # 与 CI 的 build 工件一致带 race 检测需要 CGO CGO_ENABLED1 go build -race -tagsviper_bind_struct -o ./out/build/keploy .viper_bind_structbuild tag 是必需的漏掉会导致配置字段在运行时无法正确绑定。然后克隆对应 samples 仓库到 keploy 仓库旁samples repo按语言替换如https://github.com/keploy/samples-go进入示例目录后运行脚本git clone https://github.com/keploy/samples-go ../samples-go cd ../samples-go/my-sample RECORD_BIN/abs/path/to/keploy/out/build/keploy \ REPLAY_BIN/abs/path/to/keploy/out/build/keploy \ GITHUB_WORKSPACE/abs/path/to/keploy \ bash -x $GITHUB_WORKSPACE/.github/workflows/test_workflow_scripts/golang/my_sample/golang-linux.sh其中/abs/path/to/keploy替换为你本机 keploy 仓库根的绝对路径——GITHUB_WORKSPACE必须指向仓库根因为脚本会通过它定位test-iid.sh等辅助脚本RECORD_BIN/REPLAY_BIN替换为你的构建产物路径。平台限制要知道Linux 上 eBPF 抓包需要 root脚本内部对特定命令选择性使用sudo不要自己在脚本外整体加sudomacOS/Windows 上这套lang-linux.sh脚本不能原样跑要么走*_macos.yml/*_windows.yml对应物要么如实说本地无法复现、交给 CI 验证。缺 Docker 或内核不支持 eBPF 时同样要明说不能没有真实运行就声称通过。成功判定与 CI 验证脚本自身的成功标准技能文档 Step 5最新./keploy/reports/test-run-*目录下所有test-set-*-report.yaml的status:都是PASSEDRUN_DIR$(ls -1dt ./keploy/reports/test-run-* | head -n1) for rpt in $RUN_DIR/test-set-*-report.yaml; do awk /^status:/{print FILENAME: $2; exit} $rpt donerecord 与 replay 日志中不出现ERROR和WARNING: DATA RACEgrep -E ERROR|WARNING: DATA RACE若改动是修复类先用改动前的二进制跑一遍脚本、确认失败再跑改动后的确认通过。推送到 PR 后prepare_and_run.yml会自动构建build、build-no-race、latest三个工件并 fan-out 到你的矩阵 job。注意两点唯一必须通过的 status check 是gatejob它汇总所有上游 job 的result单独重跑gate没有意义它只是重新检查上游结果失败了要重跑全部相关 job你的新应用会展开为app-name (record_latest_replay_build)、... (record_build_replay_latest)、... (record_build_replay_build)三个 job任何一个红都说明该组合下有兼容性问题。排错与边界CI job 失败但日志看不到明显错误时先看退出码定位是哪个环节挂了CI_CONTRIBUTING.md 给的排错入口exit code 127 通常是引用的二进制找不到其余常见为权限或文件缺失然后回查上一步成功的 step对照脚本里对应的 bash 行。不要提交keploy/、keploy.yml、*_logs.txt等每次运行都会重新生成的产物。只编译通过不算验证go build成功不能替代一次真实的 replay 运行。交叉版本矩阵那三行不能省——它就是防止 mock 格式不兼容进入main的机制确实只能两端同版本才工作的行为按risk_profile/connect_tunnel脚本的写法做能力探测。【免费下载链接】keployOpen-source platform for creating safe, isolated production sandboxes for API, integration, and E2E testing.项目地址: https://gitcode.com/GitHub_Trending/ke/keploy创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表