Adding a default docker registry mirror (#689)

* Adding a default docker registry mirror

This change allows the controller to start with a specified default
docker registry mirror and avoid having to specify it in all the runner*
objects.

The change is backward compatible, if a runner has a docker registry
mirror specified, it will supersede the default one.
This commit is contained in:
Sebastien Le Digabel 2021-07-14 22:20:08 +01:00 committed by GitHub
parent b27b6ea2a8
commit 7f2795b5d6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 46 additions and 27 deletions

View File

@ -22,6 +22,7 @@ _Default values are the defaults set in the charts values.yaml, some properties
| `authSecret.github_app_installation_id` | The ID of your GitHub App installation. **This can't be set at the same time as `authSecret.github_token`** | | | `authSecret.github_app_installation_id` | The ID of your GitHub App installation. **This can't be set at the same time as `authSecret.github_token`** | |
| `authSecret.github_app_private_key` | The multiline string of your GitHub App's private key. **This can't be set at the same time as `authSecret.github_token`** | | | `authSecret.github_app_private_key` | The multiline string of your GitHub App's private key. **This can't be set at the same time as `authSecret.github_token`** | |
| `authSecret.github_token` | Your chosen GitHub PAT token. **This can't be set at the same time as the `authSecret.github_app_*`** | | | `authSecret.github_token` | Your chosen GitHub PAT token. **This can't be set at the same time as the `authSecret.github_app_*`** | |
| `dockerRegistryMirror` | The default Docker Registry Mirror used by runners. |
| `image.repository` | The "repository/image" of the controller container | summerwind/actions-runner-controller | | `image.repository` | The "repository/image" of the controller container | summerwind/actions-runner-controller |
| `image.tag` | The tag of the controller container | | | `image.tag` | The tag of the controller container | |
| `image.actionsRunnerRepositoryAndTag` | The "repository/image" of the actions runner container | summerwind/actions-runner:latest | | `image.actionsRunnerRepositoryAndTag` | The "repository/image" of the actions runner container | summerwind/actions-runner:latest |

View File

@ -41,6 +41,9 @@ spec:
- "--sync-period={{ .Values.syncPeriod }}" - "--sync-period={{ .Values.syncPeriod }}"
- "--docker-image={{ .Values.image.dindSidecarRepositoryAndTag }}" - "--docker-image={{ .Values.image.dindSidecarRepositoryAndTag }}"
- "--runner-image={{ .Values.image.actionsRunnerRepositoryAndTag }}" - "--runner-image={{ .Values.image.actionsRunnerRepositoryAndTag }}"
{{- if .Values.dockerRegistryMirror }}
- "--docker-registry-mirror={{ .Values.dockerRegistryMirror }}"
{{- end }}
{{- if .Values.scope.singleNamespace }} {{- if .Values.scope.singleNamespace }}
- "--watch-namespace={{ default .Release.Namespace .Values.scope.watchNamespace }}" - "--watch-namespace={{ default .Release.Namespace .Values.scope.watchNamespace }}"
{{- end }} {{- end }}

View File

@ -28,6 +28,7 @@ authSecret:
### GitHub PAT Configuration ### GitHub PAT Configuration
#github_token: "" #github_token: ""
dockerRegistryMirror: ""
image: image:
repository: "summerwind/actions-runner-controller" repository: "summerwind/actions-runner-controller"
actionsRunnerRepositoryAndTag: "summerwind/actions-runner:latest" actionsRunnerRepositoryAndTag: "summerwind/actions-runner:latest"

View File

@ -66,6 +66,7 @@ type RunnerReconciler struct {
GitHubClient *github.Client GitHubClient *github.Client
RunnerImage string RunnerImage string
DockerImage string DockerImage string
DockerRegistryMirror string
Name string Name string
RegistrationRecheckInterval time.Duration RegistrationRecheckInterval time.Duration
RegistrationRecheckJitter time.Duration RegistrationRecheckJitter time.Duration
@ -634,7 +635,7 @@ func (r *RunnerReconciler) newPod(runner v1alpha1.Runner) (corev1.Pod, error) {
registrationOnly := metav1.HasAnnotation(runner.ObjectMeta, annotationKeyRegistrationOnly) registrationOnly := metav1.HasAnnotation(runner.ObjectMeta, annotationKeyRegistrationOnly)
pod, err := newRunnerPod(template, runner.Spec.RunnerConfig, r.RunnerImage, r.DockerImage, r.GitHubClient.GithubBaseURL, registrationOnly) pod, err := newRunnerPod(template, runner.Spec.RunnerConfig, r.RunnerImage, r.DockerImage, r.DockerRegistryMirror, r.GitHubClient.GithubBaseURL, registrationOnly)
if err != nil { if err != nil {
return pod, err return pod, err
} }
@ -728,7 +729,7 @@ func mutatePod(pod *corev1.Pod, token string) *corev1.Pod {
return updated return updated
} }
func newRunnerPod(template corev1.Pod, runnerSpec v1alpha1.RunnerConfig, defaultRunnerImage, defaultDockerImage, githubBaseURL string, registrationOnly bool) (corev1.Pod, error) { func newRunnerPod(template corev1.Pod, runnerSpec v1alpha1.RunnerConfig, defaultRunnerImage, defaultDockerImage, defaultDockerRegistryMirror string, githubBaseURL string, registrationOnly bool) (corev1.Pod, error) {
var ( var (
privileged bool = true privileged bool = true
dockerdInRunner bool = runnerSpec.DockerdWithinRunnerContainer != nil && *runnerSpec.DockerdWithinRunnerContainer dockerdInRunner bool = runnerSpec.DockerdWithinRunnerContainer != nil && *runnerSpec.DockerdWithinRunnerContainer
@ -747,6 +748,13 @@ func newRunnerPod(template corev1.Pod, runnerSpec v1alpha1.RunnerConfig, default
workDir = "/runner/_work" workDir = "/runner/_work"
} }
var dockerRegistryMirror string
if runnerSpec.DockerRegistryMirror == nil {
dockerRegistryMirror = defaultDockerRegistryMirror
} else {
dockerRegistryMirror = *runnerSpec.DockerRegistryMirror
}
env := []corev1.EnvVar{ env := []corev1.EnvVar{
{ {
Name: EnvVarOrg, Name: EnvVarOrg,
@ -863,11 +871,11 @@ func newRunnerPod(template corev1.Pod, runnerSpec v1alpha1.RunnerConfig, default
}...) }...)
} }
if mirror := runnerSpec.DockerRegistryMirror; mirror != nil && dockerdInRunner { if dockerRegistryMirror != "" && dockerdInRunner {
runnerContainer.Env = append(runnerContainer.Env, []corev1.EnvVar{ runnerContainer.Env = append(runnerContainer.Env, []corev1.EnvVar{
{ {
Name: "DOCKER_REGISTRY_MIRROR", Name: "DOCKER_REGISTRY_MIRROR",
Value: *runnerSpec.DockerRegistryMirror, Value: dockerRegistryMirror,
}, },
}...) }...)
} }
@ -994,9 +1002,9 @@ func newRunnerPod(template corev1.Pod, runnerSpec v1alpha1.RunnerConfig, default
) )
} }
if mirror := runnerSpec.DockerRegistryMirror; mirror != nil { if dockerRegistryMirror != "" {
dockerdContainer.Args = append(dockerdContainer.Args, dockerdContainer.Args = append(dockerdContainer.Args,
fmt.Sprintf("--registry-mirror=%s", *runnerSpec.DockerRegistryMirror), fmt.Sprintf("--registry-mirror=%s", dockerRegistryMirror),
) )
} }
} }

