提供憑證給外部工具範例
版本 8.7
您可以使用 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