From 3a4a21e715520ff3f7908355d5d288b9d9fd9b16 Mon Sep 17 00:00:00 2001 From: Scott Little Date: Wed, 7 Jun 2023 11:24:45 -0400 Subject: [PATCH] tb.sh: Support for Jenkins builds StarlingX comuninty builds are moving to a debian based build server. CentOS builds must no run in a tb.sh managed container. - Add support for seperate repo and workspace mounts - Add support for mock/mock-cache mounts - Add support for timestamp qualified workspace - Settings for above via localrc - Add 'status' subcommand to check container state. Change-Id: I51cefb150fca3f833f73973d43570c241d3533dd Signed-off-by: Scott Little --- Dockerfile | 20 ++++++------ buildrc | 45 +++++++++++++++++++-------- tb.sh | 90 ++++++++++++++++++++++++++++++++++++++++++++++-------- 3 files changed, 120 insertions(+), 35 deletions(-) diff --git a/Dockerfile b/Dockerfile index fc674dbb..657d8ceb 100644 --- a/Dockerfile +++ b/Dockerfile @@ -239,16 +239,6 @@ COPY toCOPY/.inputrc /home/$MYUNAME/ COPY toCOPY/generate-cgcs-tis-repo /usr/local/bin COPY toCOPY/generate-cgcs-centos-repo.sh /usr/local/bin -# ENV setup -RUN echo "# Load stx-builder configuration" >> /etc/profile.d/stx-builder-conf.sh && \ - echo "if [[ -r \${HOME}/buildrc ]]; then" >> /etc/profile.d/stx-builder-conf.sh && \ - echo " source \${HOME}/buildrc" >> /etc/profile.d/stx-builder-conf.sh && \ - echo " export PROJECT SRC_BUILD_ENVIRONMENT MYPROJECTNAME MYUNAME" >> /etc/profile.d/stx-builder-conf.sh && \ - echo " export MY_BUILD_CFG MY_BUILD_CFG_RT MY_BUILD_CFG_STD MY_BUILD_DIR MY_BUILD_ENVIRONMENT MY_BUILD_ENVIRONMENT_FILE MY_BUILD_ENVIRONMENT_FILE_RT MY_BUILD_ENVIRONMENT_FILE_STD MY_DEBUG_BUILD_CFG_RT MY_DEBUG_BUILD_CFG_STD MY_LOCAL_DISK MY_MOCK_ROOT MY_REPO MY_REPO_ROOT_DIR MY_SRC_RPM_BUILD_DIR MY_RELEASE MY_WORKSPACE LAYER" >> /etc/profile.d/stx-builder-conf.sh && \ - echo "fi" >> /etc/profile.d/stx-builder-conf.sh && \ - echo "export FORMAL_BUILD=0" >> /etc/profile.d/stx-builder-conf.sh && \ - echo "export PATH=\$MY_REPO/build-tools:\$PATH" >> /etc/profile.d/stx-builder-conf.sh - # centos locales are broken. this needs to be run after the last yum install/update RUN localedef -i en_US -f UTF-8 en_US.UTF-8 @@ -290,6 +280,16 @@ RUN echo "$MYUNAME ALL=(ALL:ALL) NOPASSWD:ALL" >> /etc/sudoers && \ sed -i "s/dir-listing.activate/#dir-listing.activate/g" /etc/lighttpd/conf.d/dirlisting.conf && \ echo "dir-listing.activate = \"enable\"" >> /etc/lighttpd/conf.d/dirlisting.conf +# ENV setup +RUN echo "# Load stx-builder configuration" >> /etc/profile.d/stx-builder-conf.sh && \ + echo "if [[ -r \${HOME}/buildrc ]]; then" >> /etc/profile.d/stx-builder-conf.sh && \ + echo " source \${HOME}/buildrc" >> /etc/profile.d/stx-builder-conf.sh && \ + echo " export PROJECT SRC_BUILD_ENVIRONMENT MYPROJECTNAME MYUNAME" >> /etc/profile.d/stx-builder-conf.sh && \ + echo " export MY_BUILD_CFG MY_BUILD_CFG_RT MY_BUILD_CFG_STD MY_BUILD_DIR MY_BUILD_ENVIRONMENT MY_BUILD_ENVIRONMENT_FILE MY_BUILD_ENVIRONMENT_FILE_RT MY_BUILD_ENVIRONMENT_FILE_STD MY_DEBUG_BUILD_CFG_RT MY_DEBUG_BUILD_CFG_STD MY_LOCAL_DISK MY_MOCK_ROOT MY_REPO MY_REPO_ROOT_DIR MY_SRC_RPM_BUILD_DIR MY_RELEASE MY_WORKSPACE LAYER" >> /etc/profile.d/stx-builder-conf.sh && \ + echo "fi" >> /etc/profile.d/stx-builder-conf.sh && \ + echo "export FORMAL_BUILD=0" >> /etc/profile.d/stx-builder-conf.sh && \ + echo "export PATH=\$MY_REPO/build-tools:\$PATH" >> /etc/profile.d/stx-builder-conf.sh + RUN useradd -r -u $MYUID -g cgts -m $MYUNAME && \ ln -s /home/$MYUNAME/.ssh /mySSH && \ rsync -av /etc/skel/ /home/$MYUNAME/ diff --git a/buildrc b/buildrc index d1704708..b936857c 100644 --- a/buildrc +++ b/buildrc @@ -33,6 +33,13 @@ fi # Real (outside the container) username export USER=${USER:-$(id -un)} +# avoid calling your project 'build' it will break some SRPMs +export PROJECT=${PROJECT:-test} + +# These are used in the Dockerfile, not sure where else +export MYUNAME=${MYUNAME:-builder} +export MYPROJECTNAME=${PROJECT} + # Local mirror location HOST_MIRROR_DIR=${HOST_MIRROR_DIR:-${HOME}/starlingx/mirror} @@ -44,9 +51,32 @@ HOST_MIRROR_DIR=${HOST_MIRROR_DIR:-${HOME}/starlingx/mirror} # We remove a leading '/' as having more than one breaks certain bits of the build GUEST_LOCALDISK=${LOCALDISK:-localdisk} GUEST_LOCALDISK=${GUEST_LOCALDISK%/} +GUEST_MY_REPO_ROOT_DIR=${MY_REPO_ROOT_DIR:-${GUEST_LOCALDISK}/designer/${MYUNAME}/${PROJECT}} +GUEST_MY_REPO_ROOT_DIR=${GUEST_MY_REPO_ROOT_DIR%/} +GUEST_MY_WORKSPACE_ROOT_DIR=${MY_WORKSPACE_ROOT_DIR:-${GUEST_LOCALDISK}/loadbuild/${MYUNAME}/${PROJECT}} +GUEST_MY_WORKSPACE_ROOT_DIR=${GUEST_MY_WORKSPACE_ROOT_DIR%/} +GUEST_MY_REPO=${MY_REPO:-${GUEST_LOCALDISK}/designer/${MYUNAME}/${PROJECT}/cgcs-root} +GUEST_MY_REPO=${GUEST_MY_REPO%/} +GUEST_MOCK_DIR=${MOCK_DIR:-${GUEST_MY_WORKSPACE_ROOT_DIR}/mock} +GUEST_MOCK_DIR=${GUEST_MOCK_DIR%/} +GUEST_MOCK_CACHE_DIR=${MOCK_CACHE_DIR:-${GUEST_MY_WORKSPACE_ROOT_DIR}/mock} +GUEST_MOCK_CACHE_DIR=${GUEST_MOCK_CACHE_DIR%/} +if [[ -n "${TIMESTAMP}" ]]; then + DEFAULT_GUEST_MY_WORKSPACE=${GUEST_LOCALDISK}/loadbuild/${MYUNAME}/${PROJECT}/${TIMESTAMP} +else + DEFAULT_GUEST_MY_WORKSPACE=${GUEST_LOCALDISK}/loadbuild/${MYUNAME}/${PROJECT} +fi +GUEST_MY_WORKSPACE=${MY_WORKSPACE:-${DEFAULT_GUEST_MY_WORKSPACE}} +GUEST_MY_WORKSPACE=${GUEST_MY_WORKSPACE%/} # In the docker run command this will be correct for the host side of the mapping -LOCALDISK=${HOST_PREFIX}/${GUEST_LOCALDISK} +LOCALDISK=${HOST_PREFIX%/}/${GUEST_LOCALDISK#/} +MY_REPO_ROOT_DIR=${HOST_PREFIX%/}/${GUEST_MY_REPO_ROOT_DIR#/} +MY_REPO=${HOST_PREFIX%/}/${GUEST_MY_REPO#/} +MY_WORKSPACE_ROOT_DIR=${HOST_PREFIX%/}/${GUEST_MY_WORKSPACE_ROOT_DIR#/} +MY_WORKSPACE=${HOST_PREFIX%/}/${GUEST_MY_WORKSPACE#/} +MOCK_DIR=${MOCK_DIR:-${MY_WORKSPACE_ROOT_DIR#/}/mock} +MOCK_CACHE_DIR=${MOCK_CACHE_DIR:-${MY_WORKSPACE_ROOT_DIR#/}/mock-cache} # Release Variable @@ -55,13 +85,6 @@ export MY_RELEASE=${MY_RELEASE:-4.0} # Default branch to build export BRANCH=${BRANCH:-intel_r0} -# avoid calling your project 'build' it will break some SRPMs -export PROJECT=${PROJECT:-test} - -# These are used in the Dockerfile, not sure where else -export MYUNAME=${MYUNAME:-builder} -export MYPROJECTNAME=${PROJECT:-frog1} - export SRC_BUILD_ENVIRONMENT=${SRC_BUILD_ENVIRONMENT:-$MY_RELEASE} # All of the below are dependent on variables defined earlier, right now @@ -70,11 +93,7 @@ export MY_BUILD_ENVIRONMENT=$MYUNAME-$PROJECT-$SRC_BUILD_ENVIRONMENT export MY_BUILD_ENVIRONMENT_FILE=${MY_BUILD_ENVIRONMENT}.cfg export MY_BUILD_ENVIRONMENT_FILE_STD=${MY_BUILD_ENVIRONMENT}-std.cfg export MY_BUILD_ENVIRONMENT_FILE_RT=${MY_BUILD_ENVIRONMENT}-rt.cfg -export MY_BUILD_DIR=${LOCALDISK}/loadbuild/$MYUNAME/$PROJECT -export MY_WORKSPACE=$MY_BUILD_DIR -export MY_LOCAL_DISK=${LOCALDISK}/designer/$MYUNAME -export MY_REPO_ROOT_DIR=$MY_LOCAL_DISK/$PROJECT -export MY_REPO=$MY_REPO_ROOT_DIR/cgcs-root +export MY_BUILD_DIR=${MY_WORKSPACE} export MY_SRC_RPM_BUILD_DIR=$MY_BUILD_DIR/rpmbuild export MY_BUILD_CFG=$MY_WORKSPACE/$MY_BUILD_ENVIRONMENT_FILE export MY_BUILD_CFG_STD=$MY_WORKSPACE/std/${MY_BUILD_ENVIRONMENT_FILE_STD} diff --git a/tb.sh b/tb.sh index 56782c8e..928e691d 100755 --- a/tb.sh +++ b/tb.sh @@ -3,9 +3,14 @@ # # Subcommands: # env - Display a selection of configuration values -# exec - Starts a shell inside a running container -# run - Starts a container -# stop - Stops a running container +# create - Create a docker image customized for the current localrc settings +# create_no_cache - Create a docker image customized for the current localrc settings, but do NOT us the docker cache +# run - Starts a build container +# exec - Starts a shell inside a running build container +# status - Check if the build container is running +# stop - Stops a build container +# kill - Kill the build container +# clean - # # Configuration # tb.sh expects to find its configuration file buildrc in the current @@ -21,8 +26,18 @@ fi CMD=$1 -TC_CONTAINER_NAME=${MYUNAME}-${LAYER}-centos-builder -TC_CONTAINER_TAG=local/${MYUNAME}-stx-builder:7.8 +ROOT_NAME=${MYUNAME} +if [[ -n "${PROJECT}" ]]; then + ROOT_NAME+="-${PROJECT,,}" +fi +if [[ -n "${LAYER}" ]]; then + ROOT_NAME+="-${LAYER,,}" +fi +if [[ -n "${TIMESTAMP}" ]]; then + ROOT_NAME+="-${TIMESTAMP,,}" +fi +TC_CONTAINER_NAME="${ROOT_NAME}-centos-builder" +TC_IMAGE_NAME=local/${ROOT_NAME}-stx-builder:7.8 TC_DOCKERFILE=Dockerfile NO_CACHE=0 @@ -43,7 +58,7 @@ function create_container { ${EXTRA_ARGS} \ --ulimit core=0 \ --network host \ - -t ${TC_CONTAINER_TAG} \ + -t ${TC_IMAGE_NAME} \ -f ${TC_DOCKERFILE} \ . } @@ -57,15 +72,41 @@ function exec_container { function run_container { # create localdisk - mkdir -p ${LOCALDISK}/designer/${MYUNAME}/${PROJECT} + echo "Creating ${MY_WORKSPACE_ROOT_DIR}, ${MY_REPO_ROOT_DIR}, ${HOST_MIRROR_DIR}/CentOS" + mkdir -p ${MY_WORKSPACE_ROOT_DIR} + mkdir -p ${MY_REPO_ROOT_DIR} #create centOS mirror mkdir -p ${HOST_MIRROR_DIR}/CentOS + local extra_mounts="" + + if [[ -d "${MY_WORKSPACE_ROOT_DIR}" ]] && \ + [[ -d "${MY_REPO_ROOT_DIR}" ]] && \ + [[ -n "${MOCK_DIR}" ]] && [[ -n "${MOCK_CACHE_DIR}" ]]; then + if [[ ! -d "${MOCK_DIR}" ]]; then + mkdir -p "${MOCK_DIR}" + chmod 775 "${MOCK_DIR}" + fi + if [[ ! -d "${MOCK_CACHE_DIR}" ]]; then + mkdir -p "${MOCK_CACHE_DIR}" + chmod 775 "${MOCK_CACHE_DIR}" + fi + extra_mounts+="-v $(readlink -f ${MY_WORKSPACE_ROOT_DIR}):/${GUEST_MY_WORKSPACE_ROOT_DIR} " + extra_mounts+="-v $(readlink -f ${MY_REPO_ROOT_DIR}):/${GUEST_MY_REPO_ROOT_DIR} " + extra_mounts+="-v $(readlink -f ${MOCK_DIR}):/localdisk/loadbuild/mock " + extra_mounts+="-v $(readlink -f ${MOCK_CACHE_DIR}):/localdisk/loadbuild/mock-cache " + elif [ -d "${LOCALDISK}" ]; then + extra_mounts+="-v $(readlink -f ${LOCALDISK}):/${GUEST_LOCALDISK} " + else + echo "Can't find '${LOCALDISK}' " + exit 1 + fi + docker run -it --rm \ --name ${TC_CONTAINER_NAME} \ --detach \ + $extra_mounts \ -v /var/run/docker.sock:/var/run/docker.sock \ - -v $(readlink -f ${LOCALDISK}):/${GUEST_LOCALDISK} \ -v ${HOST_MIRROR_DIR}:/import/mirrors:ro \ -v /sys/fs/cgroup:/sys/fs/cgroup:ro \ -v ~/.ssh:/mySSH:ro \ @@ -75,7 +116,16 @@ function run_container { -e MYUNAME=${MYUNAME} \ --privileged=true \ --security-opt seccomp=unconfined \ - ${TC_CONTAINER_TAG} + ${TC_IMAGE_NAME} +} + +function status_container { + docker container ls -f name=${TC_CONTAINER_NAME} +} + +function inspect_container { + echo docker container inspect ${TC_CONTAINER_NAME} + docker container inspect ${TC_CONTAINER_NAME} } function stop_container { @@ -88,26 +138,36 @@ function kill_container { function clean_container { docker rm ${TC_CONTAINER_NAME} || true - docker image rm ${TC_CONTAINER_TAG} + docker image rm ${TC_IMAGE_NAME} } function usage { - echo "$0 [create|create_no_cache|run|exec|env|stop|kill|clean]" + echo "$0 [create|create_no_cache|run|exec|env|status|stop|kill|clean]" } case $CMD in env) echo "LOCALDISK=${LOCALDISK}" echo "GUEST_LOCALDISK=${GUEST_LOCALDISK}" + echo "MY_REPO_ROOT_DIR=${MY_REPO_ROOT_DIR}" + echo "GUEST_MY_REPO_ROOT_DIR=${GUEST_MY_REPO_ROOT_DIR}" + echo "MY_REPO=${MY_REPO}" + echo "GUEST_MY_REPO=${GUEST_MY_REPO}" + echo "MY_WORKSPACE_ROOT_DIR=${MY_WORKSPACE_ROOT_DIR}" + echo "GUEST_MY_WORKSPACE_ROOT_DIR=${GUEST_MY_WORKSPACE_ROOT_DIR}" + echo "MY_WORKSPACE=${MY_WORKSPACE}" + echo "GUEST_MY_WORKSPACE=${GUEST_MY_WORKSPACE}" echo "TC_DOCKERFILE=${TC_DOCKERFILE}" echo "TC_CONTAINER_NAME=${TC_CONTAINER_NAME}" - echo "TC_CONTAINER_TAG=${TC_CONTAINER_TAG}" + echo "TC_IMAGE_NAME=${TC_IMAGE_NAME}" echo "SOURCE_REMOTE_NAME=${SOURCE_REMOTE_NAME}" echo "SOURCE_REMOTE_URI=${SOURCE_REMOTE_URI}" echo "HOST_MIRROR_DIR=${HOST_MIRROR_DIR}" echo "MY_RELEASE=${MY_RELEASE}" echo "MY_REPO_ROOT_DIR=${MY_REPO_ROOT_DIR}" + echo "TIMESTAMP=${TIMESTAMP}" echo "LAYER=${LAYER}" + echo "PROJECT=${PROJECT}" echo "MYUNAME=${MYUNAME}" echo "MY_EMAIL=${MY_EMAIL}" ;; @@ -124,6 +184,12 @@ case $CMD in run) run_container ;; + status) + status_container + ;; + inspect) + inspect_container + ;; stop) stop_container ;;