# Windows 10 Virtual Machine, R environment, as GitLab Runner If you want to develop, tests and check your R packages, build R packages binaries under/for Windows automatically, this is the right place. > __Create a VirtualBox under windows 10 with R (Version >= 4.0.0) and Rtools + some dependencies. And register it as a GitLab Runner.__ [[_TOC_]] ## The Idea ![Project pipeline windows R](images/GitLab_Runner_pipeline_R.png) __The main purpose of this project is to automate the creation of a R environment under Windows to use it as a GitLab Runner in CI/CD pipelines.__ Here is the steps : 1. __Get__ a VirtualBox Machine from [VagrantCloud](https://app.vagrantup.com/) (a box) under windows 10, generated by [Packer](https://www.packer.io/). More information [here](https://forgemia.inra.fr/gaev/packer/windows10). 2. __Initializing__ and configuring the VM using [Vagrant](https://www.vagrantup.com/). See [VagrantFile](VagrantFile) template. 3. __Provisioning__ and configuring the VM using [Ansible](https://ww.ansible.com). See [ansible\_provisioning/playbook.yml](ansible\_provisioning/playbook.yml) and scripts in [ansible\_provisioning/files/](ansible\_provisioning/files/) : - Update Windows - Install R (>= 4.0.0) - Install Rtools (>= Rtools40) - Configure msys2 environment (Rtools dependencies) - Install sshd (under msys2) - Install some R packages and system dependencies - Install GitLab-Runner for artifacts (lastest version) - Install MiKTex (lastest version) - Install Pandoc (2.10.1) 4. __Generating__ a new Vagrant box 5. __Registering__ this new VM as a GitLab Runner (snapshot version) ## Dependencies A bare metal or a Virtual Machine with nested Virtualization on the hypervisor activated as a server with dependencies installed. (Tested under Linux OS) ### System * [VirtualBox](https://www.virtualbox.org/) (>=6.1.14) and extension Pack * [Vagrant](https://www.vagrantup.com/) (>=2.2.10) * [Ansible](https://www.ansible.com/) (>=2.2.1.0) * [pywinrm](https://github.com/diyan/pywinrm) (>=0.3.0) compatible with Ansible Python version * [GitLab-Runner](https://docs.gitlab.com/runner/install/) (>= 10.0.0) ### GitLab Runner Use GitLab-Runner to register a _shell_ runner. _gitlab-runner_ user have to get access to _vboxmanage_, _vagrant_ and _ansible_. To register the VirtualBox Runner created here, called _WIN10R4_. ```bash gitlab-runner register \ --non-interactive \ --name win10R4 --url \ --registration-token \ --executor "virtualbox" \ --tag-list windows,R4 \ --ssh-user vagrant \ --ssh-password vagrant \ --virtualbox-base-name "WIN10R4" \ --virtualbox-disable-snapshots = false \ --virtualbox-base-snapshot = "bootR4" ``` To use this Runner, add in your .gitlab-ci.yml jobs: ``` tags: - windows - R4 ``` ## Principle Every things happen in the [.gitlab-ci.xml](.gitlab-ci.xml) file. Mainly the [VagrantFile](VagrantFile) set up a virtual machine from __Vagrant Cloud__ [GAEV/win10](https://app.vagrantup.com/GAEV/boxes/win10) box (a windows10 professional evaluation version with vbBoxGuestAditions). Files in [ansible\_provisioning/](ansible_provisioning/) are playbooks for __Ansible__ that will install/configure R, Rtools, packages, MiKTeX, Pandoc and GitLab-Runner. After the Virtual Machine creation and configuration, it registered as a new __gitlab-runner__ (by replacing the existing virtualbox machine "WIN10R4"). Bonus : The VM (box) is save/backup in a __OpenStack Object Store__ [Swift](https://wiki.openstack.org/wiki/Swift). ## Locally To set up the VM (called windows10R4) locally (on your computer), you just need to run : ```bash vagrant up vagrant snapshot bootR4 vagrant halt ``` ## Customization * To add R packages : edit file [ansible\_provisioning/files/install-r-packages.sh](ansible\_provisioning/files/install-r-packages.sh) and add systems libraries and R packages to install. * Make artifacts work on your GitLab instance : edit file [ansible\_provisioning/files/install-gitlab-runner.sh](ansible\_provisioning/files/install-gitlab-runner.sh) and change the gitlab URL and IP. * Custom VirtualBox : edit file [VagrantFile](VagrantFile) and modify parameters in virtualbox provider.