您可以使用 IntelliJ 原生导入器Eclipse Buildship 在 IDE 中打开示例。

此示例展示了如何将凭据传递给通常通过标准输入接受凭据的外部工具。

假设我们需要登录到某个系统才能执行某些操作。这可能是需要身份验证的外部系统,然后才允许我们上传某些工件。

此示例假定需要交互式登录的外部工具不支持任何形式的非交互式登录。实际上,许多工具都提供了无需提示用户输入即可进行身份验证的选项。可以使用 args 属性将命令行参数传递给 Exec task。

为了演示这个概念,我们将使用一个 bash 脚本来模拟身份验证,该脚本会提示用户输入用户名和密码

它有一个硬编码的用户名/密码对,这将导致登录成功。该脚本可以在没有 Gradle 的情况下执行 - 它将模拟一个需要交互式登录的工具。

Gradle 构建文件注册了两个 task - 一个执行登录,另一个依赖于登录成功

KotlinGroovy
build.gradle.kts
val login = tasks.register<Exec>("login") {
    val loginProvider = providers.credentials(PasswordCredentials::class.java, "login")
    inputs.property("credentials", loginProvider)

    commandLine = listOf("sh", "login.sh")
    doFirst {
        val loginCredentials = loginProvider.get()
        standardInput = java.io.ByteArrayInputStream("${loginCredentials.username}\n${loginCredentials.password}".toByteArray())
    }
}

tasks.register("doAuthenticated") {
    dependsOn(login)
    doLast {
        println("Doing authenticated task")
    }
}

login task 声明了一个输入属性,并将其与凭据 provider 连接起来。凭据 provider 将从项目属性中获取凭据片段。

可以通过多种方式将凭据传递给 task

  • 通过命令行属性

$ ./gradlew doAuthenticated -PloginUsername=secret-user -PloginPassword=secret-password
  • 通过环境变量

$ ORG_GRADLE_PROJECT_loginUsername=secret-user ORG_GRADLE_PROJECT_loginPassword=secret-password ./gradlew doAuthenticated
  • 通过在 gradle.properties 文件中设置属性

loginUsername=secret-user
loginPassword=secret-password

并运行

$ ./gradlew doAuthenticated

这样,敏感数据可以保存在项目源之外 - gradle.properties 可以位于用户的 ~/.gradle 目录中。这些值也不会以这种方式在任何地方回显。有关使用 Gradle 属性的更多信息,请参阅Gradle 属性用户手册章节

使用正确凭据的输出将是

> Task :login
Enter userame:
Enter password:
Welcome, secret-user!

> Task :doAuthenticated
doAuthenticated

BUILD SUCCESSFUL in 496ms
2 actionable tasks: 2 executed