不应提交的 Gradle 配置(即凭据)应该放在哪里?

Posted

技术标签:

【中文标题】不应提交的 Gradle 配置(即凭据)应该放在哪里?【英文标题】:Where to put Gradle configuration (i.e. credentials) that should not be committed? 【发布时间】:2012-09-26 18:50:55 【问题描述】:

我正在尝试将 Gradle 构建的工件部署到 Maven 存储库,我需要为此指定凭据。现在这工作正常:

uploadArchives 
    repositories 
        mavenDeployer 
            repository(url: "http://.../nexus/content/repositories/snapshots/") 
                authentication(userName: "admin", password: "admin123")
            
        
    

但我不喜欢将凭据存储在源代码管理中。使用 Maven,我将定义一个服务器配置,并在我的 ~/.m2/settings.xml 中分配凭据。我如何使用 Gradle 做类似的事情?

【问题讨论】:

您知道从安全角度来看,使用 admin123 作为密码是不好的,对 ;) 另外,从安全角度来看,在 *** 上发布密码会很糟糕 :-) 我相信上面的id/pwd只是一个例子:D 【参考方案1】:

~/.gradle/gradle.properties

mavenUser=admin
mavenPassword=admin123

build.gradle

...
authentication(userName: mavenUser, password: mavenPassword)

【讨论】:

不应该将gradle.properties签入VCS吗? 不是 Gradle 用户主页中的那个(参见上面的路径)。 对于某些版本的 gradles... 使用 mavenPass 而不是 mavenPassword 我建议按如下方式传递项目属性 authentication(userName: project.properties.mavenUser, password: project.properties.mavenPassword) 当没有指定属性 mavenUser/Password 时,这不会导致构建失败。跨度> 有没有办法做到这一点并避免将密码作为纯文本存储在环境变量或文本文件中?【参考方案2】:

第一个答案仍然有效,但 API 过去已更改。由于我的编辑没有被接受,我将其作为单独的答案发布。

authentication() 方法仅用于提供身份验证方法(例如 Basic),但不提供任何凭据。

您也不应该使用它,因为它会在失败时打印凭证!

这是他在您的build.gradle 中的样子

    maven 
        credentials 
            username "$mavenUser"
            password "$mavenPassword"
        
        url 'https://maven.yourcorp.net/'
   

gradle.properties 你的用户主目录中放:

mavenUser=admin
mavenPassword=admin123

还要确保将GRADLE_USER_HOME 设置为~/.gradle,否则那里的属性文件将无法解析。

另见:

https://docs.gradle.org/current/userguide/build_environment.html

https://docs.gradle.org/current/userguide/dependency_management.html (23.6.4.1)

【讨论】:

您能否澄清一下 OP 将如何使用它?即它将位于命名空间uploadArchives repositories mavenDeployer 对不起,我没明白你的问题 OP 在命名空间uploadArchives > repositories > mavenDeployer > repository > authentication 中使用身份验证。他们仍然想使用我假设的uploadArchives,那么应用您的解决方案后OP 的构建配置会如何?他们是否需要删除身份验证,它会起作用吗? 其实我不能告诉你,因为我从来没有使用过 mavenDeployer 命名空间。 Uploadarchives 仍然是一个有效的任务,但该任务的凭据是在 Maven 命名空间中配置的。 这个答案与问题不兼容。它使用maven-publish 插件,而问题使用maven 插件。【参考方案3】:

如果您有用户特定的凭据(即每个开发人员可能有不同的用户名/密码),那么我建议您使用 gradle-properties-plugin。

    将默认值放入gradle.properties 每个开发人员都使用gradle-local.properties 覆盖(这应该被 git 忽略)。

这比使用 $USER_HOME/.gradle/gradle.properties 覆盖要好,因为不同的项目可能具有相同的属性名称。

请注意,插件实际上添加了gradle-$environment.properties,其中$environment 的默认值为local,并且具有附加功能。使用前请阅读链接。

【讨论】:

你能添加一个完整的工作 MWE。如何在build.gradle 中包含插件。如何在uploadArchives 配置中使用凭据? @koppor 不确定这是否仍然有效,但我已在我的开源项目中使用它 - github.com/krishnaraj/oneclipboard/blob/master/build.gradle【参考方案4】:

您还可以在命令行中使用-PmavenUser=user -PmavenPassword=password 提供变量。

由于某种原因您不能使用 gradle.properties 文件,这可能很有用。例如。在构建服务器上,我们使用带有 -g 选项的 Gradle,以便每个构建计划都有自己的 GRADLE_HOME

【讨论】:

【参考方案5】:

您可以将凭据放在属性文件中并使用以下内容读取它:

Properties props = new Properties() 
props.load(new FileInputStream("yourPath/credentials.properties")) 
project.setProperty('props', props)

另一种方法是在操作系统级别定义环境变量并使用以下方法读取它们:

System.getenv()['YOUR_ENV_VARIABLE']

【讨论】:

谢谢!但是我必须使用 props.getProperty("myParameterName") 设置每个参数才能使其工作:)【参考方案6】:

对于那些在 MacOS 上构建并且不喜欢在计算机上以明文形式留下密码的人,您可以使用钥匙串工具来存储凭据,然后将其注入到构建中。归功于维克多·埃里克森。 https://pilloxa.gitlab.io/posts/safer-passwords-in-gradle/

【讨论】:

【参考方案7】:

build.gradle

apply from: "./build.gradle.local"
... 
authentication(userName: project.ext.mavenUserName, password: project.ext.mavenPassword)

build.gradle.local(忽略 git)

project.ext.mavenUserName=admin
project.ext.mavenPassword=admin123

【讨论】:

【参考方案8】:

根据 7.1.1 的 gradle 文档,我们有如下语法来设置带有凭据的存储库,下面的代码 sn -p 应该在项目的 build.gradle 文件中

repositories 
maven 
    url "http://repo.mycompany.com"
    credentials 
        username "user"
        password "password"
    

【讨论】:

OP应该把这段代码放在哪个文件里? 这个 sn-p 进入 build.gradle 对不起,我的意思是原始发帖人,也就是提出问题的人 如果我能建议一件事......如果我是你,我会考虑编辑答案而不是回复评论。但无论如何,感谢您的反应

以上是关于不应提交的 Gradle 配置(即凭据)应该放在哪里?的主要内容,如果未能解决你的问题,请参考以下文章

声纳“凭据不应被硬编码”错误

我应该把 gradle.properties 放在詹金斯的哪里

C#WinForm中数据库连接字符串应该放在哪

css文件应该放在哪?

css文件应该放在哪?

领域模型应该放在哪一层?