mirror of
https://github.com/actions-runner-controller/actions-runner-controller.git
synced 2026-09-30 15:06:29 +02:00
An EphemeralRunner that exits as Outdated marks its EphemeralRunnerSet
Outdated, and the AutoscalingRunnerSet then stops scaling it. Without a way
to tell which runner spec an Outdated report refers to, a report from a
runner built before the spec was updated keeps the set switched off after
the update that was supposed to fix it.
Stamp each runner with the actionable revision it was built from, and judge
Outdated reports against the revision the set has applied:
- A runner whose revision is older than the applied one is reporting on a
spec that has already been replaced. It is deleted and rebuilt from the
current spec, and it does not hold the set Outdated.
- A runner whose revision is current is reporting on the live spec, so the
set stays Outdated. It is deliberately not delete-and-replaced: a fresh
runner at the same revision would report Outdated again, forever.
Runners without the annotation parse to revision 0, which matches the zero
value of Status.AppliedActionableRevision, so existing runners keep their
current behaviour across an upgrade.
The phase is derived inside patchAppliedActionableRevisionStatus, from a
list read through the same authoritative reader as the set itself, because
the optimistic lock on that patch covers the EphemeralRunnerSet object only
and cannot vouch for a separately-read list. The runners are classified
against the live applied revision rather than the revision this call was
asked to apply: the caller reads the spec from the cache while this function
re-reads the status from the API server, so a lagging reconcile can arrive
with a target behind the live marker, and judging against it would flip a
set that has already moved on back to Outdated.
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
99 lines
4.3 KiB
Go
99 lines
4.3 KiB
Go
package actionsgithubcom
|
|
|
|
import (
|
|
"github.com/actions/actions-runner-controller/logging"
|
|
)
|
|
|
|
const (
|
|
LabelKeyRunnerTemplateHash = "runner-template-hash"
|
|
LabelKeyPodTemplateHash = "pod-template-hash"
|
|
)
|
|
|
|
const (
|
|
EnvVarRunnerJITConfig = "ACTIONS_RUNNER_INPUT_JITCONFIG"
|
|
EnvVarRunnerExtraUserAgent = "GITHUB_ACTIONS_RUNNER_EXTRA_USER_AGENT"
|
|
// Environment variable setting the exit code to return when the runner version is deprecated.
|
|
// This is used by the runner to signal to the controller that it should switch off the scaleset.
|
|
EnvVarRunnerDeprecatedExitCode = "ACTIONS_RUNNER_RETURN_VERSION_DEPRECATED_EXIT_CODE"
|
|
)
|
|
|
|
// Environment variable names used to set proxy variables for containers
|
|
const (
|
|
EnvVarHTTPProxy = "http_proxy"
|
|
EnvVarHTTPSProxy = "https_proxy"
|
|
EnvVarNoProxy = "no_proxy"
|
|
)
|
|
|
|
// Labels applied to resources
|
|
const (
|
|
// Kubernetes labels
|
|
LabelKeyKubernetesPartOf = "app.kubernetes.io/part-of"
|
|
LabelKeyKubernetesComponent = "app.kubernetes.io/component"
|
|
LabelKeyKubernetesVersion = "app.kubernetes.io/version"
|
|
|
|
// Well-known Kubernetes node labels
|
|
LabelKeyKubernetesOS = "kubernetes.io/os"
|
|
|
|
// Github labels
|
|
LabelKeyGitHubScaleSetName = "actions.github.com/scale-set-name"
|
|
LabelKeyGitHubScaleSetNamespace = "actions.github.com/scale-set-namespace"
|
|
LabelKeyGitHubEnterprise = "actions.github.com/enterprise"
|
|
LabelKeyGitHubOrganization = "actions.github.com/organization"
|
|
LabelKeyGitHubRepository = "actions.github.com/repository"
|
|
)
|
|
|
|
// AutoscalingRunnerSetCleanupFinalizerName is a finalizer used to protect resources
|
|
// from deletion while AutoscalingRunnerSet is running
|
|
const AutoscalingRunnerSetCleanupFinalizerName = "actions.github.com/cleanup-protection"
|
|
|
|
const (
|
|
AnnotationKeyGitHubRunnerGroupName = "actions.github.com/runner-group-name"
|
|
AnnotationKeyGitHubRunnerScaleSetName = "actions.github.com/runner-scale-set-name"
|
|
AnnotationKeyPatchID = "actions.github.com/patch-id"
|
|
// AnnotationKeyActionableRevision records the EphemeralRunnerSet
|
|
// Spec.ActionableRevision that was in effect when the runner was created. It
|
|
// lets the set tell apart a runner that reported Outdated against the current
|
|
// runner spec from one that reported it against a spec that has since been
|
|
// updated.
|
|
AnnotationKeyActionableRevision = "actions.github.com/actionable-revision"
|
|
// AnnotationKeyListenerConfigResourceVersion records the resource version of
|
|
// the listener config secret the listener pod was created from. The pod
|
|
// mounts that secret and parses it once at startup, so a change to its
|
|
// contents only takes effect after a restart. Nothing about the change is
|
|
// visible in the pod spec, which references the secret by name, so the
|
|
// resource version is carried on the pod to make the drift observable.
|
|
AnnotationKeyListenerConfigResourceVersion = "actions.github.com/listener-config-resource-version"
|
|
)
|
|
|
|
// Labels applied to listener roles
|
|
const (
|
|
labelKeyListenerName = "auto-scaling-listener-name"
|
|
labelKeyListenerNamespace = "auto-scaling-listener-namespace"
|
|
)
|
|
|
|
// Annotations applied for later cleanup of resources
|
|
const (
|
|
AnnotationKeyManagerRoleBindingName = "actions.github.com/cleanup-manager-role-binding"
|
|
AnnotationKeyManagerRoleName = "actions.github.com/cleanup-manager-role-name"
|
|
AnnotationKeyKubernetesModeRoleName = "actions.github.com/cleanup-kubernetes-mode-role-name"
|
|
AnnotationKeyKubernetesModeRoleBindingName = "actions.github.com/cleanup-kubernetes-mode-role-binding-name"
|
|
AnnotationKeyKubernetesModeServiceAccountName = "actions.github.com/cleanup-kubernetes-mode-service-account-name"
|
|
AnnotationKeyGitHubSecretName = "actions.github.com/cleanup-github-secret-name"
|
|
AnnotationKeyNoPermissionServiceAccountName = "actions.github.com/cleanup-no-permission-service-account-name"
|
|
)
|
|
|
|
// DefaultScaleSetListenerLogLevel is the default log level applied
|
|
const DefaultScaleSetListenerLogLevel = string(logging.LogLevelDebug)
|
|
|
|
// DefaultScaleSetListenerLogFormat is the default log format applied
|
|
const DefaultScaleSetListenerLogFormat = string(logging.LogFormatText)
|
|
|
|
// ownerKey is field selector matching the owner name of a particular resource
|
|
const resourceOwnerKey = ".metadata.controller"
|
|
|
|
// EphemeralRunner pod creation failure reasons
|
|
const (
|
|
ReasonTooManyPodFailures = "TooManyPodFailures"
|
|
ReasonInvalidPodFailure = "InvalidPod"
|
|
)
|