【问题标题】:How can I reference a Travis secure variable in my build.gradle?如何在 build.gradle 中引用 Travis 安全变量?
【发布时间】:2020-02-08 08:15:08
【问题描述】:

我的一个项目依赖项位于一个私人 Bintray 存储库上,它需要用户名和密码才能访问。在本地,我将这些设置在我的gradle.properties

bintrayUsername=<myUserName>
bintrayPassword=<myPass>

这有效(本地),其中hasProperty(X) 解析为 true 并使用此属性:

allprojects {
    repositories {
        jcenter()

        def mahBintrayUsername = hasProperty(bintrayUsername) ? bintrayUsername : System.getenv('bintrayUsername')
        def mahBintrayPassword = hasProperty(bintrayPassword) ? bintrayPassword : System.getenv('bintrayPassword')


        maven {
            credentials {
                username mahBintrayUsername
                password mahBintrayPassword
            }
            url 'http://dl.bintray.com/my-repo-org/maven-private'
        }
    }
}

在 Travis 上,我使用 secure variables,因此我不必在我的公共存储库中公开这些值,而是为了能够直接从我的公共存储库构建。构建开始时,您可以看到变量已导出:

Setting environment variables from .travis.yml
$ export bintrayUsername=[secure]
$ export bintrayPassword=[secure]
$ export TERM=dumb

...

FAILURE: Build failed with an exception.
* Where:
Build file '/home/travis/build/ataulm/wutson/build.gradle' line: 15
* What went wrong:
A problem occurred evaluating root project 'wutson'.
> Could not find property 'bintrayUsername' on repository container.
* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.
BUILD FAILED

我不确定如何在我的build.gradle 中引用导出的环境变量以便找到它们。

我检查了 this answer 似乎不起作用(如上),以及 this comment 导致相同的构建失败。

我尝试过的一系列提交可以在这里看到,最新的:https://github.com/ataulm/wutson/commit/9331b8d91b4acf11fd3e286ff8ba1a24ed527177

【问题讨论】:

  • 该属性应为System.env.bintrayUsername。使用 elvis 运算符将返回错误,因为访问未知属性会引发异常,而不是简单地返回 null。如果您想有条件地将值解析为项目属性与环境变量,则必须执行hasProperty('bintrayUsername') ? bintrayUsername : System.env.bintrayUsername 之类的操作。
  • 嗨@mar​​k,我试过这个(删除美元符号)但同样的构建失败。我没有按照您在评论第二部分中所说的话 - 我确实有条件地检查(除非我误解了)。
  • 看看你上面的例子,我想你可能只是缺少引号。请注意,hasProperty() 采用 String 参数。
  • 如果您添加您的评论作为答案,我会接受! +1,如果您还可以建议一种避免此错误的方法,或者建议如何以一种合乎逻辑的方式自己调试此错误,我将不可避免地忘记 hasProperty() 将来需要一个字符串。

标签: gradle environment-variables travis-ci


【解决方案1】:

该错误是由于您的三元语句试图将 bintrayUsername 作为条件的一部分进行评估。

hasProperty() 方法采用String 参数,因此您应该使用hasProperty('bintrayUsername'),而不是hasProperty(bintrayUsername)。执行后者将尝试评估可能不存在的属性,从而导致MissingPropertyException

请记住,尝试评估任何不存在的符号通常会导致 MissingPropertyException

【讨论】:

    【解决方案2】:

    下面是一个定义项目属性(不是局部变量)的示例,如果未定义,则通过从环境中获取值,即 Travis 放置安全变量的位置。

    project.ext {
        if (! project.hasProperty('some_prop')) { 
            some_prop = System.getenv('some_prop') 
        }
    }
    

    如果您从未将其设置为属性(不使用 gradle.properties 文件)并且您总是想从环境中设置它,只需删除 IF 部分。 :)

    注意:我想要一个项目属性,所以我也可以使用它来设置我的 spring-boot YAML 文件中的值......在本地和 CI 中。

    【讨论】:

      猜你喜欢
      • 2015-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-08
      • 1970-01-01
      • 2018-06-16
      • 2020-01-28
      相关资源
      最近更新 更多