Documentation
¶
Index ¶
- func ResolveToken(flagToken string, cfg *Config) (string, error)
- func ResolveURL(flagURL string, cfg *Config) (string, error)
- type Config
- type DockerImage
- type LibvirtImage
- type Provisioner
- type RunnerConfig
- type RunnerPhase
- type RunnerRequest
- type RunnerSnapshot
- type RunnerState
- type ScaleSetClient
- type Scaler
- func (s *Scaler) HandleDesiredRunnerCount(ctx context.Context, count int) (int, error)
- func (s *Scaler) HandleJobCompleted(ctx context.Context, jobInfo *scaleset.JobCompleted) error
- func (s *Scaler) HandleJobStarted(ctx context.Context, jobInfo *scaleset.JobStarted) error
- func (s *Scaler) Runners() []RunnerSnapshot
- func (s *Scaler) Shutdown(ctx context.Context)
- type TartImage
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func ResolveToken ¶
ResolveToken determines the GitHub token using the following precedence:
- flagToken (--token CLI flag)
- GITHUB_TOKEN environment variable
- $CREDENTIALS_DIRECTORY/github-token (systemd-creds)
- token_file from config
Types ¶
type Config ¶
type Config struct {
URL string `yaml:"url"`
TokenFile string `yaml:"token_file"`
Runners map[string]RunnerConfig `yaml:"runners"`
}
Config is the outrunner configuration file format.
func LoadConfig ¶
LoadConfig reads and parses a config file.
type DockerImage ¶
DockerImage configures a Docker-based runner.
type LibvirtImage ¶
type LibvirtImage struct {
Path string `yaml:"path"`
RunnerCmd string `yaml:"runner_cmd"`
Socket string `yaml:"socket"`
CPUs int `yaml:"cpus"`
MemoryMB int `yaml:"memory"`
}
LibvirtImage configures a libvirt/QEMU-based runner.
type Provisioner ¶
type Provisioner interface {
// Start provisions a new runner environment and starts the GitHub Actions
// runner process inside it. The runner should use the JIT config to
// register itself with GitHub and pick up the assigned job.
//
// Start must return after the runner process has been launched.
// It does not need to wait for the job to complete.
Start(ctx context.Context, req *RunnerRequest) error
// Stop tears down the runner environment. Called after the job completes
// or if the runner needs to be forcefully removed.
Stop(ctx context.Context, name string) error
// Close releases any resources held by the provisioner (e.g., Docker client).
Close() error
}
Provisioner creates and destroys ephemeral runner environments. Each implementation handles a different backend (Docker, libvirt, etc.).
type RunnerConfig ¶
type RunnerConfig struct {
Labels []string `yaml:"labels"`
MaxRunners int `yaml:"max_runners,omitempty"`
Docker *DockerImage `yaml:"docker,omitempty"`
Libvirt *LibvirtImage `yaml:"libvirt,omitempty"`
Tart *TartImage `yaml:"tart,omitempty"`
}
RunnerConfig defines a runner environment and the scale set it registers. The map key in Config.Runners is used as the scale set name. Exactly one of Docker, Libvirt, or Tart must be set.
func (*RunnerConfig) ProviderType ¶
func (r *RunnerConfig) ProviderType() string
ProviderType returns which provisioner backend this runner uses.
type RunnerPhase ¶
type RunnerPhase int
RunnerPhase represents the current lifecycle phase of a runner.
const ( RunnerProvisioning RunnerPhase = iota RunnerIdle RunnerRunning RunnerStopping )
func (RunnerPhase) String ¶
func (p RunnerPhase) String() string
type RunnerRequest ¶
type RunnerRequest struct {
// Name is a unique identifier for this runner instance.
Name string
// JITConfig is the base64-encoded JIT configuration from GitHub.
// Pass to: ./run.sh --jitconfig <JITConfig>
JITConfig string
// Runner is the matched runner configuration.
Runner *RunnerConfig
}
RunnerRequest contains everything a provisioner needs to start a runner.
type RunnerSnapshot ¶
type RunnerSnapshot struct {
Name string
RunnerID int
Phase RunnerPhase
CreatedAt time.Time
StartedAt time.Time
}
RunnerSnapshot is a point-in-time copy of a runner's state, safe to read without holding the scaler's mutex.
type RunnerState ¶
type RunnerState struct {
Name string
RunnerID int // from GenerateJitRunnerConfig().Runner.ID
Phase RunnerPhase
CreatedAt time.Time
StartedAt time.Time // when Start() completed (provisioning finished)
// contains filtered or unexported fields
}
RunnerState holds the full state of a single runner instance.
func (*RunnerState) SignalDone ¶
func (r *RunnerState) SignalDone()
SignalDone closes the done channel, signaling the runner goroutine to stop. Safe to call multiple times.
type ScaleSetClient ¶
type ScaleSetClient interface {
GenerateJitRunnerConfig(ctx context.Context, setting *scaleset.RunnerScaleSetJitRunnerSetting, scaleSetID int) (*scaleset.RunnerScaleSetJitRunnerConfig, error)
RemoveRunner(ctx context.Context, runnerID int64) error
}
ScaleSetClient is the subset of scaleset.Client that Scaler uses. Extracted as an interface for testability.
type Scaler ¶
type Scaler struct {
// contains filtered or unexported fields
}
Scaler implements listener.Scaler by provisioning real runner environments. Each runner gets its own goroutine that manages the full lifecycle: provisioning, waiting for job completion, stopping, and deregistration.
func NewScaler ¶
func NewScaler(logger *slog.Logger, client ScaleSetClient, scaleSetID, maxRunners int, namePrefix string, runner *RunnerConfig, prov Provisioner) *Scaler
func (*Scaler) HandleDesiredRunnerCount ¶
func (*Scaler) HandleJobCompleted ¶
func (*Scaler) HandleJobStarted ¶
func (*Scaler) Runners ¶
func (s *Scaler) Runners() []RunnerSnapshot
Runners returns a snapshot of current runner states.
