我正在寻求有关如何确保不覆盖属性/ YAML文件中某些值的帮助。
例如,我有一个Spring Boot项目和一个具有以下属性的properties.yml
。
spring:
datasource:
url: ${jdbc.url:}
username: ${jdbc.username:}
password: ${jdbc.password:}
在Spring中,url
属性的值来自环境变量JDBC_URL
或JDBC.URL
。
我们有一组开发人员正在研究这个项目。一些开发人员倾向于只对文件中的值进行硬编码,因为它快速而简单。
spring:
datasource:
url: jdbc:mysql://localhost:32768/master
username: root
password: password
通常,当他们提交代码时,这些更改通常也会被提交,我认为这是件坏事。因此,我不应该依赖开发人员保持警惕,而是如何确保阻止这种情况发生?
请记住,有时会出现修改属性/ YAML文件的合理原因,例如添加新属性。
spring:
datasource:
url: jdbc:mysql://localhost:32768/master # should NOT be allowed
username: root # should NOT be allowed
password: password # should NOT be allowed
new:
property: value # should be allowed
我的第一个想法是对属性/ YAML文件使用单元测试。如果有新属性需要验证,它将为我提供扩展的灵活性。这会阻止单元测试阶段传递,从而有助于防止合并到master
分支,但它不会阻止提交。
我不确定下一步该怎么做。任何帮助是极大的赞赏。如果有帮助,该项目是一个Spring Boot应用程序,并使用Java和Gradle。远程存储库是GitHub。
答案 0 :(得分:1)
以下预提交钩子不是很优雅(理想情况下,我会喜欢能够将YAML文件读入可以查询的结构的东西),但这是一个很好的起点。
步骤:
.git/hooks/pre-commit
:
disallowed="localhost root password"
git diff --cached --name-status | while read x file; do
if [ "$x" == 'D' ]; then continue; fi
for word in $disallowed
do
if egrep $word $file ; then
echo "ERROR: Disallowed expression \"${word}\" in file: ${file}"
exit 1
fi
done
done || exit $?
chmod 755 .git/hooks/pre-commit
$ cat validate-this.yml
spring:
datasource:
url: jdbc:mysql://localhost:32768/master
username: root
password: password
new:
property: value
$ git add validate-this.yml
$ git commit -m "Commit should not be allowed"
url: jdbc:mysql://localhost:32768/master # should NOT be allowed
ERROR: Disallowed expression "localhost" in file: validate-this.yml