semaphoreui/semaphore · error

k8s executor is only available in the proprietary build

Error message

k8s executor is only available in the proprietary build

What it means

In the open-source build of Semaphore, the Kubernetes executor stub always returns this error. The real K8s executor implementation is proprietary-only, so any attempt to create a Kubernetes executor provider from the OSS binary fails unconditionally.

Solutions

  1. Change the runner's executor-type config to 'local', the only executor supported in the open-source build
  2. Deploy the proprietary Semaphore build that ships the real Kubernetes executor
  3. Confirm the running binary is actually the proprietary build if you believe you have a license

Example fix

# before (config.yml)
executor-type: kubernetes
# after (open-source build)
executor-type: local
Defensive patterns

Strategy: validation

Validate before calling

if resolveExecutorType(executorCfg) == util.ExecutorTypeKubernetes {
    return errors.New("k8s executor requires the proprietary Semaphore build")
}

Type guard

func isOSSBuild() bool { return buildFlavor == "oss" }
if isOSSBuild() && resolveExecutorType(cfg) == util.ExecutorTypeKubernetes { /* skip/reject */ }

Prevention

When it happens

Trigger: Calling pro/services/tasks/k8s.NewProvider (via newExecutorProvider in services/runners/executor_factory.go) when resolveExecutorType(executorCfg) resolves to util.ExecutorTypeKubernetes — i.e. runner config selects the kubernetes executor on the OSS build.

Common situations: Running self-hosted open-source Semaphore in a Kubernetes cluster with `executor-type: kubernetes` set, expecting in-cluster job execution that is actually gated behind the enterprise build.

Related errors


AI-assisted analysis of semaphoreui/semaphore@1774ccb71a (2026-09-07). Data as JSON: /api/errors/31e7107d0eded53a. Report an issue: GitHub.

Appendix: source

Thrown at pro/services/tasks/k8s/config.go:22

// in via the top-level go.mod replace directive (or a workspace), the same import
// path resolves to a fully functional provider that runs each task in an ephemeral
// Pod. In the open-source build this stub keeps the executor_factory and job_pool
// imports compiling while making it explicit that the "k8s" runner executor type
// requires the proprietary build.
//
// The only entry point is NewProvider; it always fails so JobPool refuses to start
// and the operator sees a clear message in the logs.
package k8s

import (
	"errors"

	"github.com/semaphoreui/semaphore/services/tasks"
	"github.com/semaphoreui/semaphore/util"
)

func NewProvider(_ util.RunnerK8sConfig) (tasks.ExecutorProvider, error) {
	return nil, errors.New("k8s executor is only available in the proprietary build")
}

View on GitHub (pinned to 1774ccb71a)