Gino Keva - Git Notes的关键值
Gino Keva是一个建立在Git Notes之上的简单的键值存储,使用一个事件源架构。
- 当通过get或unset操作键值时,事件被添加到当前的提交中。
- Gino Keva通过重放截至当前提交的所有事件来编制所有历史键值的快照。
使用案例
尽管Gino Keva是在考虑到以下使用情况下编写的,但它打算成为一个通用工具。如果你的目的是非常不同的,请不要气馁。相反,你可以自由地打开一个票据,这样我们就可以讨论我们是否可以使它发挥作用。
Gino Keva的需求是在一个环境中产生的,在这个环境中,大约有20个组件(有些人称之为微服务)共同生活在一个单一的资源库中。每个组件都被部署在一个docker容器中,它们共同构成了一个应用程序/服务。有一个单一的构建管线,在任何变化时都会触发。然后,该管道将扇形展开,为受变化影响的每个组件触发一个独立的构建(和测试)。对于每个组件,这将产生一个新的docker容器,并将其版本推送到注册表。一旦所有的组件被重建,这组容器(其中一些是新构建的)可以被部署和测试,并最终被推广到生产中。
由于选择性的构建机制,组件的版本是不耦合的。有些会很少变化,有些会经常变化。现在,如何跟踪构成应用程序的容器集?把这些构建元数据保存在版本控制系统内是有意义的,这样我们就可以为每个构建的提交提供元数据。但我们不愿意看到构建管道用人为的提交污染了git历史。这就是Gino Keva诞生的地方。
用例 - 存储新的组件版本
Gino Keva用于存储任何组件的新构建版本,作为git注释中的键/值对,与它的构建提交相联系:COMPONENT_foo=1.1.0 。
用例--列出某次提交对应的所有组件版本
对于每一次部署,构成应用程序的容器列表都是根据gino-keva list 的输出来简单收集的。
| 之前 | 之后 |
|---|---|
| COMPONENT_foo=1.0.0 | COMPONENT_foo=1.1.0 (更新) |
| component_bar=1.2.3 | COMPONENT_BAR=1.2.3 (未触动) |
| …. | …. |
要求
- Git CLI:Gino Keva使用安装在主机上的git CLI。使用2.32.0版本进行测试,但任何最新版本都可以。
如何使用
请看下面关于如何使用gino-keva的例子,或者运行gino-keva --help 以获得帮助。
警告。推送你的修改
默认情况下,gino-keva不会将你的修改推送到上游。你可能希望通过指定--push ,或设置环境变量GINO_KEVA_PUSH=1 ,来改变这一行为。如果你不这样做,后续的检索将覆盖任何本地的修改。
设置键/值对
[email protected] (f10b970d):~$ gino-keva set key my_value
[email protected] (f10b970d):~$ gino-keva set counter 12
[email protected] (f10b970d):~$ gino-keva set foo bar
列出所有键/值对
[email protected] (f10b970d):~$ gino-keva list
counter=12
foo=bar
key=my_value
[email protected](f10b970d): git commit -allow-empty -m "Dummy commit"[\[email protected\]](https://golangexample.com/cdn-cgi/l/email-protection)(a8517558): gino-keva set pi 3.14[email protected](a8517558):~$ gino-keva list -output=json { "counter" :"12", "foo":"bar", "key":"my_value", "pi":“3.14”}
### Unset keys
Finally, you can unset keys using `unset`:
```console
[email protected] (a8517558):~$ gino-keva unset foo
[email protected] (a8517558):~$ gino-keva list
counter=12
key=my_value
pi=3.14
使用自定义笔记参考
默认情况下,笔记被保存在refs/notes/gino-keva ,但这可以通过--ref 命令行开关来改变。要将你的键/值存储在refs/notes/banana:
[email protected] (a8517558):~
FAQ
我需要额外的git配置?我怎样才能做到这一点?
由于Gino Keva只是使用git CLI,你可以使用它提供的(大部分)选项来设置/覆盖配置。你可以使用git config 来设置系统,或者使用环境变量来实现同样的目的。
例子。添加一个键/值对作为 "whatever <[email protected]>"的用户
GIT_CONFIG_COUNT=2 \
GIT_CONFIG_KEY_0="user.name" GIT_CONFIG_VALUE_0="whatever" \
GIT_CONFIG_KEY_1="user.email" GIT_CONFIG_VALUE_1="[email protected]" \
gino-keva set foo bar
我需要一个自定义的输出格式
Gino Keva只支持简单的key=value 格式(默认),或json (--output=json)。然而,你可以用你喜欢的任何格式来解析输出。
例子。使用gino-keva作为GitHub动作的一部分。
[email protected]:~$ gino-keva list | awk -F= '{print "::set-output name="$1"::"$2}'
::set-output name=COUNTER::12
::set-output name=key::my_value
::set-output name=PI::3.14
例子。使用gino-keva作为Azure Devops管道的一部分。
[email protected]:~$ gino-keva list | awk -F= '{print "##vso[task.setvariable variable="$1"]"$2}'
##vso[task.setvariable variable=COUNTER]12
##vso[task.setvariable variable=key]my_value
##vso[task.setvariable variable=PI]3.14