<table style="border-collapse: collapse; border: none;">
  <tr style="border-collapse: collapse; border: none;">
    <td style="border-collapse: collapse; border: none;">
      <a href="http://www.openairinterface.org/">
         <img src="../../doc/images/oai_final_logo.png" alt="" border=3 height=50 width=150>
         </img>
      </a>
    </td>
    <td style="border-collapse: collapse; border: none; vertical-align: center;">
      <b><font size = "5">OAI CI Virtual-Machine-based Test Environment: build an OAI variant</font></b>
    </td>
  </tr>
</table>

**Table of Contents**

[[_TOC_]]

# 1. Introduction #

```bash
$ cd /tmp/CI-raphael
$ ls *.zip
localZip.zip
$ ./ci-scripts/oai-ci-vm-tool build --help
OAI CI VM script
   Original Author: Raphael Defosseux
   Requirements:
     -- uvtool uvtool-libvirt apt-cacher
     -- xenial image already synced
   Default:
     -- eNB with USRP

Usage:
------
    oai-ci-vm-tool build [OPTIONS]

Mandatory Options:
--------
    --job-name #### OR -jn ####
    Specify the name of the Jenkins job.

    --build-id #### OR -id ####
    Specify the build ID of the Jenkins job.

    --workspace #### OR -ws ####
    Specify the workspace.

Options:
--------
 # OpenAirInterface Build Variants
    --variant enb-usrp        OR -v1     ( build and test  )
    --variant phy-sim         OR -v3     ( build and test  )
    --variant cppcheck        OR -v4     ( build and test  )
    --variant gnb-usrp        OR -v5     ( build and test  )
    --variant nr-ue-usrp      OR -v6     ( build and test  )
    --variant enb-ethernet    OR -v7     ( build and test  )
    --variant ue-ethernet     OR -v8     ( build and test  )
 # non-OSA Build Variants
    --variant flexran-rtc     OR -v10    ( build and test non-OSA )
 # OpenAirInterface Test Variants
    --variant l1-sim          OR -v20    ( test  )
    --variant rf-sim          OR -v21    ( test  )
    --variant l2-sim          OR -v22    ( test  )
    Specify the variant to build.

    --keep-vm-alive OR -k
    Keep the VM alive after the build.

    --daemon OR -D
    Run as daemon

    --help OR -h
    Print this help message.
```

# 2. Detailed Description #

Source file concerned: `ci-scripts/buildOnVM.sh`

## 2.1. build_on_vm function ##

*  First check if the ZIP file is available and if the apt-cacher proxy configuration file is present. If not, it will stop.
*  Check if the VM instance is alive. If not, create it.
*  Once the VM is alive, retrieve the IP address with VM_IP_ADDR=`uvt-kvm ip $VM_NAME`
*  We copy the ZIP file to the VM : `scp localZip.zip ubuntu@$VM_IP_ADDR:/home/ubuntu`
*  apt-cacher proxy file: `scp etc/apt/apt.conf.d/01proxy ubuntu@$VM_IP_ADDR:/home/ubuntu`

Then we open a SSH session on the VM : `ssh ubuntu@$VM_IP_ADDR`

*  We copy the apt-cacher proxy file to its destination space: `sudo cp 01proxy /etc/apt/apt.conf.d/`
*  We create an hush login file to eliminate the ssh opening session messages.
*  We unzip the ZIP file into `/home/ubuntu/tmp/` folder
*  and we work from there.

# 3. Typical Usage #

## 3.1. Build in the foreground, check the results and destroy the VM at the end ##

```bash
$ cd /tmp/CI-raphael
$ ls *.zip
localZip.zip
$ ./ci-scripts/oai-ci-vm-tool build --workspace /tmp/CI-raphael --job-name RAN-CI-develop --build-id 47 --variant enb-usrp
############################################################
OAI CI VM script
############################################################
VM_NAME             = RAN-CI-develop-b47-enb-usrp
VM_CMD_FILE         = RAN-CI-develop-b47-enb-usrp_cmds.txt
JENKINS_WKSP        = /var/jenkins/workspace/RAN-CI-develop
ARCHIVES_LOC        = /var/jenkins/workspace/RAN-CI-develop/archives/enb_usrp
BUILD_OPTIONS       = --eNB -w USRP --mu
VM_MEMORY           = 2048 MBytes
VM_CPU              = 4
############################################################
Creating VM (RAN-CI-develop-b47-enb-usrp) on Ubuntu Cloud Image base
############################################################
Waiting for VM to be started
Warning: Permanently added '192.168.122.2' (ECDSA) to the list of known hosts.
RAN-CI-develop-b47-enb-usrp has for IP addr = 192.168.122.2
############################################################
Copying GIT repo into VM (RAN-CI-develop-b47-enb-usrp)
############################################################
Warning: Permanently added '192.168.122.2' (ECDSA) to the list of known hosts.
############################################################
Running install and build script on VM (RAN-CI-develop-b47-enb-usrp)
############################################################
Welcome to Ubuntu 16.04.6 LTS (GNU/Linux 4.4.0-145-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

  Get cloud support with Ubuntu Advantage Cloud Guest:
    http://www.ubuntu.com/business/services/cloud

0 packages can be updated.
0 updates are security updates.

New release '18.04.2 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


sudo apt-get --yes --quiet install zip subversion libboost-dev 
unzip -qq -DD ../localZip.zip
cd /home/ubuntu/tmp
source oaienv
cd cmake_targets
./build_oai -I --eNB -w USRP --mu

#  Here wait for a few minutes 8 to 12 minutes #

############################################################
Creating a tmp folder to store results and artifacts
############################################################
############################################################
Destroying VM
############################################################
# Host 192.168.122.2 found: line 19
/home/eurecom/.ssh/known_hosts updated.
Original contents retained as /home/eurecom/.ssh/known_hosts.old
############################################################
Checking build status
############################################################
STATUS seems OK
```

