Skip to main content
Version: main 🚧

GitHub actions on pull requests

Limited vCluster Tenancy Configuration Support

This feature is only available for the following:

Running the control plane as a container and the following worker node types:

GitHub Actions can be created for the following workflows:

Deploy virtual clusters on pull requests​

Virtual clusters provide isolated Kubernetes environments for each pull request, enabling:

  • Parallel testing without resource conflicts between PRs
  • Clean environments that don't accumulate state from previous test runs
  • Fast creation and deletion compared to provisioning full clusters
  • Cost efficiency by sharing underlying infrastructure while maintaining isolation

Deploy with host nodes​

When using host nodes, virtual cluster workloads run on the existing host cluster nodes. This is the simplest setup for CI/CD pipelines.

This example shows how to create and delete a virtual cluster for testing an application named the-app on pull requests.

# .github/workflows/vclusters.yaml
name: Pull Request Checks
on:
pull_request:
branches:
- "main"
jobs:
e2e:
runs-on: ubuntu-latest
steps:
- name: Install vCluster CLI
uses: loft-sh/setup-vcluster@main
- name: Login to vCluster Platform instance
env:
LOFT_URL: ${{ secrets.LOFT_URL }}
ACCESS_KEY: ${{ secrets.ACCESS_KEY }}
run: vcluster platform login $LOFT_URL --access-key $ACCESS_KEY
- name: Create PR Virtual Cluster
env:
NAME: repo-${{ github.event.repository.name }}-pr-${{ github.event.pull_request.number }}
run: vcluster create $NAME --project default
- name: Deploy Application
run: kubectl apply -Rf ./kubernetes
- name: Wait for Deployment
run: kubectl rollout status deployments/the-app
- name: Run Tests
run: make e2e
- name: Delete PR Virtual Cluster
env:
NAME: repo-${{ github.event.repository.name }}-pr-${{ github.event.pull_request.number }}
run: vcluster delete $NAME --project default

Explanation:

  1. The Setup vCluster action is used to install the vCluster CLI.
  2. The vcluster platform login command is used to log in to the organization's platform instance. Environment variables LOFT_URL and ACCESS_KEY are populated using GitHub secrets. See Access Keys for help generating a platform access key.
  3. The vcluster create command is used to create a unique virtual cluster using information about the pull request in the default project. This automatically configures the kube context for the next steps.
  4. The next step deploys the application using the runner provided kubectl and manifests located under ./kubernetes.
  5. Before running tests, use kubectl to wait for the the-app deployment to become ready.
  6. Now, run the end-to-end tests. The example uses make to run tests, but the command should be customized for your testing framework.
  7. Finally, the vcluster delete command is used to delete the virtual cluster.

Deploy with private nodes​

Enterprise-Only Feature

This feature is an Enterprise feature. See our pricing plans or contact our sales team for more information.

When using private nodes, virtual clusters have dedicated worker nodes that are separate from the host cluster. For CI/CD workflows, combine private nodes with auto-nodes so that worker nodes are automatically provisioned when the virtual cluster is created and cleaned up when deleted.

Prerequisites​

Before using private nodes in your GitHub Actions workflow:

  1. vCluster Platform must be installed and running
  2. A node provider must be configured in vCluster Platform
  3. A virtual cluster template with private nodes and auto-nodes enabled must be created

Create a template with private nodes​

In vCluster Platform, create a virtual cluster template with private nodes configuration:

Private nodes template configuration
# Enable private nodes with auto-provisioning
privateNodes:
enabled: true
autoNodes:
# Reference the node provider configured in vCluster Platform
- provider: my-node-provider
dynamic:
- name: ci-node-pool
# Limit the number of nodes for CI workloads
limits:
nodes: "3"

# Control plane configuration
controlPlane:
distro:
k8s:
image:
tag: v1.31.2
service:
spec:
# LoadBalancer required for private nodes connectivity
type: LoadBalancer

