47 lines
		
	
	
		
			1.0 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			47 lines
		
	
	
		
			1.0 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
#!/usr/bin/env bash
 | 
						|
 | 
						|
# travis_keepalive runs the given command and preserves its return value,
 | 
						|
# while it forks a child process what periodically produces a log line,
 | 
						|
# so that Travis won't abort the build after 10 minutes.
 | 
						|
 | 
						|
# Why?
 | 
						|
# `t.Log()` in Go holds the buffer until the test does not pass or fail,
 | 
						|
# and `-race` can increase the execution time by 2-20x.
 | 
						|
 | 
						|
set -euo pipefail
 | 
						|
 | 
						|
readonly KEEPALIVE_INTERVAL=300 # seconds => 5m
 | 
						|
 | 
						|
main() {
 | 
						|
  keepalive
 | 
						|
  $@
 | 
						|
}
 | 
						|
 | 
						|
# Keepalive produces a log line in each KEEPALIVE_INTERVAL.
 | 
						|
keepalive() {
 | 
						|
  local child_pid
 | 
						|
  # Note: We fork here!
 | 
						|
  repeat "keepalive" &
 | 
						|
  child_pid=$!
 | 
						|
  ensureChildOnEXIT "${child_pid}"
 | 
						|
}
 | 
						|
 | 
						|
repeat() {
 | 
						|
  local this="$1"
 | 
						|
  while true; do
 | 
						|
    echo "${this}"
 | 
						|
    sleep "${KEEPALIVE_INTERVAL}"
 | 
						|
  done
 | 
						|
}
 | 
						|
 | 
						|
# Ensures that the child gets killed on normal program exit.
 | 
						|
ensureChildOnEXIT() {
 | 
						|
  # Note: SIGINT and SIGTERM are forwarded to the child process by Bash
 | 
						|
  # automatically, so we don't have to deal with signals.
 | 
						|
 | 
						|
  local child_pid="$1"
 | 
						|
  trap "kill ${child_pid}" EXIT
 | 
						|
}
 | 
						|
 | 
						|
main "$@"
 |