If you are adding the `-k` or `--keep-vm-alive` option, the VM instance will not be destroyed and you explore what happenned.

## 3.2. Build in the background ##

This is how it is done in the CI master job pipeline.

```bash
$ cd /tmp/CI-raphael
$ ls *.zip
localZip.zip
$ ./ci-scripts/oai-ci-vm-tool build --workspace /tmp/CI-raphael --job-name RAN-CI-develop --build-id 47 --variant phy-sim --daemon
12:44:24  ############################################################
12:44:24  OAI CI VM script
12:44:24  ############################################################
12:44:24  VM_NAME             = RAN-CI-develop-b47-phy-sim
12:44:24  VM_CMD_FILE         = RAN-CI-develop-b47-phy-sim_cmds.txt
12:44:24  JENKINS_WKSP        = /var/jenkins/workspace/RAN-CI-develop
12:44:24  ARCHIVES_LOC        = /var/jenkins/workspace/RAN-CI-develop/archives/phy_sim
12:44:24  BUILD_OPTIONS       = --phy_simulators
12:44:24  VM_MEMORY           = 2048 MBytes
12:44:24  VM_CPU              = 4
12:44:24  ############################################################
12:44:24  Creating VM (RAN-CI-develop-b47-phy-sim) on Ubuntu Cloud Image base
12:44:24  ############################################################
12:44:27  Waiting for VM to be started
12:46:34  Warning: Permanently added '192.168.122.220' (ECDSA) to the list of known hosts.
12:46:34  RAN-CI-develop-b47-phy-sim has for IP addr = 192.168.122.220
12:46:34  ############################################################
12:46:34  Copying GIT repo into VM (RAN-CI-develop-b47-phy-sim)
12:46:34  ############################################################
12:46:34  Warning: Permanently added '192.168.122.220' (ECDSA) to the list of known hosts.
12:46:34  ############################################################
12:46:34  Running install and build script on VM (RAN-CI-develop-b47-phy-sim)
12:46:34  ############################################################
12:46:34  Welcome to Ubuntu 16.04.6 LTS (GNU/Linux 4.4.0-145-generic x86_64)
12:46:34  
12:46:34   * Documentation:  https://help.ubuntu.com
12:46:34   * Management:     https://landscape.canonical.com
12:46:34   * Support:        https://ubuntu.com/advantage
12:46:34  
12:46:34    Get cloud support with Ubuntu Advantage Cloud Guest:
12:46:34      http://www.ubuntu.com/business/services/cloud
12:46:34  
12:46:34  0 packages can be updated.
12:46:34  0 updates are security updates.
12:46:34  
12:46:34  New release '18.04.2 LTS' available.
12:46:34  Run 'do-release-upgrade' to upgrade to it.
12:46:34  
12:46:34  
12:46:34  sudo apt-get --yes --quiet install zip daemon subversion libboost-dev 
12:46:46  unzip -qq -DD ../localZip.zip
12:46:48  source oaienv
12:46:48  sudo -E daemon --inherit --unsafe --name=build_daemon --chdir=/home/ubuntu/tmp/cmake_targets -o /home/ubuntu/tmp/cmake_targets/log/install-build.txt ./my-vm-build.sh
12:46:48  STATUS seems OK
```

So here is 2.5 minutes, a VM was created, source files copied and the build process is started in the background.

```bash
$ cd /tmp/raphael
$ ./ci-scripts/oai-ci-vm-tool wait --workspace /var/jenkins/workspace/RAN-CI-develop --variant phy-sim --job-name RAN-CI-develop --build-id 47 --keep-vm-alive
12:49:14  ############################################################
12:49:14  OAI CI VM script
12:49:14  ############################################################
12:49:14  VM_NAME             = RAN-CI-develop-b47-phy-sim
12:49:14  VM_CMD_FILE         = RAN-CI-develop-b47-phy-sim_cmds.txt
12:49:14  JENKINS_WKSP        = /var/jenkins/workspace/RAN-CI-develop
12:49:14  ARCHIVES_LOC        = /var/jenkins/workspace/RAN-CI-develop/archives/phy_sim
12:49:14  BUILD_OPTIONS       = --phy_simulators
12:49:15  Waiting for VM to be started
12:49:15  Warning: Permanently added '192.168.122.220' (ECDSA) to the list of known hosts.
12:49:16  RAN-CI-develop-b47-phy-sim has for IP addr = 192.168.122.220
12:49:16  ############################################################
12:49:16  Waiting build process to end on VM (RAN-CI-develop-b47-phy-sim)
12:49:16  ############################################################
12:49:16  ps -aux | grep build 
12:54:23  ############################################################
12:54:23  Creating a tmp folder to store results and artifacts
12:54:23  ############################################################
12:54:23  ############################################################
12:54:23  Checking build status
12:54:23  ############################################################
12:54:23  STATUS seems OK
```

Here the `--keep-vm-alive` option is used to keep the VM alive and performs some testing.

---

Next step: [how the build is checked](./vm_based_simulator_check_build.md)

You can also go back to the [CI dev main page](./ci_dev_home.md)

