[Experimental] Add CI GitHub Actions workflow #3586
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Overview
Because of the absence of nested virtualization support on GitHub Actions, we cannot run Vagrant / Ansible / Packer tasks on the vanilla Linux runners. However, Vagrant is supported on macOS runners, which unfortunately are 10x more expensive than the Linux runners.
Furthermore, because of the ephemeral nature of GitHub Actions, we don't get any advantages of VM reuse, since they have to be provisioned from scratch every time. Thus, a Jenkins CI build which takes between 8-20 minutes, takes about an hour on GitHub Actions, because it is provisioning every VM from scratch every time, even though we are caching the Vagrant boxes and VMs.
Further Reading:
Connects #3584
Demo
Some successful runs:
Recommendation
Because of the high cost of operation and the architectural impedance of running persistence based workflows in an ephemeral environment, it would be best to consider using a custom external runner for this. That would allow us to take advantage of persisted states, keep the running costs low, and implement arbitrary workflows without the limitations faced above.
This PR should not be merged, but can be left open to serve as a reference implementation for the local runner attempt.