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.

Signed-off-by: Scott Little <scott.little@windriver.com>
Change-Id: I3abd7c0bc0651107e599cb71878464bc7a0ebc5e
This commit is contained in:
Scott Little 2023-06-07 11:24:45 -04:00
parent 88919b76a9
commit 08b18c40ab
3 changed files with 121 additions and 35 deletions

View File

@ -218,16 +218,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
@ -269,6 +259,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/

46
buildrc
View File

@ -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}
export LOCALDISK=${HOST_PREFIX%/}/${GUEST_LOCALDISK#/}
export MY_REPO_ROOT_DIR=${HOST_PREFIX%/}/${GUEST_MY_REPO_ROOT_DIR#/}
export MY_REPO=${HOST_PREFIX%/}/${GUEST_MY_REPO#/}
export MY_WORKSPACE_ROOT_DIR=${HOST_PREFIX%/}/${GUEST_MY_WORKSPACE_ROOT_DIR#/}
export MY_WORKSPACE=${HOST_PREFIX%/}/${GUEST_MY_WORKSPACE#/}
export MOCK_DIR=${MOCK_DIR:-${MY_WORKSPACE_ROOT_DIR#/}/mock}
export 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,8 @@ 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_WORKSPACE=${MY_BUILD_DIR}
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}

90
tb.sh
View File

@ -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}-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
;;