您可以使用 IntelliJ 原生匯入器Eclipse Buildship,在 IDE 內開啟範例。

此範例示範如何將憑證傳遞給通常透過標準輸入接受憑證的外部工具。

假設我們必須先登入某些系統,才能執行某些操作。這可能是需要驗證才能允許我們上傳某些成品的外部系統。

此範例假設需要互動式登入的外部工具不支援任何形式的非互動式登入。實際上,許多工具都提供無需提示使用者輸入即可進行驗證的選項。可以使用 args 屬性將命令列引數傳遞給 Exec 工作。

為了示範這個概念,我們將使用 bash 腳本來偽造驗證,該腳本會提示使用者輸入使用者名稱和密碼

login.sh
#!/bin/bash

echo Enter username:
read username
echo Enter password:
if [ -t 0 ] ; then # if connected to a terminal, do not echo the password input
    stty -echo
    read password
    stty echo
    echo
else
    read password
fi

if [ "$username" = "secret-user" ] && [ "$password" = "secret-password" ] ; then
    echo "Welcome, $username!"
else
    echo "Bad credentials!"
    exit 1
fi

它具有硬式編碼的使用者名稱/密碼組,將導致成功登入。該腳本可以在沒有 Gradle 的情況下執行 - 它將模擬需要互動式登入的工具。

Gradle 建置檔案註冊了兩個工作 - 一個執行登入,另一個工作依賴於登入成功

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")
    }
}
build.gradle
def login = tasks.register('login', Exec) {
    def loginProvider = providers.credentials(PasswordCredentials, 'login')
    inputs.property('credentials', loginProvider)

    commandLine = ['sh', 'login.sh']
    doFirst {
        def loginCredentials = loginProvider.get()
        standardInput = new ByteArrayInputStream("$loginCredentials.username\n$loginCredentials.password".getBytes())
    }
}

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

login 工作宣告輸入屬性,並將其與憑證提供者連接。憑證提供者將從專案屬性中取得憑證片段。

憑證可以透過多種方式傳遞給工作

  • 透過命令列屬性

$ ./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