一个简单的Git Notes键值存储

1,501 阅读3分钟

Build and TestGo Report Card

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.0COMPONENT_foo=1.1.0 (更新)
component_bar=1.2.3COMPONENT_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

GitHub

github.com/philips-sof…