# Network configuration required for private nodes
networking:
podCIDR: 10.64.0.0/16
serviceCIDR: 10.128.0.0/16

Configure GitHub Actions workflow​

This example creates a virtual cluster with private nodes using a Platform template:

# .github/workflows/vclusters-private-nodes.yaml
name: Pull Request Checks (Private Nodes)
on:
pull_request:
branches:
- "main"
jobs:
e2e:
runs-on: ubuntu-latest
steps:
- name: Install vCluster CLI
uses: loft-sh/setup-vcluster@main
- name: Login to vCluster Platform instance
env:
LOFT_URL: ${{ secrets.LOFT_URL }}
ACCESS_KEY: ${{ secrets.ACCESS_KEY }}
run: vcluster platform login $LOFT_URL --access-key $ACCESS_KEY
- name: Create PR Virtual Cluster with Private Nodes
env:
NAME: repo-${{ github.event.repository.name }}-pr-${{ github.event.pull_request.number }}
# Use --template to reference the private nodes template
run: vcluster create $NAME --project default --template private-nodes-ci
- name: Wait for nodes to be ready
# Auto-nodes provisions worker nodes; wait for them to join
run: |
echo "Waiting for private nodes to join the cluster..."
kubectl wait --for=condition=Ready nodes --all --timeout=300s
- name: Deploy Application
run: kubectl apply -Rf ./kubernetes
- name: Wait for Deployment
run: kubectl rollout status deployments/the-app
- name: Run Tests
run: make e2e
- name: Delete PR Virtual Cluster
env:
NAME: repo-${{ github.event.repository.name }}-pr-${{ github.event.pull_request.number }}
# Deleting the vCluster also cleans up the auto-provisioned nodes
run: vcluster delete $NAME --project default

Explanation:

  1. The Setup vCluster action installs the vCluster CLI.
  2. The vcluster platform login command authenticates to vCluster Platform using GitHub secrets.
  3. The vcluster create command with --template private-nodes-ci creates a virtual cluster using the private nodes template. This triggers auto-nodes to provision dedicated worker nodes.
  4. Wait for the auto-provisioned nodes to join and become ready before deploying applications.
  5. Deploy and test the application on the dedicated private nodes.
  6. The vcluster delete command removes the virtual cluster and auto-nodes automatically cleans up the provisioned worker nodes.
Node provisioning time

Auto-nodes provisioning typically takes 1-3 minutes depending on your cloud provider. Factor this into your CI/CD pipeline timeouts.

DevSpace for running tests on pull requests​

This example shows how use the Setup DevSpace GitHub Action to install the DevSpace CLI and DevSpace commands to run tests.

# .github/workflows/vclusters.yaml
name: Pull Request Checks
on:
pull_request:
branches:
- "main"
jobs:
e2e:
runs-on: ubuntu-latest
steps:
- name: Install DevSpace CLI
uses: loft-sh/setup-devspace@main
- name: Install vCluster CLI
uses: loft-sh/setup-vcluster@main
- name: Login to platform instance
env:
LOFT_URL: ${{ secrets.LOFT_URL }}
ACCESS_KEY: ${{ secrets.ACCESS_KEY }}
run: vcluster platform login $LOFT_URL --access-key $ACCESS_KEY
- name: Create PR Virtual Cluster
env:
NAME: repo-${{ github.event.repository.name }}-pr-${{ github.event.pull_request.number }}
run: vcluster create $NAME --project default
- name: Run Tests
run: devspace run e2e

Explanation:

  1. The Setup DevSpace action installs the DevSpace CLI.
  2. The Setup vCluster action is used to install the vCluster CLI.
  3. The vcluster platform login command is used to log in to the organization's platform instance. Environment variables LOFT_URL and ACCESS_KEY are populated using GitHub secrets.
  4. The vcluster create command is used to create a unique virtual cluster using information about the pull request in the default project. This automatically configures the kube context for the next steps.
  5. Finally, use devspace run e2e to perform the needed steps to deploy and test my-app.