我需要通过代理服务器从Gradle访问web,以使用Gradle/Artifactory集成的Jenkins。为了减少可能导致问题的原因,我在构建中手动添加了Artifactory插件。Gradle并从命令行运行它:
apply {
apply from: "http://gradle.artifactoryonline.com/gradle/plugins/org/jfrog/buildinfo/build-info-extractor-gradle/1.0.1/artifactoryplugin-1.0.1.gradle"
}
在此描述之后,我在.gradle/gradle中指定了以下内容。在我的主目录中的属性:
systemProp.http.proxyHost=hostname
systemProp.http.proxyPort=8080
systemProp.http.proxyUser=de\\username
systemProp.http.proxyPassword=xxx
使用上面的代理配置(否则已知工作),它会失败:
11:33:17.699[错误][org.gradle.]导致:java.io.IOException:服务器返回HTTP响应代码:407 for URL: http://gradle.artifactoryonline.com/gradle/plugins/org/jfrog/buildinfo/build-info-extractor-gradle/1.0.1/artifactoryplugin-1.0.1.gradle
我有两个代理服务器可以选择,一个总是响应407(需要代理身份验证),另一个响应502(坏网关),因此显然,使用了proxyHost和proxyPort选项。
由于用户名(基于Active Directory用户)包含反斜杠,我同时尝试了\\和\,但都不起作用。指定的用户与已登录计算机和Active Directory的用户不同。这个用户的凭据对代理无效,所以我需要能够指定一个不同的用户。
在Jenkins或Artifactory的GUI中设置相同的选项也可以。
细化丹尼尔的回答:
HTTP Only Proxy配置
gradlew -Dhttp.proxyHost=127.0.0.1 -Dhttp.proxyPort=3128 “-Dhttp.nonProxyHosts=*.nonproxyrepos.com|localhost”
仅代理配置
gradlew -Dhttps.proxyHost=127.0.0.1 -Dhttps.proxyPort=3129 “-Dhttp.nonProxyHosts=*.nonproxyrepos.com|localhost”
同时配置HTTP和HTTPS代理
gradlew -Dhttp.proxyHost=127.0.0.1 -Dhttp.proxyPort=3128 -Dhttps.proxyHost=127.0.0.1 -Dhttps.proxyPort=3129 “-Dhttp.nonProxyHosts=*.nonproxyrepos.com|localhost”
使用用户和密码进行代理配置
gradlew -Dhttp. proxyhost =127.0.0.1 -Dhttp. proxyhost =127.0.0.1proxyPort=3128 - Dhttps.proxyHost=127.0.0.1 - dhttps . proxyPort=3128proxyPort = 3129 -Dhttps。用户-Dhttps proxyUser =。proxyPassword =通过-Dhttp。用户-Dhttp proxyUser =。proxyPassword =通过-Dhttp.nonProxyHosts = host1.com | host2.com
为我工作(用gradle)。在homedir或项目目录中,构建仍然失败)。感谢您指出gradle的问题,提供了这个解决方案。参见参考文档https://docs.gradle.org/current/userguide/build_environment.html#sec:accessing_the_web_via_a_proxy
更新
您还可以将这些属性放入gradle-wrapper中。属性(参见:https://stackoverflow.com/a/50492027/474034)。
更新@sourcesimian和@kunal-b的答案,动态设置用户名和密码,如果在系统属性中配置。
如果提供用户名和密码,则设置用户名和密码;如果未设置用户名和密码,则只添加主机和端口。
task setHttpProxyFromEnv {
def map = ['HTTP_PROXY': 'http', 'HTTPS_PROXY': 'https']
for (e in System.getenv()) {
def key = e.key.toUpperCase()
if (key in map) {
def base = map[key]
//Get proxyHost,port, username, and password from http system properties
// in the format http://username:password@proxyhost:proxyport
def (val1,val2) = e.value.tokenize( '@' )
def (val3,val4) = val1.tokenize( '//' )
def(userName, password) = val4.tokenize(':')
def url = e.value.toURL()
//println " - systemProp.${base}.proxy=${url.host}:${url.port}"
System.setProperty("${base}.proxyHost", url.host.toString())
System.setProperty("${base}.proxyPort", url.port.toString())
System.setProperty("${base}.proxyUser", userName.toString())
System.setProperty("${base}.proxyPassword", password.toString())
}
}
}
细化丹尼尔的回答:
HTTP Only Proxy配置
gradlew -Dhttp.proxyHost=127.0.0.1 -Dhttp.proxyPort=3128 “-Dhttp.nonProxyHosts=*.nonproxyrepos.com|localhost”
仅代理配置
gradlew -Dhttps.proxyHost=127.0.0.1 -Dhttps.proxyPort=3129 “-Dhttp.nonProxyHosts=*.nonproxyrepos.com|localhost”
同时配置HTTP和HTTPS代理
gradlew -Dhttp.proxyHost=127.0.0.1 -Dhttp.proxyPort=3128 -Dhttps.proxyHost=127.0.0.1 -Dhttps.proxyPort=3129 “-Dhttp.nonProxyHosts=*.nonproxyrepos.com|localhost”
使用用户和密码进行代理配置
gradlew -Dhttp. proxyhost =127.0.0.1 -Dhttp. proxyhost =127.0.0.1proxyPort=3128 - Dhttps.proxyHost=127.0.0.1 - dhttps . proxyPort=3128proxyPort = 3129 -Dhttps。用户-Dhttps proxyUser =。proxyPassword =通过-Dhttp。用户-Dhttp proxyUser =。proxyPassword =通过-Dhttp.nonProxyHosts = host1.com | host2.com
为我工作(用gradle)。在homedir或项目目录中,构建仍然失败)。感谢您指出gradle的问题,提供了这个解决方案。参见参考文档https://docs.gradle.org/current/userguide/build_environment.html#sec:accessing_the_web_via_a_proxy
更新
您还可以将这些属性放入gradle-wrapper中。属性(参见:https://stackoverflow.com/a/50492027/474034)。