File:  [Coherent Logic Development] / buildman / bm
Revision 1.9: download - view: text, annotated - select for diffs
Mon Mar 10 17:17:29 2025 UTC (4 months, 3 weeks ago) by snw
Branches: MAIN
CVS tags: HEAD
Add support for requesting a project build on all hosts at once

    1: #!/bin/sh
    2: 
    3: # SPDX-FileCopyrightText: (C) 2025 Coherent Logic Development LLC
    4: # SPDX-FileCopyrightText: (C) 2025 Serena Willis
    5: #
    6: # SPDX-License-Identifier: AGPL-3.0
    7: 
    8: #
    9: # BuildMan 0.0.1
   10: #  Distributed CI/CD system with portability to older UNIX systems
   11: #
   12: #  bm - primary BuildMan script
   13: #
   14: # Copyright (C) 2025 Coherent Logic Development LLC
   15: #
   16: # Author: Serena Willis <snw@coherent-logic.com>
   17: #
   18: 
   19: PROGN=`basename $0`
   20: 
   21: if [ -f "/etc/default/bm" ]
   22: then
   23:     . /etc/default/bm
   24: else
   25:     echo "${PROGN} error:  no /etc/default/bm"
   26:     exit 1
   27: fi
   28: 
   29: if [ -z ${BUILDMAN_BASE} ]
   30: then
   31:     echo "${PROGN} error:  BUILDMAN_BASE undefined"
   32:     exit 1
   33: fi
   34: 
   35: if [ -z ${BUILDMAN_UID} ]
   36: then
   37:     echo "${PROGN} error:  BUILDMAN_UID undefined"
   38:     exit 1
   39: fi
   40: 
   41: if [ -z ${BUILDMAN_GID} ]
   42: then
   43:     echo "${PROGN} error:  BUILDMAN_GID undefined"
   44:     exit 1
   45: fi
   46: 
   47: #if [ $EUID -ne ${BUILDMAN_UID} ]
   48: #then
   49: #    echo "${PROGN} error:  must be run as user \"${BUILDMAN_USER}\""
   50: #    exit 1
   51: #fi
   52: 
   53: ACTION=""
   54: PROJECT=""
   55: BUILD_HOST=""
   56: OS=`uname`
   57: PYES="no"
   58: 
   59: if [ "$OS" = "SCO_SV" ] ; then
   60:     THOST=`hostname -s`
   61:     PATH=/usr/gnu/bin:$PATH
   62:     export PATH
   63: else
   64:     if [ "$OS" = "SunOS" ] ; then
   65:         THOST=`hostname`
   66:     else    
   67:         THOST=`hostname -s`
   68:     fi
   69: fi
   70: 
   71: tmphost=`echo ${THOST} | cut -d. -f1`
   72: THOST="${tmphost}"
   73: 
   74: while getopts ':p:h:a:bl:o:y' OPTION
   75: do
   76:     case $OPTION in
   77: 
   78:         y)
   79:             PYES="yes"
   80:             ;;
   81:         
   82:         l)
   83:             ACTION="list"
   84:             TOLIST="${OPTARG}"
   85:             ;;
   86: 
   87:         o)
   88:             OPTIONS="${OPTARG}"
   89:             ;;
   90:         
   91:         p)
   92:             PROJECT="${OPTARG}"
   93:             ;;
   94: 
   95:         a)
   96:             ACTION="add"
   97:             TOADD="${OPTARG}"
   98:             ;;
   99: 
  100:         b)
  101:             ACTION="build"
  102:             ;;
  103: 
  104:         h)
  105:             BUILD_HOST="${OPTARG}"
  106:             ;;
  107: 
  108:     esac
  109: done
  110: 
  111: if [ "${ACTION}" = "" ]
  112: then
  113:     echo "${PROGN}:  no action specified"
  114:     exit 1
  115: fi
  116: 
  117: if [ ! -z "${PROJECT}" ]
  118: then
  119:     PROJECT_BASE="${BUILDMAN_BASE}/projects/${PROJECT}"
  120:     if [ "${ACTION}" = "add" -a ! -d ${PROJECT_BASE} ]
  121:     then
  122:         echo "$PROGN:  creating ${PROJECT} in ${PROJECT_BASE}..."
  123:         mkdir -p "${PROJECT_BASE}"
  124:     fi
  125: 
  126:     if [ ! -d "${PROJECT_BASE}" ]
  127:     then
  128:         echo "$PROGN error:  project ${PROJECT} not defined [${PROJECT_BASE}]"
  129:         exit 1
  130:     fi
  131: fi
  132: 
  133: case $ACTION in
  134: 
  135:     list)
  136:         case $TOLIST in
  137: 
  138:             p|projects)
  139:                 ls -d -1 ${BUILDMAN_BASE}/projects/*
  140:                 ;;
  141: 
  142:             h|hosts)
  143:                 BHOSTS=`ls -1 "${BUILDMAN_BASE}/projects/${PROJECT}/hosts"`
  144:                 for BHOST in ${BHOSTS}
  145:                 do
  146:                     echo ${BHOST}
  147:                 done
  148:                 ;;
  149: 
  150:             *)
  151:                 echo "$PROGN error:  invalid list specifier \"${TOLIST}\""
  152:                 exit 1
  153:                 ;;
  154:         esac
  155:         ;;
  156: 
  157:     add)
  158:         case $TOADD in
  159: 
  160:             p|project)
  161:                 if [ -z "${PROJECT}" ]
  162:                 then
  163:                     echo "$PROGN error:  no project specified (use -p)"
  164:                     exit 1
  165:                 fi
  166: 
  167:                 PBASE="${BUILDMAN_BASE}/projects/${PROJECT}"
  168:                 if [ -d "${PBASE}" ]
  169:                 then
  170:                     echo "$PROGN error:  project \"${PROJECT}\" already exists"
  171:                     exit 1
  172:                 fi
  173: 
  174:                 echo "$PROGN:  creating directory structure for project \"${PROJECT}\""
  175:                 mkdir -p "${PBASE}/hosts"
  176:                 mkdir -p "${PBASE}/scripts"                
  177:                 ;;
  178:             
  179: 
  180:             h|host)
  181:                 if [ -z "${PROJECT}" ]
  182:                 then
  183:                     echo "$PROGN error:  no project specified (use -p)"
  184:                     exit 1
  185:                 fi
  186: 
  187:                 PBASE="${BUILDMAN_BASE}/projects/${PROJECT}"
  188: 
  189:                 if [ ! -d "${PBASE}" ]
  190:                 then
  191:                     echo "$PROGN error:  project \"${PROJECT}\" does not exist"
  192:                     exit 1
  193:                 fi
  194:                 
  195:                 if [ -z "${BUILD_HOST}" ]
  196:                 then
  197:                     echo "$PROGN error:  no host specified (use -h)"
  198:                     exit 1
  199:                 fi
  200: 
  201:                 HBASE="${PBASE}/hosts/${BUILD_HOST}"
  202:                 if [ -d "${HBASE}" ]
  203:                 then
  204:                     echo "$PROGN error:  build host \"${BUILD_HOST}\" already exists"
  205:                     exit 1
  206:                 fi
  207: 
  208:                 if [ -z "${OPTIONS}" ]
  209:                 then
  210:                     echo "$PROGN error:  must pass -o \"os:version:arch\""
  211:                     exit 1
  212:                 fi
  213: 
  214:                 PLSTR="${BUILD_HOST}:${OPTIONS}:buildman::"
  215:                 H_PLATFORM=`echo ${PLSTR} | cut -d: -f2`
  216:                 H_VERSION=`echo ${PLSTR} | cut -d: -f3`
  217:                 H_ARCH=`echo ${PLSTR} | cut -d: -f4`                
  218:                 
  219:                 if [ "${PYES}" = "no" ]
  220:                 then
  221:                     echo
  222:                     echo "Host Details"
  223:                     echo "============"
  224:                     echo "Project:        ${PROJECT}"
  225:                     echo "Hostname:       ${BUILD_HOST}"
  226:                     echo "Platform:       ${H_PLATFORM}"
  227:                     echo "Version:        ${H_VERSION}"
  228:                     echo "Architecture:   ${H_ARCH}"
  229:                     echo
  230:                     
  231:                     read -n 1 -p "OK to create? (y/n) " YORN
  232:                     echo
  233:                     
  234:                     if [ "${YORN}" = "y" -o "${YORN}" = "Y" ]
  235:                     then
  236:                         CONF=1
  237:                     else
  238:                         echo "$PROGN:  aborted"
  239:                         exit 2
  240:                     fi
  241:                 fi
  242:                     
  243:                 echo "$PROGN:  adding host \"${BUILD_HOST}\" to project \"${PROJECT}\""
  244:                 mkdir -p "${HBASE}"
  245:                 mkdir -p "${HBASE}/jobs"
  246:                 mkdir -p "${HBASE}/logs"
  247:                 
  248:                 PFILE="${PBASE}/${H_PLATFORM}-platform.list"
  249:                 echo
  250:                 echo "=================================================="
  251:                 echo " Don't forget to add the BuildMan cron job"
  252:                 echo " to ${BUILDMAN_USER}@${BUILD_HOST}"
  253:                 echo "=================================================="
  254:                 echo                
  255:                 echo "${PLSTR}" >> "${PFILE}"                
  256:                 cd ${PBASE}
  257:                 ls -1 *-platform.list | cut -d- -f1 | sort | uniq > platforms.list                
  258:                 ;;
  259: 
  260:         esac
  261:         ;;
  262:                 
  263: 
  264:     
  265:     build)
  266:         if [ -z "${BUILD_HOST}" ]
  267:         then
  268:             echo "$PROGN error:  no build host specified"
  269:             exit 1
  270:         fi
  271: 
  272:         if [ "${BUILD_HOST}" != '*' ]
  273:         then        
  274:             BUILD_BASE="${PROJECT_BASE}/hosts/${BUILD_HOST}"
  275: 
  276:             if [ ! -d "${BUILD_BASE}" ]
  277:             then
  278:                 echo "$PROGN error:  build host ${BUILD_HOST} not configured"
  279:                 exit 1
  280:             fi
  281:             
  282:             BUILD_WANTED="${PROJECT_BASE}/hosts/${BUILD_HOST}/build-wanted"
  283: 
  284:             if [ -f "${BUILD_WANTED}" ]
  285:             then
  286:                 echo "$PROGN error:  build already requested on host ${BUILD_HOST}"
  287:                 exit 1
  288:             fi
  289: 
  290:             touch "${BUILD_WANTED}"
  291:             echo "$PROGN:  build of project ${PROJECT} requested on ${BUILD_HOST}"
  292:         else
  293:             BHOSTS=`ls -1 "${BUILDMAN_BASE}/projects/${PROJECT}/hosts"`
  294:             for BUILD_HOST in ${BHOSTS}
  295:             do
  296:                 BUILD_BASE="${PROJECT_BASE}/hosts/${BUILD_HOST}"
  297:                 
  298:                 if [ ! -d "${BUILD_BASE}" ]
  299:                 then
  300:                     echo "$PROGN error:  build host ${BUILD_HOST} not configured"
  301:                     continue
  302:                 fi
  303:                 
  304:                 BUILD_WANTED="${PROJECT_BASE}/hosts/${BUILD_HOST}/build-wanted"
  305:                 
  306:                 if [ -f "${BUILD_WANTED}" ]
  307:                 then
  308:                     echo "$PROGN error:  build already requested on ${BUILD_HOST}"
  309:                     continue
  310:                 fi
  311:                 
  312:                 touch "${BUILD_WANTED}" > /dev/null 2>&1
  313:                 if [ $? = 0 ]
  314:                 then
  315:                     echo "$PROGN:  build of project ${PROJECT} requested on build host ${BUILD_HOST}"
  316:                 else
  317:                     echo "$PROGN:  error requesting build of ${PROJECT} on build host ${BUILD_HOST}"
  318:                 fi
  319:             done           
  320:         fi
  321:         ;;
  322: 
  323: esac

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>