您可以使用 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