Runners with custom ConfigMap & SCC fail chown after Operator v1.37.0 upgrade on OpenShift 4.16.27
Description:
Environment:
- OpenShift 4.16.27 cluster
- GitLab Runner Operator v1.37.0 (upgraded on May 16, 2025)
- Runner custom service account:
gitlab-runner-app-sa-chroot
(based on anyuid scc)
Configuration Before Update to v1.37.0:
- Custom ConfigMap & SCC used to add Linux capabilities for integration with Prisma Twistlock to scan built container images:
CAP_SYS_CHROOT
CAP_MKNOD
- Custom SCC (based on anyuid) granting allowedCapabilities:
CAP_SYS_CHROOT
CAP_MKNOD
- Runners created before May 16, 2025 built concurrent runner pods successfully using the above ConfigMap, SCC, and service account.
What Changed:
- After upgrading the GitLab Runner Operator to v1.37.0, any runner using a custom ConfigMap began failing at startup with:
chown: changing ownership of '/builds/.gitlab-build-uid-gid': Operation not permitted
Additional Observation:
- The Runner Manager Deployment/Pod is configured to use
serviceAccountName: gitlab-runner-app-sa-chroot
(orgitlab-runner-app-sa
by default), but its spawned concurrent runner builder pods showserviceAccountName: default
in their spec. - Despite this, the builder pods actually execute under the
gitlab-runner-app-sa-chroot
permissions. - To explicitly bind the correct SA on the builder side, the ConfigMap’s config.toml must include:
[runners.kubernetes]
service_account = "gitlab-runner-app-sa-chroot"
Impact:
- Only runners that rely on the custom ConfigMap, custom SCC and custom service accounts are affected.
- Builds now error out during container startup due to the forbidden chown operation, blocking those specific CI runners.
Temporary Workaround:
Adding the following configs to the custom ConfigMap restores functionality:
[runners.kubernetes]
cap_add = ["CAP_SYS_CHROOT", "CAP_MKNOD"]
service_account_overwrite_allowed = ".*"
privileged = false
service_account = "gitlab-runner-app-sa-chroot"
[runners.kubernetes.build_container_security_context]
run_as_user = 0
run_as_group = 0
[runners.kubernetes.helper_container_security_context]
run_as_user = 0
run_as_group = 0
Requested Action:
- Investigate why v1.37.0 no longer honors the original
CAP_SYS_CHROOT
andCAP_MKNOD
settings without run_as_user and group to 0. - Propose an alternative workaround that does not require forcing the runner to run as root (UID/GID 0) or binding a specific service account in the TOML. For example:
- Use a
PodSecurityContext
with an appropriatefsGroup
to allow the container process to write owned files without needing extra capabilities - Introduce an init container that performs any necessary
chown
operations under elevated permissions before the main build container starts
- Use a
Please let me know if you need additional logs, SCC definitions, or other environment details.