From 41230705dcccd2010dc7a748dfaa8cc6fb2c3f91 Mon Sep 17 00:00:00 2001 From: Pau Espin Pedrol Date: Thu, 19 Mar 2020 20:11:56 +0100 Subject: [PATCH] osmo-gsm-tester: Build srsLTE inside the docker instance if inst not provided by host osmo-gsm-tester.git/contrib/jenkins-build-srslte.sh cannot be used because there's a need to split the fetch step from the build step. That's because we want to fetch in the host (in order to use host's user ssh key for potential private repos) while still building inside the docker container, where we have all the dependencies (and where the binaries are going to be run afterwards by osmo-gsm-tester). During the changes above it was also noticed that /tmp/trial on the host got its UID+GID changed (because we switch user inside the container to downscale privileges). Fix it by chown'ing the directory back to the host user's UID+GID. Change-Id: Ia0db8fba840392a0b7883cfc15e45c2e80407a16 --- osmo-gsm-tester/jenkins.sh | 49 +++++++++++++++++++++-- osmo-gsm-tester/osmo-gsm-tester-master.sh | 37 ++++++++++++++++- 2 files changed, 81 insertions(+), 5 deletions(-) diff --git a/osmo-gsm-tester/jenkins.sh b/osmo-gsm-tester/jenkins.sh index c114222f..58768c49 100755 --- a/osmo-gsm-tester/jenkins.sh +++ b/osmo-gsm-tester/jenkins.sh @@ -1,11 +1,20 @@ #!/bin/sh -# This docket env allows running a typical osmo-gsm-tester setup with a main +# This docker env allows running a typical osmo-gsm-tester setup with a main # unit (ogt-master) running osmo-gsm-tester process, and using another docker # container as a remote host where to run child processes. # -# Trial directory must be set in the parent host's /tmp/trial path, which will -# then be mounted to ogt-master and used my osmo-gsm-tester. +# Trial directory to use may be placed in the container's host /tmp/trial path, +# which will then be mounted to ogt-master and used my osmo-gsm-tester. +# If no inst is detected, then jenkins.sh will attempt to fetch the sources in +# the host system (so that host's user ssh keys are potentially available) under +# /tmp/trial, and the inst is then later built inside the container. +# Several env vars are available to tweak where to fetch from. +# SRS_LTE_BRANCH: The srsLTE.git branch to fetch. +# SRS_LTE_REPO_PREFIX: The URL & prefix patch from where to clone the srsLTe.git +# repo. +# SRS_LTE_REPO_NAME: The srsLTE.git repo name, usually "srsLTE", but known to +# have different names on some forks. # # osmo-gsm-tester parameters and suites are passed to osmo-gsm-tester.sh in same # directory as this script using environment variable OSMO_GSM_TESTER_OPTS. @@ -14,6 +23,35 @@ # osmo-gsm-tester last run can be found as usual under the trial directory # (/tmp/trial/last_run). +TRIAL_DIR="/tmp/trial" + +SRS_LTE_BRANCH=${SRS_LTE_BRANCH:-master} +SRS_LTE_REPO_PREFIX=${SRS_LTE_REPO_PREFIX:-git@github.com:srsLTE} +SRS_LTE_REPO_NAME=${SRS_LTE_REPO_NAME:-srsLTE} +have_repo_srslte() { + echo "srsLTE inst not provided, fetching it now and it will be build in container" + if [ -d "${TRIAL_DIR}/${SRS_LTE_REPO_NAME}" ]; then + git fetch -C ${TRIAL_DIR}/${SRS_LTE_REPO_NAME} + else + mkdir -p ${TRIAL_DIR} + git clone "${SRS_LTE_REPO_PREFIX}/${SRS_LTE_REPO_NAME}" "${TRIAL_DIR}/${SRS_LTE_REPO_NAME}" + fi + # Figure out whether we need to prepend origin/ to find branches in upstream. + # Doing this allows using git hashes instead of a branch name. + if git -C "${TRIAL_DIR}/${SRS_LTE_REPO_NAME}" rev-parse "origin/$SRS_LTE_BRANCH"; then + SRS_LTE_BRANCH="origin/$SRS_LTE_BRANCH" + fi + + git -C "${TRIAL_DIR}/${SRS_LTE_REPO_NAME}" checkout -B build_branch "$SRS_LTE_BRANCH" + rm -rf "${TRIAL_DIR:?}/${SRS_LTE_REPO_NAME}/*" + git -C "${TRIAL_DIR}/${SRS_LTE_REPO_NAME}" reset --hard "$SRS_LTE_BRANCH" +} + +# If srsLTE trial not provided by user, fetch srsLTE git repo and let the container build it: +if [ "x$(ls ${TRIAL_DIR}/srslte.*.tgz 2>/dev/null | wc -l)" = "x0" ]; then + have_repo_srslte +fi + . ../jenkins-common.sh IMAGE_SUFFIX="${IMAGE_SUFFIX:-master}" docker_images_require \ @@ -51,8 +89,11 @@ docker run --rm \ --network $NET_NAME \ --ip 172.18.50.2 \ -v $VOL_BASE_DIR/ogt-master:/data \ - -v /tmp/trial:/tmp/trial \ + -v "${TRIAL_DIR}:/tmp/trial" \ -e "OSMO_GSM_TESTER_OPTS=${OSMO_GSM_TESTER_OPTS}" \ + -e "SRS_LTE_REPO_NAME=${SRS_LTE_REPO_NAME}" \ + -e "HOST_USER_ID=$(id -u)" \ + -e "HOST_GROUP_ID=$(id -g)" \ --name ${BUILD_TAG}-ogt-master \ $REPO_USER/osmo-gsm-tester diff --git a/osmo-gsm-tester/osmo-gsm-tester-master.sh b/osmo-gsm-tester/osmo-gsm-tester-master.sh index 975e4e5c..bd8a659e 100755 --- a/osmo-gsm-tester/osmo-gsm-tester-master.sh +++ b/osmo-gsm-tester/osmo-gsm-tester-master.sh @@ -11,4 +11,39 @@ ip addr add 172.18.50.8/24 dev eth0 ip addr add 172.18.50.9/24 dev eth0 ip addr add 172.18.50.10/24 dev eth0 -su -c "python3 -u /tmp/osmo-gsm-tester/src/osmo-gsm-tester.py /tmp/trial $OSMO_GSM_TESTER_OPTS" -m jenkins +build_srslte() { + git_repo_dir="/tmp/trial/${SRS_LTE_REPO_NAME}" + if [ ! -d "$git_repo_dir" ]; then + echo "No external trial nor git repo provided for srsLTE!" + exit 1 + fi + pushd "/tmp/trial" + rm -rf inst && mkdir inst + rm -rf build && mkdir build && cd build || exit 1 + cmake -DCMAKE_INSTALL_PREFIX="../inst/" "${git_repo_dir}" + set +x; echo; echo; set -x + make "-j$(nproc)" + set +x; echo; echo; set -x + make install + this="srslte.build-${BUILD_NUMBER-$(date +%Y-%m-%d_%H_%M_%S)}" + tar="${this}.tgz" + tar czf "/tmp/trial/$tar" -C "/tmp/trial/inst" . + cd "/tmp/trial/" && md5sum "$tar" >>checksums.md5 + popd +} + +# Build srsLTE.git if not provided by host system: +if [ "x$(ls /tmp/trial/srslte.*.tgz 2>/dev/null | wc -l)" = "x0" ]; then + build_srslte +fi + +# Make trial dir avaialable to jenkins user inside container: +chown -R jenkins /tmp/trial/ + +rc=0 +su -c "python3 -u /tmp/osmo-gsm-tester/src/osmo-gsm-tester.py /tmp/trial $OSMO_GSM_TESTER_OPTS" -m jenkins || rc=$? + +# Make trial dir again owned by user running the container: +chown -R "${HOST_USER_ID}:${HOST_GROUP_ID}" /tmp/trial/ + +exit $rc