Skip to content

Commit 29e9caa

Browse files
zvecrskullydazed
authored andcommitted
Configure Vagrant to use qmk_base_container (qmk#6194)
* Initial conversion of vagrant to use qmkfm/base_container * Fix vagrant when using docker provider * Workaround for VirtualBox VM restarts * Generalise Vagrant docs slightly and add FAQ
1 parent a32f7e1 commit 29e9caa

File tree

4 files changed

+107
-15
lines changed

4 files changed

+107
-15
lines changed

Vagrantfile

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -52,26 +52,37 @@ Vagrant.configure(2) do |config|
5252
end
5353

5454
# Docker provider pulls from hub.docker.com respecting docker.image if
55-
# config.vm.box is nil. Note that this bind-mounts from the current dir to
55+
# config.vm.box is nil. In this case, we adhoc build util/vagrant/Dockerfile.
56+
# Note that this bind-mounts from the current dir to
5657
# /vagrant in the guest, so unless your UID is 1000 to match vagrant in the
5758
# image, you'll need to: chmod -R a+rw .
5859
config.vm.provider "docker" do |docker, override|
5960
override.vm.box = nil
60-
docker.image = "jesselang/debian-vagrant:stretch"
61+
docker.build_dir = "util/vagrant"
6162
docker.has_ssh = true
6263
end
6364

64-
# This script ensures the required packages for AVR programming are installed
65-
# It also ensures the system always gets the latest updates when powered on
66-
# If this causes issues you can run a 'vagrant destroy' and then
67-
# add a # before ,run: (or change "always" to "once") and run 'vagrant up' to get a working
68-
# non-updated box and then attempt to troubleshoot or open a Github issue
69-
config.vm.provision "shell", inline: "/vagrant/util/qmk_install.sh", run: "always"
65+
# Unless we are running the docker container directly
66+
# 1. run container detached on vm
67+
# 2. attach on 'vagrant ssh'
68+
["virtualbox", "vmware_workstation", "vmware_fusion"].each do |type|
69+
config.vm.provider type do |virt, override|
70+
override.vm.provision "docker" do |d|
71+
d.run "qmkfm/base_container",
72+
cmd: "tail -f /dev/null",
73+
args: "--privileged -v /dev:/dev -v '/vagrant:/vagrant'"
74+
end
75+
76+
override.vm.provision "shell", inline: <<-SHELL
77+
echo 'docker restart qmkfm-base_container && exec docker exec -it qmkfm-base_container /bin/bash -l' >> ~vagrant/.bashrc
78+
SHELL
79+
end
80+
end
7081

7182
config.vm.post_up_message = <<-EOT
7283
73-
Log into the VM using 'vagrant ssh'. QMK directory synchronized with host is
74-
located at /vagrant
84+
Log into the environment using 'vagrant ssh'. QMK directory synchronized with
85+
host is located at /vagrant
7586
To compile the .hex files use make command inside this directory, e.g.
7687
cd /vagrant
7788
make <keyboard>:default

docs/getting_started_vagrant.md

Lines changed: 41 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,20 @@
11
# Vagrant Quick Start
22

3-
This project includes a Vagrantfile that will allow you to build a new firmware for your keyboard very easily without major changes to your primary operating system. This also ensures that when you clone the project and perform a build, you have the exact same environment as anyone else using the Vagrantfile to build. This makes it much easier for people to help you troubleshoot any issues you encounter.
3+
This project includes a `Vagrantfile` that will allow you to build a new firmware for your keyboard very easily without major changes to your primary operating system. This also ensures that when you clone the project and perform a build, you have the exact same environment as anyone else using the Vagrantfile to build. This makes it much easier for people to help you troubleshoot any issues you encounter.
44

55
## Requirements
66

7-
Using the `/Vagrantfile` in this repository requires you have [Vagrant](http://www.vagrantup.com/) as well as [VirtualBox](https://www.virtualbox.org/) (or [VMware Workstation](https://www.vmware.com/products/workstation) and [Vagrant VMware plugin](http://www.vagrantup.com/vmware) but the (paid) VMware plugin requires a licensed copy of VMware Workstation/Fusion).
7+
Using the `Vagrantfile` in this repository requires you have [Vagrant](http://www.vagrantup.com/) as well as a supported provider installed:
88

9-
*COMPATIBILITY NOTICE* Certain versions of Virtualbox 5 appear to have an incompatibility with the Virtualbox extensions installed in the boxes in this Vagrantfile. If you encounter any issues with the /vagrant mount not succeeding, please upgrade your version of Virtualbox to at least 5.0.12. **Alternately, you can try running the following command:** `vagrant plugin install vagrant-vbguest`
9+
* [VirtualBox](https://www.virtualbox.org/) (Version at least 5.0.12)
10+
* Sold as 'the most accessible platform to use Vagrant'
11+
* [VMware Workstation](https://www.vmware.com/products/workstation) and [Vagrant VMware plugin](http://www.vagrantup.com/vmware)
12+
* The (paid) VMware plugin requires a licensed copy of VMware Workstation/Fusion
13+
* [Docker](https://www.docker.com/)
1014

11-
Other than having Vagrant and Virtualbox installed and possibly a restart of your computer afterwards, you can simple run a 'vagrant up' anywhere inside the folder where you checked out this project and it will start a Linux virtual machine that contains all the tools required to build this project. There is a post Vagrant startup hint that will get you off on the right foot, otherwise you can also reference the build documentation below.
15+
Other than having Vagrant, a suitable provider installed and possibly a restart of your computer afterwards, you can simple run a 'vagrant up' anywhere inside the folder where you checked out this project and it will start an environment (either a virtual machine or container) that contains all the tools required to build this project. There is a post Vagrant startup hint that will get you off on the right foot, otherwise you can also reference the build documentation below.
1216

13-
# Flashing the Firmware
17+
## Flashing the Firmware
1418

1519
The "easy" way to flash the firmware is using a tool from your host OS:
1620

@@ -19,3 +23,35 @@ The "easy" way to flash the firmware is using a tool from your host OS:
1923
* [Atmel FLIP](http://www.atmel.com/tools/flip.aspx)
2024

2125
If you want to program via the command line you can uncomment the ['modifyvm'] lines in the Vagrantfile to enable the USB passthrough into Linux and then program using the command line tools like dfu-util/dfu-programmer or you can install the Teensy CLI version.
26+
27+
## Vagrantfile Overview
28+
The development environment is configured to run the QMK Docker image, `qmkfm/base_container`. This not only ensures predictability between systems, it also mirrors the CI environment.
29+
30+
## FAQ
31+
32+
### Why am I seeing issues under Virtualbox?
33+
Certain versions of Virtualbox 5 appear to have an incompatibility with the Virtualbox extensions installed in the boxes in this Vagrantfile. If you encounter any issues with the /vagrant mount not succeeding, please upgrade your version of Virtualbox to at least 5.0.12. **Alternately, you can try running the following command:**
34+
35+
```console
36+
vagrant plugin install vagrant-vbguest
37+
```
38+
39+
### How do I remove an existing environment?
40+
Finished with your environment? From anywhere inside the folder where you checked out this project, Execute:
41+
42+
```console
43+
vagrant destory
44+
```
45+
46+
### What if I want to use Docker directly?
47+
Want to benefit from the Vagrant workflow without a virtual machine? The Vagrantfile is configured to bypass running a virtual machine, and run the container directly. Execute the following when bringing up the environment to force the use of Docker:
48+
```console
49+
vagrant up --provider=docker
50+
```
51+
52+
### How do I access the virtual machine instead of the Docker container?
53+
Execute the following to bypass the `vagrant` user booting directly to the official qmk builder image:
54+
55+
```console
56+
vagrant ssh -c 'sudo -i'
57+
```

util/vagrant/Dockerfile

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
FROM qmkfm/base_container
2+
3+
# Basic upgrades; install sudo and SSH.
4+
RUN apt-get update && apt-get install --no-install-recommends -y \
5+
sudo \
6+
openssh-server \
7+
&& rm -rf /var/lib/apt/lists/*
8+
RUN mkdir /var/run/sshd
9+
RUN sed -i 's/PermitRootLogin yes/PermitRootLogin no/' /etc/ssh/sshd_config
10+
RUN echo 'UseDNS no' >> /etc/ssh/sshd_config
11+
12+
# Remove the policy file once we're finished installing software.
13+
# This allows invoke-rc.d and friends to work as expected.
14+
RUN rm /usr/sbin/policy-rc.d
15+
16+
# Add the Vagrant user and necessary passwords.
17+
RUN groupadd vagrant
18+
RUN useradd -c "Vagrant" -g vagrant -d /home/vagrant -m -s /bin/bash vagrant
19+
RUN echo 'root:vagrant' | chpasswd
20+
RUN echo 'vagrant:vagrant' | chpasswd
21+
22+
# Allow the vagrant user to use sudo without a password.
23+
RUN echo 'vagrant ALL=(ALL) NOPASSWD: ALL' > /etc/sudoers.d/vagrant
24+
25+
# Install Vagrant's insecure public key so provisioning and 'vagrant ssh' work.
26+
RUN mkdir /home/vagrant/.ssh
27+
ADD https://raw.githubusercontent.com/mitchellh/vagrant/master/keys/vagrant.pub /home/vagrant/.ssh/authorized_keys
28+
RUN chmod 0600 /home/vagrant/.ssh/authorized_keys
29+
RUN chown -R vagrant:vagrant /home/vagrant/.ssh
30+
RUN chmod 0700 /home/vagrant/.ssh
31+
32+
EXPOSE 22
33+
CMD ["/usr/sbin/sshd", "-D"]

util/vagrant/readme.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
# QMK Vagrant Utilities
2+
3+
## Dockerfile
4+
Vagrant-friendly `qmkfm/base_container`.
5+
6+
In order for the Docker provider and `vagrant ssh` to function the container has a few extra requirements.
7+
8+
* vagrant user
9+
* ssh server
10+
* configured with expected public key
11+
* sudo
12+
* passwordless for vagrant user

0 commit comments

Comments
 (0)