瀏覽代碼

Merge pull request #14996 from rjernst/logged_exec

Add wrapper around gradle Exec task for easier logging
Ryan Ernst 10 年之前
父節點
當前提交
139d688e24

+ 42 - 0
buildSrc/src/main/groovy/org/elasticsearch/gradle/LoggedExec.groovy

@@ -0,0 +1,42 @@
+/*
+ * Licensed to Elasticsearch under one or more contributor
+ * license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright
+ * ownership. Elasticsearch licenses this file to you under
+ * the Apache License, Version 2.0 (the "License"); you may
+ * not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.elasticsearch.gradle
+
+import org.gradle.api.GradleException
+import org.gradle.api.tasks.Exec
+
+/**
+ * A wrapper around gradle's Exec task to capture output and log on error.
+ */
+class LoggedExec extends Exec {
+    LoggedExec() {
+        if (logger.isInfoEnabled() == false) {
+            standardOutput = new ByteArrayOutputStream()
+            errorOutput = standardOutput
+            ignoreExitValue = true
+            doLast {
+                if (execResult.exitValue != 0) {
+                    standardOutput.toString('UTF-8').eachLine { line -> logger.error(line) }
+                    throw new GradleException("Process '${executable} ${args.join(' ')}' finished with non-zero exit value ${execResult.exitValue}")
+                }
+            }
+        }
+    }
+}

+ 3 - 14
buildSrc/src/main/groovy/org/elasticsearch/gradle/test/ClusterFormationTasks.groovy

@@ -20,6 +20,7 @@ package org.elasticsearch.gradle.test
 
 import org.apache.tools.ant.DefaultLogger
 import org.apache.tools.ant.taskdefs.condition.Os
+import org.elasticsearch.gradle.LoggedExec
 import org.elasticsearch.gradle.VersionProperties
 import org.elasticsearch.gradle.plugin.PluginBuildPlugin
 import org.gradle.api.*
@@ -269,7 +270,7 @@ class ClusterFormationTasks {
 
     /** Adds a task to execute a command to help setup the cluster */
     static Task configureExecTask(String name, Project project, Task setup, NodeInfo node, Object[] execArgs) {
-        return project.tasks.create(name: name, type: Exec, dependsOn: setup) {
+        return project.tasks.create(name: name, type: LoggedExec, dependsOn: setup) {
             workingDir node.cwd
             if (Os.isFamily(Os.FAMILY_WINDOWS)) {
                 executable 'cmd'
@@ -278,18 +279,6 @@ class ClusterFormationTasks {
                 executable 'sh'
             }
             args execArgs
-            // only show output on failure, when not in info or debug mode
-            if (logger.isInfoEnabled() == false) {
-                standardOutput = new ByteArrayOutputStream()
-                errorOutput = standardOutput
-                ignoreExitValue = true
-                doLast {
-                    if (execResult.exitValue != 0) {
-                        logger.error(standardOutput.toString())
-                        throw new GradleException("Process '${execArgs.join(' ')}' finished with non-zero exit value ${execResult.exitValue}")
-                    }
-                }
-            }
         }
     }
 
@@ -467,7 +456,7 @@ class ClusterFormationTasks {
 
     /** Adds a task to kill an elasticsearch node with the given pidfile */
     static Task configureStopTask(String name, Project project, Object depends, NodeInfo node) {
-        return project.tasks.create(name: name, type: Exec, dependsOn: depends) {
+        return project.tasks.create(name: name, type: LoggedExec, dependsOn: depends) {
             onlyIf { node.pidFile.exists() }
             // the pid file won't actually be read until execution time, since the read is wrapped within an inner closure of the GString
             ext.pid = "${ -> node.pidFile.getText('UTF-8').trim()}"