View File

@ -51,9 +51,11 @@ type RunnerSetReconciler struct {
Recorder record.EventRecorder Recorder record.EventRecorder
Scheme *runtime.Scheme Scheme *runtime.Scheme
CommonRunnerLabels []string CommonRunnerLabels []string
GitHubBaseURL string GitHubBaseURL string
RunnerImage, DockerImage string RunnerImage string
DockerImage string
DockerRegistryMirror string
} }
// +kubebuilder:rbac:groups=actions.summerwind.dev,resources=runnersets,verbs=get;list;watch;create;update;patch;delete // +kubebuilder:rbac:groups=actions.summerwind.dev,resources=runnersets,verbs=get;list;watch;create;update;patch;delete
@ -257,7 +259,7 @@ func (r *RunnerSetReconciler) newStatefulSet(runnerSet *v1alpha1.RunnerSet) (*ap
Spec: runnerSetWithOverrides.StatefulSetSpec.Template.Spec, Spec: runnerSetWithOverrides.StatefulSetSpec.Template.Spec,
} }
pod, err := newRunnerPod(template, runnerSet.Spec.RunnerConfig, r.RunnerImage, r.DockerImage, r.GitHubBaseURL, false) pod, err := newRunnerPod(template, runnerSet.Spec.RunnerConfig, r.RunnerImage, r.DockerImage, r.DockerRegistryMirror, r.GitHubBaseURL, false)
if err != nil { if err != nil {
return nil, err return nil, err
} }

