Skip to content

Configuration

Overview

The plugin configuration has two layers:

  1. cloud-level label mappings
  2. per-host agent configurations

Both must be wired correctly before Jenkins can provision a macOS VM.

Add a Jeballto Cloud

In Jenkins:

Manage Jenkins -> Clouds -> New Cloud -> Jeballto Cloud

Agent configuration fields

Field Description Default
Name Unique host identifier used in VM names required
Jeballto URL REST API endpoint for the host required
API Token Secret text credential for the API bearer token used by Jeballto required for provisioning and Test Credentials
SSH Credentials Jenkins SSH credentials for the VM guest required
CPU Count vCPUs per VM, 0 means host default 0
Memory (GB) Memory per VM, 0 means host default 0
Disk (GB) Disk per VM, 0 means host default 0
Max Instances Concurrent VM cap on this host 2
Remote FS Jenkins working directory inside the VM /Users/admin
SSH Host Override Override target host for SSH when Jenkins and guest networking differ auto-detect

Use Test Connection and Test Credentials before saving.

The VM image must include a Java runtime compatible with the Jenkins controller. See the Jenkins Java support policy: https://www.jenkins.io/doc/book/platform-information/support-policy-java/

Label assignment fields

Field Description
Label Single Jenkins label atom, such as xcode26
OCI Image Image reference used when that label is requested
Lifetime Seconds Max VM lifetime in seconds, 0 means no limit
Priority Higher value wins when multiple global label mappings match the same requested label

Lifetime Seconds is passed to Jeballto as lifetimeSeconds. Positive values must be between 1 and 604800 seconds.

Use lifetime as a CI/CD safety guard. Set it slightly higher than the Jenkins job timeout because the VM still needs time to boot, connect as a Jenkins agent, and start the build after creation. Image pull happens before VM creation, so it does not need to be included in this buffer. For example, if builds can run for 60 minutes, use a VM lifetime such as 3900 or 4200 seconds.

One host, one label

Agent Configuration: mac-mini-01
  assigned labels: xcode26
  max instances: 2

Label Assignment:
  label: xcode26
  image: ghcr.io/org/macos-ci:xcode-26
  lifetime seconds: 7200
  priority: 10

Two hosts, same label

Use this when you want failover:

Label Assignment:
  label: ci-macos
  image: registry.local/ci:latest
  priority: 10

Agent Configurations:
  mac-mini-01 assigned to ci-macos
  mac-mini-02 assigned to ci-macos

The plugin will try those hosts in the order they appear in the cloud configuration, skipping any host that is in cooldown or already at maxInstances.

Networking note

If Jenkins runs from a network namespace that cannot reach the Jeballto URL host directly, set SSH Host Override to a reachable IP or hostname. This is one of the most common first-time issues.