将Redash对象作为文件管理,实现版本控制和开发环境
项目描述
Redasher
此工具将Redash对象(仪表板、查询、可视化等)序列化为文件系统,以便可以使用像Git这样的工具进行维护。
此工具的目的是将Redash对象序列化,以便可以使用Git等工具进行维护。您可以使用它来跟踪更改,或者甚至可以使用文本编辑器修改这些对象并更新实例。通过跟踪第二个Redash实例,您可以使用此工具在它们之间同步对象。例如,在开发环境中创建和测试更改,然后将这些更改应用到生产环境中非常有用。
用法
让我们首先定义我们的生产服务器,通过设置基础URL和我们用于交互的用户API密钥。
redasher setup prod http://redash.mycompany.com:8012 a2xcvvr23werwcdvhtsdfa23424df
将在~/.config/redash_gitstudio/config.yaml
中创建一个配置文件。
然后从prod
下载所有对象
redasher checkout prod
这将在当前目录中创建以下目录结构
maps/
maps/prod.yaml # mappings from local files to object ids in `prod` server
dashboards/<name>/metadata.yaml # dashboards metadata
dashboards/<name>/widgets/<name>.yaml # dashboard widgets
queries/<name>/query.sql # The query string file
queries/<name>/metadata.yaml # The rest of the metadata
queries/<name>/visualizations/<name>.yaml # query visualizatons
您可以将这些文件放在像git这样的版本控制系统的翼下,并在任何步骤中运行checkout和提交结果文件来跟踪您的redash对象更改。
您还可以修改这些文件的内容,然后将其上传回服务器
redasher upload prod dashboard/my-dashboard
另一种常见的流程是使用内部服务器开发,不影响生产用户,完成后同步更改。
为此,您必须定义一个新的服务器
redasher setup dev http://localhost:8080 sdfa23424dfa2xcvvr23werwcdvht
Redash 数据源对象被视为只读。如果您想同步两个服务器,首先您必须手动将来自第一个服务器的数据源文件对象绑定到第二个服务器中创建的等效数据源ID。
redasher bind dev datasource/my-database.yaml 3
然后您可以上传对象以创建它们。
redasher upload dev dashboard/my-dashboard
从现在开始,对新服务器的连续文件上传将是同一对象的更新。
理解地图/
目录 maps
包含每个服务器的文件。这些文件将服务器对象ID与文件对象相关联。这种关系是在您第一次从服务器签出对象或第一次上传对象到服务器并创建新对象时设置的。
当您将文件对象上传到服务器时。如果文件对象已在服务器上绑定了一个ID,则对象将被更新。否则,将创建新对象。
同样,每次您从服务器签出对象时,如果存在映射,内容将写入同一文件。如果没有,将根据当前对象名称的slug生成适当的文件名。如果该名称已存在,则添加序列号。
您也可以像上一个示例中的数据源一样,使用 bind
子命令手动设置服务器映射。
设计
决策日志
- 使用 slug 化名称作为对象文件名,因为它们比哈希更容易识别
- 即使对象的名称后来更改,也保留 slug 化名称
- 使用引用对象路径名称的属性映射非组合关系,而不是ID。
- 来自服务器的数字ID是实例相关的
- 常见的数字序列化ID可以解决这个问题,但搜索和替换会更困难
- 组合关系(仪表板 -> 小部件,查询 -> 可视化)被映射为目录层次结构。这便于整体复制对象。
- 每个 Redash 实例中的ID都不同,因此“实例ID”到“对象文件”的映射应按实例跟踪
- 虽然生产对象映射应该是共享存储库的一部分,但私有开发服务器对于单个开发者可能是有意义的。因此,文件-ID映射应在每个文件中不同,这样您可以选择哪些服务器在存储库中共享。
- 应建立从ID和文件对象到永久映射
- 第一次下载特定服务器对象,且在该服务器上之前没有绑定
- 第一次将文件对象上传到特定服务器,且在该服务器上之前没有绑定
- 后续的上传和下载应保持该绑定
- 将文件对象上传到已绑定的服务器,应更新对象而不是创建它
- 从已绑定到文件对象的服务器下载对象,将覆盖相同的文件对象
- 数据源也会进行映射,但不会在上传时更新,因为它们可能指向不同的数据库配置,这取决于实例。
- 因此,在将引用数据源的对象上传到新实例之前,必须在实例中创建该实例并使用 bind 命令绑定,然后再上传。
- 服务器配置不应提交,并且API密钥应保持私有,因此它已从服务器ID映射中分离到用户配置文件。
- 用户在生产环境和测试环境中可能不同,可以使用不同的用户创建仪表板。因此,创建和修改用户不被保留
- 对象创建和修改日期不应保留,或者它们应该保留吗?(它们可能用于比较更新时间和检测覆盖更改)
- 级联上传
- 上传仪表板上传所有其小部件
- 上传小部件上传其仪表板和其可视化
- 上传可视化上传其查询
- 上传查询时会上传其数据源、可视化以及任何参数查询
待办事项
- 部分检出
- 警报和目的地
- 组
- 检测上传时的覆盖更改
- 自动执行git操作