diff options
author | Joel Challis <git@zvecr.com> | 2019-07-16 09:20:34 +0100 |
---|---|---|
committer | skullydazed <skullydazed@users.noreply.github.com> | 2019-07-16 01:20:34 -0700 |
commit | 29e9caa82bdfe898dd7fca82fcecf0cae2374859 (patch) | |
tree | ad65f691513580f926465959b5a1169365c77959 | |
parent | a32f7e1a25a8a200d838aa8256ffe39708fbd723 (diff) | |
download | qmk_firmware-29e9caa82bdfe898dd7fca82fcecf0cae2374859.tar.gz qmk_firmware-29e9caa82bdfe898dd7fca82fcecf0cae2374859.zip |
Configure Vagrant to use qmk_base_container (#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
-rw-r--r-- | Vagrantfile | 31 | ||||
-rw-r--r-- | docs/getting_started_vagrant.md | 46 | ||||
-rw-r--r-- | util/vagrant/Dockerfile | 33 | ||||
-rw-r--r-- | util/vagrant/readme.md | 12 |
4 files changed, 107 insertions, 15 deletions
diff --git a/Vagrantfile b/Vagrantfile index 552711d63..dae4e0d53 100644 --- a/Vagrantfile +++ b/Vagrantfile | |||
@@ -52,26 +52,37 @@ Vagrant.configure(2) do |config| | |||
52 | end | 52 | end |
53 | 53 | ||
54 | # Docker provider pulls from hub.docker.com respecting docker.image if | 54 | # 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 | ||
56 | # /vagrant in the guest, so unless your UID is 1000 to match vagrant in the | 57 | # /vagrant in the guest, so unless your UID is 1000 to match vagrant in the |
57 | # image, you'll need to: chmod -R a+rw . | 58 | # image, you'll need to: chmod -R a+rw . |
58 | config.vm.provider "docker" do |docker, override| | 59 | config.vm.provider "docker" do |docker, override| |
59 | override.vm.box = nil | 60 | override.vm.box = nil |
60 | docker.image = "jesselang/debian-vagrant:stretch" | 61 | docker.build_dir = "util/vagrant" |
61 | docker.has_ssh = true | 62 | docker.has_ssh = true |
62 | end | 63 | end |
63 | 64 | ||
64 | # This script ensures the required packages for AVR programming are installed | 65 | # Unless we are running the docker container directly |
65 | # It also ensures the system always gets the latest updates when powered on | 66 | # 1. run container detached on vm |
66 | # If this causes issues you can run a 'vagrant destroy' and then | 67 | # 2. attach on 'vagrant ssh' |
67 | # add a # before ,run: (or change "always" to "once") and run 'vagrant up' to get a working | 68 | ["virtualbox", "vmware_workstation", "vmware_fusion"].each do |type| |
68 | # non-updated box and then attempt to troubleshoot or open a Github issue | 69 | config.vm.provider type do |virt, override| |
69 | config.vm.provision "shell", inline: "/vagrant/util/qmk_install.sh", run: "always" | 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 | ||
70 | 81 | ||
71 | config.vm.post_up_message = <<-EOT | 82 | config.vm.post_up_message = <<-EOT |
72 | 83 | ||
73 | Log into the VM using 'vagrant ssh'. QMK directory synchronized with host is | 84 | Log into the environment using 'vagrant ssh'. QMK directory synchronized with |
74 | located at /vagrant | 85 | host is located at /vagrant |
75 | To compile the .hex files use make command inside this directory, e.g. | 86 | To compile the .hex files use make command inside this directory, e.g. |
76 | cd /vagrant | 87 | cd /vagrant |
77 | make <keyboard>:default | 88 | make <keyboard>:default |
diff --git a/docs/getting_started_vagrant.md b/docs/getting_started_vagrant.md index 848a43a1f..b62524271 100644 --- a/docs/getting_started_vagrant.md +++ b/docs/getting_started_vagrant.md | |||
@@ -1,16 +1,20 @@ | |||
1 | # Vagrant Quick Start | 1 | # Vagrant Quick Start |
2 | 2 | ||
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. |
4 | 4 | ||
5 | ## Requirements | 5 | ## Requirements |
6 | 6 | ||
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: |
8 | 8 | ||
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/) | ||
10 | 14 | ||
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. |
12 | 16 | ||
13 | # Flashing the Firmware | 17 | ## Flashing the Firmware |
14 | 18 | ||
15 | The "easy" way to flash the firmware is using a tool from your host OS: | 19 | The "easy" way to flash the firmware is using a tool from your host OS: |
16 | 20 | ||
@@ -19,3 +23,35 @@ The "easy" way to flash the firmware is using a tool from your host OS: | |||
19 | * [Atmel FLIP](http://www.atmel.com/tools/flip.aspx) | 23 | * [Atmel FLIP](http://www.atmel.com/tools/flip.aspx) |
20 | 24 | ||
21 | 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. | 25 | 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 | ``` \ No newline at end of file | ||
diff --git a/util/vagrant/Dockerfile b/util/vagrant/Dockerfile new file mode 100644 index 000000000..1936ee023 --- /dev/null +++ b/util/vagrant/Dockerfile | |||
@@ -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"] | ||
diff --git a/util/vagrant/readme.md b/util/vagrant/readme.md new file mode 100644 index 000000000..e4b870a64 --- /dev/null +++ b/util/vagrant/readme.md | |||
@@ -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 | ||