From 2d40c8b840883e0739d504d30e71b7e71c19019c Mon Sep 17 00:00:00 2001 From: Tad Cordle Date: Thu, 23 Jan 2020 17:22:33 -0500 Subject: [PATCH 1/2] Add user agent to update check (#2242) --- .../cloud/tools/jib/gradle/TaskCommon.java | 3 +- .../cloud/tools/jib/maven/MojoCommon.java | 3 +- .../jib/plugins/common/UpdateChecker.java | 33 ++++++++++++++----- .../jib/plugins/common/UpdateCheckerTest.java | 25 +++++++------- 4 files changed, 43 insertions(+), 21 deletions(-) diff --git a/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/TaskCommon.java b/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/TaskCommon.java index 2a7df70fb3..492975d5bb 100644 --- a/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/TaskCommon.java +++ b/jib-gradle-plugin/src/main/java/com/google/cloud/tools/jib/gradle/TaskCommon.java @@ -54,7 +54,8 @@ static Future> newUpdateChecker( } ExecutorService executorService = Executors.newSingleThreadExecutor(); try { - return UpdateChecker.checkForUpdate(executorService, projectProperties::log, VERSION_URL); + return UpdateChecker.checkForUpdate( + executorService, projectProperties::log, VERSION_URL, projectProperties.getToolName()); } finally { executorService.shutdown(); } diff --git a/jib-maven-plugin/src/main/java/com/google/cloud/tools/jib/maven/MojoCommon.java b/jib-maven-plugin/src/main/java/com/google/cloud/tools/jib/maven/MojoCommon.java index b193e9373c..7889d20bc3 100644 --- a/jib-maven-plugin/src/main/java/com/google/cloud/tools/jib/maven/MojoCommon.java +++ b/jib-maven-plugin/src/main/java/com/google/cloud/tools/jib/maven/MojoCommon.java @@ -58,7 +58,8 @@ static Future> newUpdateChecker( } ExecutorService executorService = Executors.newSingleThreadExecutor(); try { - return UpdateChecker.checkForUpdate(executorService, projectProperties::log, VERSION_URL); + return UpdateChecker.checkForUpdate( + executorService, projectProperties::log, VERSION_URL, projectProperties.getToolName()); } finally { executorService.shutdown(); } diff --git a/jib-plugins-common/src/main/java/com/google/cloud/tools/jib/plugins/common/UpdateChecker.java b/jib-plugins-common/src/main/java/com/google/cloud/tools/jib/plugins/common/UpdateChecker.java index 62ea433a84..2d2963efa7 100644 --- a/jib-plugins-common/src/main/java/com/google/cloud/tools/jib/plugins/common/UpdateChecker.java +++ b/jib-plugins-common/src/main/java/com/google/cloud/tools/jib/plugins/common/UpdateChecker.java @@ -20,6 +20,9 @@ import com.google.cloud.tools.jib.ProjectInfo; import com.google.cloud.tools.jib.api.LogEvent; import com.google.cloud.tools.jib.filesystem.XdgDirectories; +import com.google.cloud.tools.jib.http.FailoverHttpClient; +import com.google.cloud.tools.jib.http.Request; +import com.google.cloud.tools.jib.http.Response; import com.google.cloud.tools.jib.json.JsonTemplate; import com.google.cloud.tools.jib.json.JsonTemplateMapper; import com.google.common.annotations.VisibleForTesting; @@ -27,7 +30,6 @@ import com.google.common.base.Verify; import java.io.IOException; import java.io.OutputStream; -import java.net.HttpURLConnection; import java.net.URL; import java.nio.charset.StandardCharsets; import java.nio.file.Files; @@ -68,19 +70,28 @@ private static class VersionJsonTemplate implements JsonTemplate { * @param executorService the {@link ExecutorService} * @param log {@link Consumer} used to log messages * @param versionUrl the location to check for the latest version + * @param toolName the tool name * @return a new {@link UpdateChecker} */ public static Future> checkForUpdate( - ExecutorService executorService, Consumer log, String versionUrl) { + ExecutorService executorService, Consumer log, String versionUrl, String toolName) { return executorService.submit( () -> performUpdateCheck( - log, Verify.verifyNotNull(ProjectInfo.VERSION), versionUrl, getConfigDir())); + log, + Verify.verifyNotNull(ProjectInfo.VERSION), + versionUrl, + getConfigDir(), + toolName)); } @VisibleForTesting static Optional performUpdateCheck( - Consumer log, String currentVersion, String versionUrl, Path configDir) { + Consumer log, + String currentVersion, + String versionUrl, + Path configDir, + String toolName) { // Abort if offline or update checks are disabled if (Boolean.getBoolean(PropertyNames.DISABLE_UPDATE_CHECKS)) { return Optional.empty(); @@ -139,11 +150,17 @@ static Optional performUpdateCheck( } // Check for update - HttpURLConnection connection = (HttpURLConnection) new URL(versionUrl).openConnection(); + FailoverHttpClient httpClient = new FailoverHttpClient(true, false, log); try { - connection.setConnectTimeout(3000); + Response response = + httpClient.get( + new URL(versionUrl), + Request.builder() + .setHttpTimeout(3000) + .setUserAgent("jib " + currentVersion + " " + toolName) + .build()); VersionJsonTemplate version = - JsonTemplateMapper.readJson(connection.getInputStream(), VersionJsonTemplate.class); + JsonTemplateMapper.readJson(response.getBody(), VersionJsonTemplate.class); Files.write(lastUpdateCheck, Instant.now().toString().getBytes(StandardCharsets.UTF_8)); if (currentVersion.equals(version.latest)) { return Optional.empty(); @@ -156,7 +173,7 @@ static Optional performUpdateCheck( + "). Update your build configuration to use the latest features and fixes!"); } finally { - connection.disconnect(); + httpClient.shutDown(); } } catch (IOException ex) { diff --git a/jib-plugins-common/src/test/java/com/google/cloud/tools/jib/plugins/common/UpdateCheckerTest.java b/jib-plugins-common/src/test/java/com/google/cloud/tools/jib/plugins/common/UpdateCheckerTest.java index 91434c2909..b6eb0eae1d 100644 --- a/jib-plugins-common/src/test/java/com/google/cloud/tools/jib/plugins/common/UpdateCheckerTest.java +++ b/jib-plugins-common/src/test/java/com/google/cloud/tools/jib/plugins/common/UpdateCheckerTest.java @@ -75,7 +75,8 @@ public void testPerformUpdateCheck_newVersionFound() throws IOException { setupConfigAndLastUpdateCheck(); Optional message = UpdateChecker.performUpdateCheck( - ignored -> {}, "1.0.2", testWebServer.getEndpoint(), configDir); + ignored -> {}, "1.0.2", testWebServer.getEndpoint(), configDir, "tool name"); + Assert.assertTrue(testWebServer.getInputRead().contains("User-Agent: jib 1.0.2 tool name")); Assert.assertTrue(message.isPresent()); Assert.assertEquals( "A new version of Jib (2.0.0) is available (currently using 1.0.2). Update your build " @@ -94,12 +95,12 @@ public void testPerformUpdateCheck_newJsonField() new TestWebServer( false, Collections.singletonList( - "HTTP/1.1 200 OK\nContent-Length:18\n\n{\"latest\":\"2.0.0\",\"unknownField\":\"unknown\"}"), + "HTTP/1.1 200 OK\nContent-Length:43\n\n{\"latest\":\"2.0.0\",\"unknownField\":\"unknown\"}"), 1); setupConfigAndLastUpdateCheck(); Optional message = UpdateChecker.performUpdateCheck( - ignored -> {}, "1.0.2", testWebServer.getEndpoint(), configDir); + ignored -> {}, "1.0.2", testWebServer.getEndpoint(), configDir, "tool name"); Assert.assertTrue(message.isPresent()); Assert.assertEquals( "A new version of Jib (2.0.0) is available (currently using 1.0.2). Update your build " @@ -113,11 +114,12 @@ public void testPerformUpdateCheck_onLatest() throws IOException { setupConfigAndLastUpdateCheck(); Optional message = UpdateChecker.performUpdateCheck( - ignored -> {}, "2.0.0", testWebServer.getEndpoint(), configDir); + ignored -> {}, "2.0.0", testWebServer.getEndpoint(), configDir, "tool name"); Assert.assertFalse(message.isPresent()); String modifiedTime = new String( Files.readAllBytes(configDir.resolve("lastUpdateCheck")), StandardCharsets.UTF_8); + Assert.assertTrue(testWebServer.getInputRead().contains("User-Agent: jib 2.0.0 tool name")); Assert.assertTrue(Instant.parse(modifiedTime).isAfter(before)); } @@ -126,7 +128,7 @@ public void testPerformUpdateCheck_noConfigOrLastUpdateCheck() throws IOExceptio Instant before = Instant.now(); Optional message = UpdateChecker.performUpdateCheck( - ignored -> {}, "1.0.2", testWebServer.getEndpoint(), configDir); + ignored -> {}, "1.0.2", testWebServer.getEndpoint(), configDir, "tool name"); Assert.assertTrue(message.isPresent()); Assert.assertEquals( "A new version of Jib (2.0.0) is available (currently using 1.0.2). Update your build " @@ -147,7 +149,7 @@ public void testPerformUpdateCheck_lastUpdateCheckTooSoon() throws IOException { modifiedTime.toString().getBytes(StandardCharsets.UTF_8)); Optional message = UpdateChecker.performUpdateCheck( - ignored -> {}, "1.0.2", testWebServer.getEndpoint(), configDir); + ignored -> {}, "1.0.2", testWebServer.getEndpoint(), configDir, "tool name"); Assert.assertFalse(message.isPresent()); // lastUpdateCheck should not have changed @@ -162,7 +164,7 @@ public void testPerformUpdateCheck_systemProperty() { System.setProperty(PropertyNames.DISABLE_UPDATE_CHECKS, "true"); Optional message = UpdateChecker.performUpdateCheck( - ignored -> {}, "1.0.2", testWebServer.getEndpoint(), configDir); + ignored -> {}, "1.0.2", testWebServer.getEndpoint(), configDir, "tool name"); Assert.assertFalse(message.isPresent()); } @@ -173,7 +175,7 @@ public void testPerformUpdateCheck_configDisabled() throws IOException { "{\"disableUpdateCheck\":true}".getBytes(StandardCharsets.UTF_8)); Optional message = UpdateChecker.performUpdateCheck( - ignored -> {}, "1.0.2", testWebServer.getEndpoint(), configDir); + ignored -> {}, "1.0.2", testWebServer.getEndpoint(), configDir, "tool name"); Assert.assertFalse(message.isPresent()); } @@ -183,7 +185,7 @@ public void testPerformUpdateCheck_badConfig() throws IOException { configDir.resolve("config.json"), "corrupt config".getBytes(StandardCharsets.UTF_8)); Optional message = UpdateChecker.performUpdateCheck( - ignored -> {}, "1.0.2", testWebServer.getEndpoint(), configDir); + ignored -> {}, "1.0.2", testWebServer.getEndpoint(), configDir, "tool name"); Assert.assertFalse(message.isPresent()); } @@ -194,7 +196,7 @@ public void testPerformUpdateCheck_badLastUpdateTime() throws IOException { configDir.resolve("lastUpdateCheck"), "bad timestamp".getBytes(StandardCharsets.UTF_8)); Optional message = UpdateChecker.performUpdateCheck( - ignored -> {}, "1.0.2", testWebServer.getEndpoint(), configDir); + ignored -> {}, "1.0.2", testWebServer.getEndpoint(), configDir, "tool name"); String modifiedTime = new String( Files.readAllBytes(configDir.resolve("lastUpdateCheck")), StandardCharsets.UTF_8); @@ -219,7 +221,8 @@ public void testPerformUpdateCheck_failSilently() }, "1.0.2", badServer.getEndpoint(), - configDir); + configDir, + "tool name"); Assert.assertFalse(message.isPresent()); } } From 384ad0283174c6a7aa0d21c52c6eeedf28b8ee96 Mon Sep 17 00:00:00 2001 From: Tad Cordle Date: Thu, 23 Jan 2020 17:39:49 -0500 Subject: [PATCH 2/2] Ignore http client logging in update check (#2243) --- .../google/cloud/tools/jib/plugins/common/UpdateChecker.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jib-plugins-common/src/main/java/com/google/cloud/tools/jib/plugins/common/UpdateChecker.java b/jib-plugins-common/src/main/java/com/google/cloud/tools/jib/plugins/common/UpdateChecker.java index 2d2963efa7..340fd530a3 100644 --- a/jib-plugins-common/src/main/java/com/google/cloud/tools/jib/plugins/common/UpdateChecker.java +++ b/jib-plugins-common/src/main/java/com/google/cloud/tools/jib/plugins/common/UpdateChecker.java @@ -150,7 +150,7 @@ static Optional performUpdateCheck( } // Check for update - FailoverHttpClient httpClient = new FailoverHttpClient(true, false, log); + FailoverHttpClient httpClient = new FailoverHttpClient(true, false, ignored -> {}); try { Response response = httpClient.get(