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 "$@"
 |