xref: /openbmc/openbmc-build-scripts/scripts/build-qemu-robot-docker.sh (revision 147139ae7a61abbfdd7aa0429725d468d9300cfa)
10205e8daSAndrew Geissler#!/bin/bash -xe
20205e8daSAndrew Geissler#
30205e8daSAndrew Geissler# Build the required docker image to run QEMU and Robot test cases
4ba111abfSLei YU
5ba111abfSLei YU# Script Variables:
6ba111abfSLei YU#  UBUNTU_MIRROR:    <optional, the URL of a mirror of Ubuntu to override the
7ba111abfSLei YU#                    default ones in /etc/apt/sources.list>
8ba111abfSLei YU#                    default is empty, and no mirror is used.
951b6aec6SLei YU#  PIP_MIRROR:       <optional, the URL of a PIP mirror>
1051b6aec6SLei YU#                    default is empty, and no mirror is used.
11b80ea07bSAndrew Geissler#  DOCKER_REG:       <optional, the URL of a docker registry to utilize
12fb45daa4SAndrew Geissler#                    instead of our default (public.ecr.aws/ubuntu)
13fb45daa4SAndrew Geissler#                    (ex. docker.io)
140205e8daSAndrew Geissler#  Parameters:
150205e8daSAndrew Geissler#   parm1:  <optional, the name of the docker image to generate>
160205e8daSAndrew Geissler#            default is openbmc/ubuntu-robot-qemu
178b8333b5SAndrew Geissler#   param2: <optional, the distro to build a docker image against>
180205e8daSAndrew Geissler
190205e8daSAndrew Geisslerset -uo pipefail
200205e8daSAndrew Geissler
21d374874dSLei YUhttp_proxy=${http_proxy:-}
22d374874dSLei YU
230205e8daSAndrew GeisslerDOCKER_IMG_NAME=${1:-"openbmc/ubuntu-robot-qemu"}
2486ae1358SNan ZhouDISTRO=${2:-"ubuntu:jammy"}
25ba111abfSLei YUUBUNTU_MIRROR=${UBUNTU_MIRROR:-""}
2651b6aec6SLei YUPIP_MIRROR=${PIP_MIRROR:-""}
27fb45daa4SAndrew Geisslerdocker_reg=${DOCKER_REG:-"public.ecr.aws/ubuntu"}
280205e8daSAndrew Geissler
29ba111abfSLei YUMIRROR=""
30ba111abfSLei YUif [[ -n "${UBUNTU_MIRROR}" ]]; then
31ba111abfSLei YU    MIRROR="RUN echo \"deb ${UBUNTU_MIRROR} \$(. /etc/os-release && echo \$VERSION_CODENAME) main restricted universe multiverse\" > /etc/apt/sources.list && \
32ba111abfSLei YU        echo \"deb ${UBUNTU_MIRROR} \$(. /etc/os-release && echo \$VERSION_CODENAME)-updates main restricted universe multiverse\" >> /etc/apt/sources.list && \
33ba111abfSLei YU        echo \"deb ${UBUNTU_MIRROR} \$(. /etc/os-release && echo \$VERSION_CODENAME)-security main restricted universe multiverse\" >> /etc/apt/sources.list && \
34ba111abfSLei YU        echo \"deb ${UBUNTU_MIRROR} \$(. /etc/os-release && echo \$VERSION_CODENAME)-proposed main restricted universe multiverse\" >> /etc/apt/sources.list && \
35ba111abfSLei YU        echo \"deb ${UBUNTU_MIRROR} \$(. /etc/os-release && echo \$VERSION_CODENAME)-backports main restricted universe multiverse\" >> /etc/apt/sources.list"
36ba111abfSLei YUfi
37ba111abfSLei YU
3851b6aec6SLei YUPIP_MIRROR_CMD=""
3951b6aec6SLei YUif [[ -n "${PIP_MIRROR}" ]]; then
40384d741bSPatrick Williams    PIP_HOSTNAME=$(echo "${PIP_MIRROR}" | awk -F[/:] '{print $4}')
4151b6aec6SLei YU    PIP_MIRROR_CMD="RUN mkdir -p \${HOME}/.pip && \
4251b6aec6SLei YU        echo \"[global]\" > \${HOME}/.pip/pip.conf && \
4351b6aec6SLei YU        echo \"index-url=${PIP_MIRROR}\" >> \${HOME}/.pip/pip.conf &&\
4451b6aec6SLei YU        echo \"[install]\" >> \${HOME}/.pip/pip.conf &&\
4551b6aec6SLei YU        echo \"trusted-host=${PIP_HOSTNAME}\" >> \${HOME}/.pip/pip.conf"
4651b6aec6SLei YUfi
4751b6aec6SLei YU
480205e8daSAndrew Geissler################################# docker img # #################################
490205e8daSAndrew Geissler# Create docker image that can run QEMU and Robot Tests
500205e8daSAndrew GeisslerDockerfile=$(cat << EOF
51b80ea07bSAndrew GeisslerFROM ${docker_reg}/${DISTRO}
520205e8daSAndrew Geissler
53ba111abfSLei YU${MIRROR}
54ba111abfSLei YU
5551b6aec6SLei YUARG DEBIAN_FRONTEND=noninteractive
560205e8daSAndrew Geissler
570205e8daSAndrew GeisslerRUN apt-get update && apt-get install -yy \
580205e8daSAndrew Geissler    debianutils \
590205e8daSAndrew Geissler    gawk \
600205e8daSAndrew Geissler    git \
6186ae1358SNan Zhou    python2 \
6286ae1358SNan Zhou    python2-dev \
630205e8daSAndrew Geissler    python-setuptools \
64362ca85cSSaqib Khan    python3 \
65362ca85cSSaqib Khan    python3-dev \
66362ca85cSSaqib Khan    python3-setuptools \
670205e8daSAndrew Geissler    socat \
680205e8daSAndrew Geissler    texinfo \
690205e8daSAndrew Geissler    wget \
700205e8daSAndrew Geissler    gcc \
710205e8daSAndrew Geissler    libffi-dev \
720205e8daSAndrew Geissler    libssl-dev \
730205e8daSAndrew Geissler    xterm \
740205e8daSAndrew Geissler    mwm \
750205e8daSAndrew Geissler    ssh \
760205e8daSAndrew Geissler    vim \
770205e8daSAndrew Geissler    iputils-ping \
780205e8daSAndrew Geissler    sudo \
790205e8daSAndrew Geissler    cpio \
800205e8daSAndrew Geissler    unzip \
810205e8daSAndrew Geissler    diffstat \
820205e8daSAndrew Geissler    expect \
836b9bb1e9SRahul Maheshwari    curl \
847a88f29eSAndrew Geissler    build-essential \
853eafe347SRahul Maheshwari    libdbus-glib-1-2 \
867a88f29eSAndrew Geissler    libpixman-1-0 \
87f1e8376dSMichael Walsh    libglib2.0-0 \
886ba6814fSAndrew Jeffery    sshpass \
896ba6814fSAndrew Jeffery    libasound2 \
906ba6814fSAndrew Jeffery    libfdt1 \
917285ddb3SRahul Maheshwari    libpcre3 \
92851eaff9SAndrew Geissler    libslirp-dev \
93b76c0b65SGeorge Keishing    openssl \
94b76c0b65SGeorge Keishing    libxml2-dev \
9526dd8e14SGeorge Keishing    libxslt-dev \
96cd1b0ac6SAndrew Geissler    python3-pip \
9739b62803SAnusha Dathatri    ipmitool \
986ddfc299SAndrew Geissler    xvfb \
996ddfc299SAndrew Geissler    rustc
10039b62803SAnusha Dathatri
10139b62803SAnusha DathatriRUN apt-get update -qqy \
10239b62803SAnusha Dathatri  && apt-get -qqy --no-install-recommends install firefox \
103744b3bb9SRahul Maheshwari  && wget --no-verbose -O /tmp/firefox.tar.bz2 https://download-installer.cdn.mozilla.net/pub/firefox/releases/112.0.2/linux-x86_64/en-US/firefox-112.0.2.tar.bz2 \
10439b62803SAnusha Dathatri  && apt-get -y purge firefox \
10539b62803SAnusha Dathatri  && tar -C /opt -xjf /tmp/firefox.tar.bz2 \
106744b3bb9SRahul Maheshwari  && mv /opt/firefox /opt/firefox-112.0.2 \
107744b3bb9SRahul Maheshwari  && ln -fs /opt/firefox-112.0.2/firefox /usr/bin/firefox
1080205e8daSAndrew Geissler
10951b6aec6SLei YUENV HOME ${HOME}
11051b6aec6SLei YU
11151b6aec6SLei YU${PIP_MIRROR_CMD}
11251b6aec6SLei YU
113cd1b0ac6SAndrew GeisslerRUN pip3 install \
1140205e8daSAndrew Geissler    tox \
115cd1b0ac6SAndrew Geissler    requests \
116a4d6d3d2SMichael Shepos    retrying \
11704881eb6SMatthew Barth    websocket-client \
1188594e43cSAlanny Lopez    json2yaml \
11902c7920aSGeorge Keishing    robotframework==7.2.2 \
12009dcd89bSGeorge Keishing    robotframework-requests \
12109dcd89bSGeorge Keishing    robotframework-jsonlibrary \
1220205e8daSAndrew Geissler    robotframework-sshlibrary \
12355d0d752SSunil M    robotframework-scplibrary \
1240e5dd8a1SGeorge Keishing    pysnmp \
1258b36256fSJian Zhang    redfish>=3.1.7 \
12626dd8e14SGeorge Keishing    beautifulsoup4 --upgrade \
127882254f8SGeorge Keishing    lxml \
128428553dbSGeorge Keishing    jsonschema \
129ae29c891SGeorge Keishing    redfishtool \
13039b62803SAnusha Dathatri    redfish_utilities \
13139b62803SAnusha Dathatri    robotframework-httplibrary \
132744b3bb9SRahul Maheshwari    robotframework-seleniumlibrary==6.0.0 \
133744b3bb9SRahul Maheshwari    robotframework-xvfb==1.2.2 \
13439b62803SAnusha Dathatri    robotframework-angularjs \
13539b62803SAnusha Dathatri    scp \
136744b3bb9SRahul Maheshwari    selenium==4.8.2 \
13739b62803SAnusha Dathatri    urllib3 \
138092ec34bSGeorge Keishing    click \
139*147139aeSGeorge Keishing    xvfbwrapper==0.2.9 \
140*147139aeSGeorge Keishing    aenum==3.1.15 \
141*147139aeSGeorge Keishing    colorama==0.4.6 \
142*147139aeSGeorge Keishing    pyasn1==0.6.1 \
143*147139aeSGeorge Keishing    pyasn1_modules==0.4.1 \
144*147139aeSGeorge Keishing    sseclient-py==1.8.0
14539b62803SAnusha Dathatri
146744b3bb9SRahul MaheshwariRUN wget https://github.com/mozilla/geckodriver/releases/download/v0.32.2/geckodriver-v0.32.2-linux64.tar.gz \
14739b62803SAnusha Dathatri        && tar xvzf geckodriver-*.tar.gz \
14839b62803SAnusha Dathatri        && mv geckodriver /usr/local/bin \
14939b62803SAnusha Dathatri        && chmod a+x /usr/local/bin/geckodriver
1500205e8daSAndrew Geissler
151384d741bSPatrick WilliamsRUN grep -q ${GROUPS[0]} /etc/group || groupadd -g ${GROUPS[0]} ${USER}
152c2796fe8SNan ZhouRUN grep -q ${UID} /etc/passwd || useradd -d ${HOME} -l -m -u ${UID} -g ${GROUPS[0]} \
1530205e8daSAndrew Geissler                    ${USER}
1540205e8daSAndrew GeisslerUSER ${USER}
1550205e8daSAndrew GeisslerRUN /bin/bash
1560205e8daSAndrew GeisslerEOF
1570205e8daSAndrew Geissler)
1580205e8daSAndrew Geissler
1590205e8daSAndrew Geissler################################# docker img # #################################
1600205e8daSAndrew Geissler
161d374874dSLei YUPROXY_ARGS=""
162d374874dSLei YUif [[ -n "${http_proxy}" ]]; then
163d374874dSLei YU    PROXY_ARGS="--build-arg http_proxy=${http_proxy} --build-arg https_proxy=${http_proxy}"
164d374874dSLei YUfi
165d374874dSLei YU
1660205e8daSAndrew Geissler# Build above image
167384d741bSPatrick Williams# shellcheck disable=SC2086 # PROXY_ARGS is intentionally word-split.
168384d741bSPatrick Williamsdocker build ${PROXY_ARGS} -t "${DOCKER_IMG_NAME}" - <<< "${Dockerfile}"
169