@@ -275,6 +275,8 @@ jobs:
275275 - TestNodeTagCommand
276276 - TestNodeRouteCommands
277277 - TestNodeBackfillIPsCommand
278+ - TestOAuthClientCommand
279+ - TestOAuthClientCommandValidation
278280 - TestPolicyCheckCommand
279281 - TestSSHTestsRejectFailingPolicy
280282 - TestPolicyCommand
@@ -401,3 +403,25 @@ jobs:
401403 test : ${{ matrix.test }}
402404 postgres_flag : " --postgres=1"
403405 database_name : " postgres"
406+ # k8s-operator: TestK8sOperator stands up a real k3s cluster (rancher/k3s) as
407+ # a privileged sibling container and installs the Tailscale Kubernetes
408+ # operator via Helm against an in-test Headscale.
409+ #
410+ # PRIVILEGED-CI REQUIREMENT: this job MUST run on a runner that permits
411+ # privileged containers with a writable cgroup-v2 hierarchy (k3s runs
412+ # containerd, manages iptables/ipvs and mounts /sys/fs/cgroup). The standard
413+ # GitHub-hosted ubuntu-24.04-arm runner used by the shared template supports
414+ # this; self-hosted or hardened runners that disallow --privileged or remount
415+ # /sys/fs/cgroup read-only will fail this test. It is kept out of the
416+ # generator-managed sqlite/postgres matrices (see
417+ # .github/workflows/gh-action-integration-generator.go) precisely because of
418+ # this special requirement.
419+ k8s-operator :
420+ needs : [build, build-tailscale-released]
421+ if : needs.build.outputs.files-changed == 'true'
422+ uses : ./.github/workflows/integration-test-template.yml
423+ secrets : inherit
424+ with :
425+ test : " TestK8sOperator"
426+ postgres_flag : " --postgres=0"
427+ database_name : " sqlite"
0 commit comments