{"id":13756960,"url":"https://github.com/boylegu/regal","last_synced_at":"2025-04-04T09:10:04.389Z","repository":{"id":57460850,"uuid":"48360430","full_name":"boylegu/regal","owner":"boylegu","description":"A/B Testing or gray released smart grouping engine","archived":false,"fork":false,"pushed_at":"2022-10-18T15:35:36.000Z","size":270,"stargazers_count":401,"open_issues_count":3,"forks_count":115,"subscribers_count":45,"default_branch":"master","last_synced_at":"2025-03-28T08:04:50.632Z","etag":null,"topics":["ab-test","gray-release","python","python3"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/boylegu.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2015-12-21T08:37:41.000Z","updated_at":"2024-11-11T18:16:06.000Z","dependencies_parsed_at":"2022-09-16T15:51:23.445Z","dependency_job_id":null,"html_url":"https://github.com/boylegu/regal","commit_stats":null,"previous_names":[],"tags_count":4,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/boylegu%2Fregal","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/boylegu%2Fregal/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/boylegu%2Fregal/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/boylegu%2Fregal/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/boylegu","download_url":"https://codeload.github.com/boylegu/regal/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247149505,"owners_count":20891954,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ab-test","gray-release","python","python3"],"created_at":"2024-08-03T11:00:59.274Z","updated_at":"2025-04-04T09:10:04.369Z","avatar_url":"https://github.com/boylegu.png","language":"Python","funding_links":[],"categories":["Python"],"sub_categories":[],"readme":"Regal\n=====\n\n[![pyversions](https://img.shields.io/badge/python-2.6%2C2.7%2C3.4%2C3.5-blue.svg)]()\n[![ver](https://img.shields.io/badge/release-v1.3-red.svg)]()\n[![MIT](https://img.shields.io/badge/license-MIT-blue.svg)]()\n[![coverage](https://img.shields.io/badge/coverage-92%25-yellowgreen.svg)]()\n[![Build Status](https://travis-ci.org/boylegu/regal.svg?branch=master)](https://travis-ci.org/boylegu/regal)\n[![Code Climate](https://codeclimate.com/github/boylegu/regal/badges/gpa.svg)](https://codeclimate.com/github/boylegu/regal)\n\n用于\"灰度发布\"或 A/B Testing的智能分组引擎\n\n\u003cp align=\"center\"\u003e\n  \u003ca href =\"##\"\u003e\u003cimg alt=\"sanic_vue\" src=\"https://github.com/boylegu/regal/blob/master/image/logo.jpg?raw=true\"\u003e\u003c/a\u003e\n\n## Regal能做什么？\n举个最简单的例子，比如需要针对一个版本进行灰度发布，而这一版本对应的可能是一大堆服务器集群， 如下图:\n\n![Markdown](https://github.com/boylegu/regal/blob/master/image/regal_img.png?raw=true)\n\n就像图中描述的一样，无论你的服务器是多还是少，尤其很多中小型企业在进行灰度发布时，通常会遇到所制定的分流策略在实际的技术或开发中如何去实现，是机器直接写死？\n\n因此让``Regal智能分组引擎``直接介入，让它来根据你的策略提前进\u0010行动态地分组分流。\n在这里，我再举一个简单的例子，方便大家能够更清楚的明白Regal的主要工作：\n\n假设有一个版本A，需要针对六台机器进行发布\n\n![Markdown](https://github.com/boylegu/regal/blob/master/image/regal_imag2.png?raw=true)\n\n现在应该已经了解Regal到底是什么干货了吧，当然了，上面的例子是服务器非常少的情况，实际情况中，所面对的服务器集群是非常多，这个时候可以通过提供的``combine``和``schedule``两个API进行策略调整。详情可以见下文的``使用介绍``\n\n- Feature：\n\n  1. 提供发布策略，动态智能分流\n  2. 支持多版本分组和优先级\n  3. 数据格式化\n  4. 同时兼容Python2.5以上和Python3以上的版本（建议使用Python2.7+或者Python3.5以后的版本）\n  \n\n## 安装和使用\n\n### 安装\n\n -  `` pip install regal ``\n\n### 使用说明\n\n- 单个版本场景\n\n```\nIn [1]: from regal import BaseInfo\n\n\n# 初始化信息，请注意一下格式\nIn [6]: ab = BaseInfo(\nversion_host={'app-test-version1.0':'10.1.1.1,10.1.1.2,10.1.1.3,10.1.1.4,10.1.1.1.5'},\ncombine=2    # combine 希望以每组多少台服务器作为一组,进行用户群B的分流\n             # 在这个例子中为2台\n             # 默认：每组1台\n)\n\n# grouping() 进行分组\nIn [11]: smart_grouping = ab.grouping() \n\n\n# result属性 进行分组后的返回结果\nIn [12]: smart_grouping.result\nOut[12]:\n[('app-test-version1.0',\n  [['10.1.1.1'], ['10.1.1.2', '10.1.1.3'], ['10.1.1.4', '10.1.1.1.5']])]\n```\n根据你的策略设置，会得到一个数据结构，我们来观察一下：\n\n![Markdown](https://github.com/boylegu/regal/blob/master/image/regal_imag3.png?raw=true)\n\n再看一个例子\n\n```\nIn [7]: ab = BaseInfo(\nversion_host={'app-test-version1.0':'10.1.1.1,10.1.1.2,10.1.1.3,10.1.1.4,10.1.1.5'},\ncombine=3,\nschedule=2)\n\nIn [10]: ab.grouping().result\nOut[10]:\n[('app-test-version1.0',\n  [['10.1.1.1,10.1.1.2'], ['10.1.1.3', '10.1.1.4', '10.1.1.5']])]\n\n```\n\n- 多版本场景\n\n``` \nIn [17]: ab = BaseInfo(\n   ....: version_host={\n   ....: 'app-test-version1.0': '10.1.1.1,10.1.1.2,10.1.1.3,10.1.1.1.4,10.1.1.5',\n   ....: 'app-test-version2.0': '10.1.1.9,10.1.1.8,10.1.1.7,10.1.1.6'},\n   ....: combine=3,\n   ....: schedule=2\n   ....: )\n   \nIn [20]: ab.grouping().result\nOut[20]:\n[('app-test-version2.0', [['10.1.1.9,10.1.1.8'], ['10.1.1.7', '10.1.1.6']]),\n ('app-test-version1.0',\n  [['10.1.1.1,10.1.1.2'], ['10.1.1.3', '10.1.1.1.4', '10.1.1.5']])]   \n\n\n# grouping()方法还提供了priority_name参数，当需要在多版本发布的时候，设置优先级，指定你需要优先发布的'版本名'\n In [22]: smart_grouping = ab.grouping(priority_name='app-test-version1.0')\n\nIn [23]: smart_grouping.result\nOut[23]:\n[('app-test-version1.0',\n  [['10.1.1.1,10.1.1.2'], ['10.1.1.3', '10.1.1.1.4', '10.1.1.5']]),\n ('app-test-version2.0', [['10.1.1.9,10.1.1.8'], ['10.1.1.7', '10.1.1.6']])]\n\n# 提供一个简易的API，可以让结果返回的更简洁  \nIn [16]: for i in smart_grouping.iter_dict():   \n    print i\n   ....:\n{'app-test-version1.0': ['10.1.1.1', '10.1.1.2,10.1.1.3', '10.1.1.4,10.1.1.1.5']}\n\n```\n\n## Demo\n\n- 你也可以通过 `` git clone https://github.com/boylegu/regal/ ``\n\n- `` cd regal/ ``\n\n- 参考`` example.py ``\n\n\n## 分流分组之后？\n\nRegal本身只是一个分组引擎，因此它并不承担直接发布的作用，但是通过Regal分组之后，你所得到数据，是非常容易和其他可以用来发布的组件进行配合；下面是我的一些建议和指导。\n\n```\nversionA:\n\n  （第一组）    groupA   ip......     用户群A    \n  （第二组）    groupB1  ip...... __ \n  （第三组）    groupB2  ip......   |\n  （第四组）    groupB3  ip......   | --   用户群B   \n   ......                       --|\n```\n\n- 关于发布\n\n  分组之后，每一组的所有机器可以看作一个整体，扔进发布组件，进行'组内并发'\n\n  你可以把每一组直接放在ansible、saltstack、pssh或异步IO框架等等进行发布；\n  \n  甚至你也可以和前端nginx＋lua进行组合；\n\n- 关于停止发布\n\n  每组进行发布，一旦出现异常，你可以利用发布组件，或者你自己写一套异常抓取工具来停止发布，这个时候就不会再针对剩下的组进行发布操作了。\n\n- 关于回滚\n\n  把回滚也看作一种发布,就不多说了\n\n## 作者\n\n- 顾鲍尔 (Boyle Gu)\n  \n## 技术交流与支持\n\n有任何问题、建议可以通过Github；\n\n也可以直接加入讨论群 QQ：315308272 与我进行交流\n\n\n## Darwin's finches\n\n![Markdown](https://github.com/boylegu/regal/blob/master/image/regal-logo.jpg?raw=true)\n\n第一次在Mac上绘图，这就当做本项目的吉祥物吧～\n\n人类的创造从来没有离开大自然带给我们的启发，而无论是灰度发布，还是A/B Testing，早在千年以前，大自然早有绝佳的解决方案。因此我以‘Darwin's finches’作为原型，手工绘制了这张图，向伟大的大自然和达尔文《物种起源》致敬。\n\n\u003e Author: 顾鲍尔     \n\u003e Date： 2015.12.23 绘\n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fboylegu%2Fregal","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fboylegu%2Fregal","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fboylegu%2Fregal/lists"}