我们正在开发一个Spring Boot Web应用程序,我们使用的数据库是MySql ;
我们的设置是我们首先在本地测试它(意味着我们需要在我们的PC上安装MySql);
然后我们推向Bitbucket ;
Jenkins自动检测到对Bitbucket的新推送并对其进行构建(对于Jenkins mvn构建要通过,我们还需要在运行Jenkins的虚拟机上安装MySql).
如果Jenkins构建了传递,我们将代码推送到OpenShift上的应用程序(使用Jenkins上的Openshift部署插件).
我们可能已经弄明白的问题是:
在application.properties我们不能硬编码MySql信息.由于我们的项目将在3个不同的地方运行(本地,Jenkins和OpenShift),我们需要使数据源字段动态化application.properties(我们知道有不同的方法,但我们现在正在研究这个解决方案).
spring.datasource.url =
spring.datasource.username =
spring.datasource.password =
Run Code Online (Sandbox Code Playgroud)我们提出的解决方案是在本地和Jenkins vm中创建系统环境变量(以与OpenShift命名的方式命名它们)并分别为它们分配正确的值:
export OPENSHIFT_MYSQL_DB_HOST="jdbc:mysql://localhost"
export OPENSHIFT_MYSQL_DB_PORT="3306"
export OPENSHIFT_MYSQL_DB_USERNAME="root"
export OPENSHIFT_MYSQL_DB_PASSWORD="123asd"
Run Code Online (Sandbox Code Playgroud)
我们做到了这一点并且有效.我们还检查Map<String, String> env = System.getenv();过环境变量可以变成java变量:
String password = env.get("OPENSHIFT_MYSQL_DB_PASSWORD");
String userName = env.get("OPENSHIFT_MYSQL_DB_USERNAME");
String sqlURL = env.get("OPENSHIFT_MYSQL_DB_HOST");
String sqlPort = env.get("OPENSHIFT_MYSQL_DB_PORT");
Run Code Online (Sandbox Code Playgroud)
现在唯一剩下的就是我们需要在我们中使用这些java变量application.properties,这就是我们遇到的问题.
在哪个文件夹,以及我们如何,需要分配password,userName, …
使用Spring Boot,我可以JdbcTemplate使用以下内容实例化:
码:
@Autowired
private JdbcTemplate jdbcTemplate;
Run Code Online (Sandbox Code Playgroud)
属性:
spring.datasource.url=jdbc:postgresql://my_url:my_port/my_other_stuff
spring.datasource.username=my_user_name
spring.datasource.password=my_password
spring.datasource.driver-class-name=org.postgresql.Driver
Run Code Online (Sandbox Code Playgroud)
这创建了一个类的DataSource: org.apache.tomcat.jdbc.pool.DataSource
如何以编程方式设置DataSource用户名/密码?
我们的策略是不以纯文本格式存储凭据,我必须在我工作的地方使用特定的凭据提供程序.
我的应用程序需要一堆机密才能运行:数据库凭据、API 凭据等。它在 Google App Engine Standard Java 11 中运行。我需要这些机密作为环境变量或作为我应用程序的参数,以便我的框架可以获取它们并相应地建立连接。我的特定框架是 Spring Boot,但我相信 Django、Rails 和许多其他框架使用相同的方法。
这样做的最佳方法是什么?
我对这个问题的答案之一是使用 Google Cloud Key Management,这看起来很有希望,但我不知道如何将这些值转换为 App Engine 中的环境变量。是否可以?我已经阅读 了为服务器到服务器生产应用程序设置身份验证,但我没有看到任何关于如何在 App Engine 中将机密转换为环境变量的指示(我错过了吗?)。
我见过的其他替代方案包括将它们硬编码到app.yaml另一个从未提交并存在于我的机器中的文件中,这意味着我是唯一可以部署的人......我什至无法从另一台机器部署。这对我来说是有问题的。
我见过的另一个潜在解决方案是将问题委托给 Google Cloud Build,以便它从 CKM 获取值/文件并将其推送到 App Engine ( 1 , 2 )。我没有使用 GCB,我怀疑我会,因为它太基础了。
我真的希望 App Engine 有一个像 Heroku 那样的环境变量页面。
google-app-engine google-cloud-platform google-cloud-kms google-secret-manager