38
main.go
View File

@ -69,10 +69,11 @@ func main() {
gitHubAPICacheDuration time.Duration gitHubAPICacheDuration time.Duration
runnerImage string runnerImage string
dockerImage string dockerImage string
namespace string dockerRegistryMirror string
logLevel string namespace string
logLevel string
commonRunnerLabels commaSeparatedStringSlice commonRunnerLabels commaSeparatedStringSlice
) )
@ -88,6 +89,7 @@ func main() {
"Enable leader election for controller manager. Enabling this will ensure there is only one active controller manager.") "Enable leader election for controller manager. Enabling this will ensure there is only one active controller manager.")
flag.StringVar(&runnerImage, "runner-image", defaultRunnerImage, "The image name of self-hosted runner container.") flag.StringVar(&runnerImage, "runner-image", defaultRunnerImage, "The image name of self-hosted runner container.")
flag.StringVar(&dockerImage, "docker-image", defaultDockerImage, "The image name of docker sidecar container.") flag.StringVar(&dockerImage, "docker-image", defaultDockerImage, "The image name of docker sidecar container.")
flag.StringVar(&dockerRegistryMirror, "docker-registry-mirror", "", "The default Docker Registry Mirror used by runners.")
flag.StringVar(&c.Token, "github-token", c.Token, "The personal access token of GitHub.") flag.StringVar(&c.Token, "github-token", c.Token, "The personal access token of GitHub.")
flag.Int64Var(&c.AppID, "github-app-id", c.AppID, "The application ID of GitHub App.") flag.Int64Var(&c.AppID, "github-app-id", c.AppID, "The application ID of GitHub App.")
flag.Int64Var(&c.AppInstallationID, "github-app-installation-id", c.AppInstallationID, "The installation ID of GitHub App.") flag.Int64Var(&c.AppInstallationID, "github-app-installation-id", c.AppInstallationID, "The installation ID of GitHub App.")
@ -138,12 +140,13 @@ func main() {
} }
runnerReconciler := &controllers.RunnerReconciler{ runnerReconciler := &controllers.RunnerReconciler{
Client: mgr.GetClient(), Client: mgr.GetClient(),
Log: log.WithName("runner"), Log: log.WithName("runner"),
Scheme: mgr.GetScheme(), Scheme: mgr.GetScheme(),
GitHubClient: ghClient, GitHubClient: ghClient,
RunnerImage: runnerImage, RunnerImage: runnerImage,
DockerImage: dockerImage, DockerImage: dockerImage,
DockerRegistryMirror: dockerRegistryMirror,
} }
if err = runnerReconciler.SetupWithManager(mgr); err != nil { if err = runnerReconciler.SetupWithManager(mgr); err != nil {
@ -176,13 +179,14 @@ func main() {
} }
runnerSetReconciler := &controllers.RunnerSetReconciler{ runnerSetReconciler := &controllers.RunnerSetReconciler{
Client: mgr.GetClient(), Client: mgr.GetClient(),
Log: log.WithName("runnerset"), Log: log.WithName("runnerset"),
Scheme: mgr.GetScheme(), Scheme: mgr.GetScheme(),
CommonRunnerLabels: commonRunnerLabels, CommonRunnerLabels: commonRunnerLabels,
RunnerImage: runnerImage, RunnerImage: runnerImage,
DockerImage: dockerImage, DockerImage: dockerImage,
GitHubBaseURL: ghClient.GithubBaseURL, DockerRegistryMirror: dockerRegistryMirror,
GitHubBaseURL: ghClient.GithubBaseURL,
} }
if err = runnerSetReconciler.SetupWithManager(mgr); err != nil { if err = runnerSetReconciler.SetupWithManager(mgr); err != nil {