1#!/bin/bash 2############################################################################### 3# 4# This build script is for running the OpenBMC builds as containers with the 5# option of launching the containers with Docker or Kubernetes. 6# 7############################################################################### 8# 9# Script Variables: 10# build_scripts_dir The path of the openbmc-build-scripts directory. 11# Default: The directory containing this script 12# http_proxy The HTTP address of the proxy server to connect to. 13# Default: "", proxy is not setup if this is not set 14# WORKSPACE Path of the workspace directory where some intermediate 15# files and the images will be saved to. 16# Default: "~/{RandomNumber}" 17# num_cpu Number of cpu's to give bitbake, default is total amount 18# in system 19# 20# Docker Image Build Variables: 21# BITBAKE_OPTS Set to "-c populate_sdk" or whatever other BitBake options 22# you'd like to pass into the build. 23# Default: "", no options set 24# build_dir Path where the actual BitBake build occurs inside the 25# container, path cannot be located on network storage. 26# Default: "/tmp/openbmc" 27# distro The distro used as the base image for the build image: 28# fedora|ubuntu 29# Default: "ubuntu" 30# img_name The name given to the target build's docker image. 31# Default: "openbmc/${distro}:${imgtag}-${target}-${ARCH}" 32# img_tag The base docker image distro tag: 33# ubuntu: latest|16.04|14.04|trusty|xenial 34# fedora: 23|24|25 35# Default: "latest" 36# target The target we aim to build: 37# barreleye|evb-ast2500|firestone|garrison|palmetto|qemu 38# romulus|witherspoon|zaius 39# Default: "qemu" 40# 41# Deployment Variables: 42# launch ""|job|pod 43# Can be left blank to launch the container via Docker 44# Job lets you keep a copy of job and container logs on the 45# api, can be useful if not using Jenkins as you can run the 46# job again via the api without needing this script. 47# Pod launches a container which runs to completion without 48# saving anything to the api when it completes. 49# obmc_dir Path of the OpenBMC repo directory used as a reference 50# for the build inside the container. 51# Default: "${WORKSPACE}/openbmc" 52# ssc_dir Path to use as the BitBake shared-state cache directory. 53# Default: "/home/${USER}" 54# xtrct_path Path where the build_dir contents will be copied out to 55# when the build completes. 56# Default: "${obmc_dir}/build/tmp" 57# 58############################################################################### 59# Trace bash processing. Set -e so when a step fails, we fail the build 60set -xeo pipefail 61 62# Script Variables: 63build_scripts_dir=${build_scripts_dir:-"$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"} 64http_proxy=${http_proxy:-} 65WORKSPACE=${WORKSPACE:-${HOME}/${RANDOM}${RANDOM}} 66num_cpu=${num_cpu:-$(nproc)} 67 68# Docker Image Build Variables: 69build_dir=${build_dir:-/tmp/openbmc} 70distro=${distro:-ubuntu} 71img_tag=${img_tag:-latest} 72target=${target:-qemu} 73 74# Deployment variables 75launch=${launch:-} 76obmc_dir=${obmc_dir:-${WORKSPACE}/openbmc} 77ssc_dir=${ssc_dir:-${HOME}} 78xtrct_path=${xtrct_path:-${obmc_dir}/build/tmp} 79 80PROXY="" 81 82# Determine the architecture 83ARCH=$(uname -m) 84 85# Determine the prefix of the Dockerfile's base image 86case ${ARCH} in 87 "ppc64le") 88 DOCKER_BASE="ppc64le/" 89 ;; 90 "x86_64") 91 DOCKER_BASE="" 92 ;; 93 *) 94 echo "Unsupported system architecture(${ARCH}) found for docker image" 95 exit 1 96esac 97 98# Timestamp for job 99echo "Build started, $(date)" 100 101# If the obmc_dir directory doesn't exist clone it in 102if [ ! -d ${obmc_dir} ]; then 103 echo "Clone in openbmc master to ${obmc_dir}" 104 git clone https://github.com/openbmc/openbmc ${obmc_dir} 105fi 106 107# Make and chown the xtrct_path directory to avoid permission errors 108if [ ! -d ${xtrct_path} ]; then 109 mkdir -p ${xtrct_path} 110fi 111chown ${UID}:${GROUPS} ${xtrct_path} 112 113# Work out what build target we should be running and set BitBake command 114case ${target} in 115 barreleye) 116 BITBAKE_CMD="TEMPLATECONF=meta-openbmc-machines/meta-openpower/meta-rackspace/meta-barreleye/conf source oe-init-build-env" 117 ;; 118 palmetto) 119 BITBAKE_CMD="TEMPLATECONF=meta-openbmc-machines/meta-openpower/meta-ibm/meta-palmetto/conf source oe-init-build-env" 120 ;; 121 witherspoon) 122 BITBAKE_CMD="TEMPLATECONF=meta-openbmc-machines/meta-openpower/meta-ibm/meta-witherspoon/conf source oe-init-build-env" 123 ;; 124 firestone) 125 BITBAKE_CMD="TEMPLATECONF=meta-openbmc-machines/meta-openpower/meta-ibm/meta-firestone/conf source oe-init-build-env" 126 ;; 127 garrison) 128 BITBAKE_CMD="TEMPLATECONF=meta-openbmc-machines/meta-openpower/meta-ibm/meta-garrison/conf source oe-init-build-env" 129 ;; 130 evb-ast2500) 131 BITBAKE_CMD="TEMPLATECONF=meta-openbmc-machines/meta-evb/meta-evb-aspeed/meta-evb-ast2500/conf source oe-init-build-env" 132 ;; 133 zaius) 134 BITBAKE_CMD="TEMPLATECONF=meta-openbmc-machines/meta-openpower/meta-ingrasys/meta-zaius/conf source oe-init-build-env" 135 ;; 136 romulus) 137 BITBAKE_CMD="TEMPLATECONF=meta-openbmc-machines/meta-openpower/meta-ibm/meta-romulus/conf source oe-init-build-env" 138 ;; 139 qemu) 140 BITBAKE_CMD="source openbmc-env" 141 ;; 142 *) 143 exit 1 144 ;; 145esac 146 147# Configure Docker build 148if [[ "${distro}" == fedora ]];then 149 150 if [[ -n "${http_proxy}" ]]; then 151 PROXY="RUN echo \"proxy=${http_proxy}\" >> /etc/dnf/dnf.conf" 152 fi 153 154 Dockerfile=$(cat << EOF 155 FROM ${DOCKER_BASE}${distro}:${img_tag} 156 157 ${PROXY} 158 159 # Set the locale 160 RUN locale-gen en_US.UTF-8 161 ENV LANG en_US.UTF-8 162 ENV LANGUAGE en_US:en 163 ENV LC_ALL en_US.UTF-8 164 165 RUN dnf --refresh install -y \ 166 bzip2 \ 167 chrpath \ 168 cpio \ 169 diffstat \ 170 findutils \ 171 gcc \ 172 gcc-c++ \ 173 git \ 174 make \ 175 patch \ 176 perl-bignum \ 177 perl-Data-Dumper \ 178 perl-Thread-Queue \ 179 python-devel \ 180 python3-devel \ 181 SDL-devel \ 182 socat \ 183 subversion \ 184 tar \ 185 texinfo \ 186 wget \ 187 which \ 188 iputils-ping 189 190 RUN grep -q ${GROUPS} /etc/group || groupadd -g ${GROUPS} ${USER} 191 RUN grep -q ${UID} /etc/passwd || useradd -d ${HOME} -m -u ${UID} -g ${GROUPS} ${USER} 192 193 USER ${USER} 194 ENV HOME ${HOME} 195 RUN /bin/bash 196EOF 197) 198 199elif [[ "${distro}" == ubuntu ]]; then 200 201 if [[ -n "${http_proxy}" ]]; then 202 PROXY="RUN echo \"Acquire::http::Proxy \\"\"${http_proxy}/\\"\";\" > /etc/apt/apt.conf.d/000apt-cacher-ng-proxy" 203 fi 204 205 Dockerfile=$(cat << EOF 206 FROM ${DOCKER_BASE}${distro}:${img_tag} 207 208 ${PROXY} 209 210 ENV DEBIAN_FRONTEND noninteractive 211 212 RUN apt-get update && apt-get install -yy \ 213 build-essential \ 214 chrpath \ 215 debianutils \ 216 diffstat \ 217 gawk \ 218 git \ 219 libdata-dumper-simple-perl \ 220 libsdl1.2-dev \ 221 libthread-queue-any-perl \ 222 locales \ 223 python \ 224 python3 \ 225 socat \ 226 subversion \ 227 texinfo \ 228 cpio \ 229 wget \ 230 iputils-ping 231 232 # Set the locale 233 RUN locale-gen en_US.UTF-8 234 ENV LANG en_US.UTF-8 235 ENV LANGUAGE en_US:en 236 ENV LC_ALL en_US.UTF-8 237 238 RUN grep -q ${GROUPS} /etc/group || groupadd -g ${GROUPS} ${USER} 239 RUN grep -q ${UID} /etc/passwd || useradd -d ${HOME} -m -u ${UID} -g ${GROUPS} ${USER} 240 241 USER ${USER} 242 ENV HOME ${HOME} 243 RUN /bin/bash 244EOF 245) 246fi 247 248# Create the Docker run script 249export PROXY_HOST=${http_proxy/#http*:\/\/} 250export PROXY_HOST=${PROXY_HOST/%:[0-9]*} 251export PROXY_PORT=${http_proxy/#http*:\/\/*:} 252 253mkdir -p ${WORKSPACE} 254 255cat > "${WORKSPACE}"/build.sh << EOF_SCRIPT 256#!/bin/bash 257 258set -xeo pipefail 259 260# Go into the OpenBMC directory, the build will handle changing directories 261cd ${obmc_dir} 262 263# Set up proxies 264export ftp_proxy=${http_proxy} 265export http_proxy=${http_proxy} 266export https_proxy=${http_proxy} 267 268mkdir -p ${WORKSPACE}/bin 269 270# Configure proxies for BitBake 271if [[ -n "${http_proxy}" ]]; then 272 273 cat > ${WORKSPACE}/bin/git-proxy << \EOF_GIT 274 #!/bin/bash 275 # \$1 = hostname, \$2 = port 276 PROXY=${PROXY_HOST} 277 PROXY_PORT=${PROXY_PORT} 278 exec socat STDIO PROXY:\${PROXY}:\${1}:\${2},proxyport=\${PROXY_PORT} 279EOF_GIT 280 281 chmod a+x ${WORKSPACE}/bin/git-proxy 282 export PATH=${WORKSPACE}/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:${PATH} 283 git config core.gitProxy git-proxy 284 285 mkdir -p ~/.subversion 286 287 cat > ~/.subversion/servers << EOF_SVN 288 [global] 289 http-proxy-host = ${PROXY_HOST} 290 http-proxy-port = ${PROXY_PORT} 291EOF_SVN 292fi 293 294# Source our build env 295${BITBAKE_CMD} 296 297# Custom BitBake config settings 298cat >> conf/local.conf << EOF_CONF 299BB_NUMBER_THREADS = "$(nproc)" 300PARALLEL_MAKE = "-j$(nproc)" 301INHERIT += "rm_work" 302BB_GENERATE_MIRROR_TARBALLS = "1" 303DL_DIR="${ssc_dir}/bitbake_downloads" 304SSTATE_DIR="${ssc_dir}/bitbake_sharedstatecache" 305USER_CLASSES += "buildstats" 306INHERIT_remove = "uninative" 307TMPDIR="${build_dir}" 308EOF_CONF 309 310# Kick off a build 311bitbake ${BITBAKE_OPTS} obmc-phosphor-image 312 313# Copy internal build directory into xtrct_path directory 314cp -r ${build_dir}/* ${xtrct_path} 315EOF_SCRIPT 316 317chmod a+x ${WORKSPACE}/build.sh 318 319# Give the Docker image a name based on the distro,tag,arch,and target 320img_name=${img_name:-openbmc/${distro}:${img_tag}-${target}-${ARCH}} 321 322# Build the Docker image 323docker build -t ${img_name} - <<< "${Dockerfile}" 324 325# Determine if the build container will be launched with Docker or Kubernetes 326if [[ "${launch}" == "" ]]; then 327 328 # If obmc_dir or ssc_dir are ${HOME} or a subdirectory they will not be mounted 329 mount_obmc_dir="-v ""${obmc_dir}"":""${obmc_dir}"" " 330 mount_ssc_dir="-v ""${ssc_dir}"":""${ssc_dir}"" " 331 if [[ "${obmc_dir}" = "${HOME}/"* || "${obmc_dir}" = "${HOME}" ]];then 332 mount_obmc_dir="" 333 fi 334 if [[ "${ssc_dir}" = "${HOME}/"* || "${ssc_dir}" = "${HOME}" ]];then 335 mount_ssc_dir="" 336 fi 337 338 # Run the Docker container, execute the build.sh script 339 docker run \ 340 --cap-add=sys_admin \ 341 --net=host \ 342 --rm=true \ 343 -e WORKSPACE=${WORKSPACE} \ 344 -w "${HOME}" \ 345 -v "${HOME}":"${HOME}" \ 346 ${mount_obmc_dir} \ 347 ${mount_ssc_dir} \ 348 --cpus="$num_cpu" \ 349 -t ${img_name} \ 350 ${WORKSPACE}/build.sh 351 352elif [[ "${launch}" == "job" || "${launch}" == "pod" ]]; then 353 354 # Source and run the helper script to launch the pod or job 355 . ${build_scripts_dir}/kubernetes/kubernetes-launch.sh OpenBMC-build true true 356 357else 358 echo "Launch Parameter is invalid" 359fi 360 361# To maintain function of resources that used an older path, add a link 362ln -sf ${xtrct_path}/deploy ${WORKSPACE}/deploy 363 364# Timestamp for build 365echo "Build completed, $(date)" 366