#!/usr/bin/env bash set -e YELLOW='\033[0;33m' GREEN='\033[0;32m' UNDERLINE='\033[4m' BOLD='\033[1m' NC='\033[0m' BRANCH="master" RUNS="20" COOKIE_JAR=/tmp/cookies CRUMB=$(curl -s --cookie-jar $COOKIE_JAR 'https://jenkins.comma.life/crumbIssuer/api/xml?xpath=concat(//crumbRequestField,":",//crumb)') FIRST_LOOP=1 function loop() { JENKINS_BRANCH="__jenkins_loop_${BRANCH}_$(date +%s)" API_ROUTE="https://jenkins.comma.life/job/openpilot/job/$JENKINS_BRANCH" for run in $(seq 1 $((RUNS / 2))); do N=2 if [[ $FIRST_LOOP ]]; then TEMP_DIR=$(mktemp -d) GIT_LFS_SKIP_SMUDGE=1 git clone --quiet -b $BRANCH --depth=1 --no-tags git@github.com:commaai/openpilot $TEMP_DIR git -C $TEMP_DIR checkout --quiet -b $JENKINS_BRANCH echo "TESTING: $(date)" >> $TEMP_DIR/testing_jenkins git -C $TEMP_DIR add testing_jenkins git -C $TEMP_DIR commit --quiet -m "testing" git -C $TEMP_DIR push --quiet -f origin $JENKINS_BRANCH rm -rf $TEMP_DIR FIRST_BUILD=1 echo '' echo 'waiting on Jenkins...' echo '' sleep 90 FIRST_LOOP="" fi FIRST_BUILD=$(curl -s $API_ROUTE/api/json | jq .nextBuildNumber) LAST_BUILD=$((FIRST_BUILD+N-1)) TEST_BUILDS=( $(seq $FIRST_BUILD $LAST_BUILD) ) # Start N new builds for i in ${TEST_BUILDS[@]}; do echo "Starting build $i" curl -s --output /dev/null --cookie $COOKIE_JAR -H "$CRUMB" -X POST $API_ROUTE/build?delay=0sec sleep 5 done echo "" # Wait for all builds to end while true; do sleep 30 count=0 for i in ${TEST_BUILDS[@]}; do RES=$(curl -s -w "\n%{http_code}" --cookie $COOKIE_JAR -H "$CRUMB" $API_ROUTE/$i/api/json) HTTP_CODE=$(tail -n1 <<< "$RES") JSON=$(sed '$ d' <<< "$RES") if [[ $HTTP_CODE == "200" ]]; then STILL_RUNNING=$(echo $JSON | jq .inProgress) if [[ $STILL_RUNNING == "true" ]]; then echo -e "Build $i: ${YELLOW}still running${NC}" continue else count=$((count+1)) echo -e "Build $i: ${GREEN}done${NC}" fi else echo "No status for build $i" fi done echo "See live results: ${API_ROUTE}/buildTimeTrend" echo "" if [[ $count -ge $N ]]; then break fi done done } function usage() { echo "" echo "Run the Jenkins tests multiple times on a specific branch" echo "" echo -e "${BOLD}${UNDERLINE}Options:${NC}" echo -e " ${BOLD}-n, --n${NC}" echo -e " Specify how many runs to do (default to ${BOLD}20${NC})" echo -e " ${BOLD}-b, --branch${NC}" echo -e " Specify which branch to run the tests against (default to ${BOLD}master${NC})" echo "" } function _looper() { if [[ $# -eq 0 ]]; then usage exit 0 fi # parse Options while [[ $# -gt 0 ]]; do case $1 in -n | --n ) shift 1; RUNS="$1"; shift 1 ;; -b | --b | --branch | -branch ) shift 1; BRANCH="$1"; shift 1 ;; * ) usage; exit 0 ;; esac done echo "" echo -e "You are about to start $RUNS Jenkins builds against the $BRANCH branch." echo -e "If you expect this to run overnight, ${UNDERLINE}${BOLD}unplug the cold reboot power switch${NC} from the testing closet before." echo "" read -p "Press (y/Y) to confirm: " choice if [[ "$choice" == "y" || "$choice" == "Y" ]]; then loop fi } _looper $@