47 lines
		
	
	
		
			1.0 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
		
		
			
		
	
	
			47 lines
		
	
	
		
			1.0 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
|   | #!/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 "$@" |