Build: Add wrapper around gradle Exec task for easier logging
The Exec task outputs stdout/stderr to the standard streams by default. However, to keep output short, we currently capture this, and only output if the task failed. This change makes a small wrapper around Exec to facilitate this behavior anywhere we use Exec.
This commit is contained in:
parent
d6969fcf3a
commit
bcb4be322f
|
@ -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}")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -20,6 +20,7 @@ package org.elasticsearch.gradle.test
|
||||||
|
|
||||||
import org.apache.tools.ant.DefaultLogger
|
import org.apache.tools.ant.DefaultLogger
|
||||||
import org.apache.tools.ant.taskdefs.condition.Os
|
import org.apache.tools.ant.taskdefs.condition.Os
|
||||||
|
import org.elasticsearch.gradle.LoggedExec
|
||||||
import org.elasticsearch.gradle.VersionProperties
|
import org.elasticsearch.gradle.VersionProperties
|
||||||
import org.elasticsearch.gradle.plugin.PluginBuildPlugin
|
import org.elasticsearch.gradle.plugin.PluginBuildPlugin
|
||||||
import org.gradle.api.*
|
import org.gradle.api.*
|
||||||
|
@ -266,7 +267,7 @@ class ClusterFormationTasks {
|
||||||
|
|
||||||
/** Adds a task to execute a command to help setup the cluster */
|
/** 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) {
|
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
|
workingDir node.cwd
|
||||||
if (Os.isFamily(Os.FAMILY_WINDOWS)) {
|
if (Os.isFamily(Os.FAMILY_WINDOWS)) {
|
||||||
executable 'cmd'
|
executable 'cmd'
|
||||||
|
@ -275,18 +276,6 @@ class ClusterFormationTasks {
|
||||||
executable 'sh'
|
executable 'sh'
|
||||||
}
|
}
|
||||||
args execArgs
|
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}")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -464,7 +453,7 @@ class ClusterFormationTasks {
|
||||||
|
|
||||||
/** Adds a task to kill an elasticsearch node with the given pidfile */
|
/** Adds a task to kill an elasticsearch node with the given pidfile */
|
||||||
static Task configureStopTask(String name, Project project, Object depends, NodeInfo node) {
|
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() }
|
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
|
// 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()}"
|
ext.pid = "${ -> node.pidFile.getText('UTF-8').trim()}"
|
||||||
|
|
Loading…
Reference in New Issue