helpers/featureflags/flags.go (423 lines of code) (raw):

package featureflags import ( "strconv" "github.com/sirupsen/logrus" ) const ( NetworkPerBuild string = "FF_NETWORK_PER_BUILD" UseLegacyKubernetesExecutionStrategy string = "FF_USE_LEGACY_KUBERNETES_EXECUTION_STRATEGY" UseDirectDownload string = "FF_USE_DIRECT_DOWNLOAD" SkipNoOpBuildStages string = "FF_SKIP_NOOP_BUILD_STAGES" UseFastzip string = "FF_USE_FASTZIP" DisableUmaskForDockerExecutor string = "FF_DISABLE_UMASK_FOR_DOCKER_EXECUTOR" EnableBashExitCodeCheck string = "FF_ENABLE_BASH_EXIT_CODE_CHECK" UseWindowsLegacyProcessStrategy string = "FF_USE_WINDOWS_LEGACY_PROCESS_STRATEGY" UseNewEvalStrategy string = "FF_USE_NEW_BASH_EVAL_STRATEGY" UsePowershellPathResolver string = "FF_USE_POWERSHELL_PATH_RESOLVER" UseDynamicTraceForceSendInterval string = "FF_USE_DYNAMIC_TRACE_FORCE_SEND_INTERVAL" ScriptSections string = "FF_SCRIPT_SECTIONS" EnableJobCleanup string = "FF_ENABLE_JOB_CLEANUP" KubernetesHonorEntrypoint string = "FF_KUBERNETES_HONOR_ENTRYPOINT" PosixlyCorrectEscapes string = "FF_POSIXLY_CORRECT_ESCAPES" ResolveFullTLSChain string = "FF_RESOLVE_FULL_TLS_CHAIN" DisablePowershellStdin string = "FF_DISABLE_POWERSHELL_STDIN" UsePodActiveDeadlineSeconds string = "FF_USE_POD_ACTIVE_DEADLINE_SECONDS" UseAdvancedPodSpecConfiguration string = "FF_USE_ADVANCED_POD_SPEC_CONFIGURATION" SetPermissionsBeforeCleanup string = "FF_SET_PERMISSIONS_BEFORE_CLEANUP" EnableSecretResolvingFailsIfMissing string = "FF_SECRET_RESOLVING_FAILS_IF_MISSING" PrintPodEvents string = "FF_PRINT_POD_EVENTS" UseGitBundleURIs string = "FF_USE_GIT_BUNDLE_URIS" UseGitNativeClone string = "FF_USE_GIT_NATIVE_CLONE" UseDumbInitWithKubernetesExecutor string = "FF_USE_DUMB_INIT_WITH_KUBERNETES_EXECUTOR" UseInitWithDockerExecutor string = "FF_USE_INIT_WITH_DOCKER_EXECUTOR" LogImagesConfiguredForJob string = "FF_LOG_IMAGES_CONFIGURED_FOR_JOB" UseDockerAutoscalerDialStdio string = "FF_USE_DOCKER_AUTOSCALER_DIAL_STDIO" CleanUpFailedCacheExtract string = "FF_CLEAN_UP_FAILED_CACHE_EXTRACT" UseWindowsJobObject string = "FF_USE_WINDOWS_JOB_OBJECT" UseTimestamps string = "FF_TIMESTAMPS" DisableAutomaticTokenRotation string = "FF_DISABLE_AUTOMATIC_TOKEN_ROTATION" UseLegacyGCSCacheAdapter string = "FF_USE_LEGACY_GCS_CACHE_ADAPTER" DisableUmaskForKubernetesExecutor string = "FF_DISABLE_UMASK_FOR_KUBERNETES_EXECUTOR" UseLegacyS3CacheAdapter string = "FF_USE_LEGACY_S3_CACHE_ADAPTER" GitURLsWithoutTokens string = "FF_GIT_URLS_WITHOUT_TOKENS" WaitForPodReachable string = "FF_WAIT_FOR_POD_TO_BE_REACHABLE" UseNativeSteps string = "FF_USE_NATIVE_STEPS" MaskAllDefaultTokens string = "FF_MASK_ALL_DEFAULT_TOKENS" ExportHighCardinalityMetrics string = "FF_EXPORT_HIGH_CARDINALITY_METRICS" UseFleetingAcquireHeartbeats string = "FF_USE_FLEETING_ACQUIRE_HEARTBEATS" UseExponentialBackoffStageRetry string = "FF_USE_EXPONENTIAL_BACKOFF_STAGE_RETRY" UseAdaptiveRequestConcurrency string = "FF_USE_ADAPTIVE_REQUEST_CONCURRENCY" ) type FeatureFlag struct { Name string DefaultValue bool Deprecated bool ToBeRemovedWith string Description string } // REMEMBER to update the documentation after adding or removing a feature flag // // Please use `make update_feature_flags_docs` to make the update automatic and // properly formatted. It will replace the existing table with the new one, computed // basing on the values below var flags = []FeatureFlag{ { Name: "FF_TEST_FEATURE", DefaultValue: false, Deprecated: true, Description: "FF_TEST_FEATURE is a feature flag that is used to test the feature flag functionality in tests.", }, { Name: NetworkPerBuild, DefaultValue: false, Deprecated: false, ToBeRemovedWith: "", Description: "Enables creation of a Docker [network per build](../executors/docker.md#network-configurations) with " + "the `docker` executor", }, { Name: UseLegacyKubernetesExecutionStrategy, DefaultValue: false, Deprecated: false, ToBeRemovedWith: "", Description: "When set to `false` disables execution of remote Kubernetes commands through `exec` in " + "favor of `attach` to solve problems like " + "[#4119](https://gitlab.com/gitlab-org/gitlab-runner/-/issues/4119)", }, { Name: UseDirectDownload, DefaultValue: true, Deprecated: false, ToBeRemovedWith: "", Description: "When set to `true` Runner tries to direct-download all artifacts instead of proxying " + "through GitLab on a first try. Enabling might result in a download failures due to problem validating " + "TLS certificate of Object Storage if it is enabled by GitLab. " + "See [Self-signed certificates or custom Certification Authorities](tls-self-signed.md)", }, { Name: SkipNoOpBuildStages, DefaultValue: true, Deprecated: false, ToBeRemovedWith: "", Description: "When set to `false` all build stages are executed even if running them has no effect", }, { Name: UseFastzip, DefaultValue: false, Deprecated: false, ToBeRemovedWith: "", Description: "Fastzip is a performant archiver for cache/artifact archiving and extraction", }, { Name: DisableUmaskForDockerExecutor, DefaultValue: false, Deprecated: false, ToBeRemovedWith: "", Description: "If enabled will remove the usage of `umask 0000` call for jobs executed with `docker` " + "executor. Instead Runner will try to discover the UID and GID of the user configured for the image used " + "by the build container and will change the ownership of the working directory and files by running the " + "`chmod` command in the predefined container (after updating sources, restoring cache and " + "downloading artifacts). POSIX utility `id` must be installed and operational in the build image " + "for this feature flag. Runner will execute `id` with options `-u` and `-g` to retrieve the UID and GID.", }, { Name: EnableBashExitCodeCheck, DefaultValue: false, Deprecated: false, ToBeRemovedWith: "", Description: "If enabled, bash scripts don't rely solely on `set -e`, but check for a non-zero exit code " + "after each script command is executed.", }, { Name: UseWindowsLegacyProcessStrategy, DefaultValue: false, Deprecated: false, ToBeRemovedWith: "", Description: "In GitLab Runner 16.10 and later, the default is `false`. In GitLab Runner 16.9 and earlier, the default is `true`. " + "When disabled, processes that Runner creates on Windows (shell and custom executor) will be " + "created with additional setup that should improve process termination. When set to `true`, legacy " + "process setup is used. To successfully and gracefully drain a Windows Runner, this feature flag should " + "be set to `false`.", }, { Name: UseNewEvalStrategy, DefaultValue: false, Deprecated: false, ToBeRemovedWith: "", Description: "When set to `true`, the Bash `eval` call is executed in a subshell to help with proper exit " + "code detection of the script executed.", }, { Name: UsePowershellPathResolver, DefaultValue: false, Deprecated: false, ToBeRemovedWith: "", Description: "When enabled, PowerShell resolves pathnames rather than Runner using OS-specific filepath " + "functions that are specific to where Runner is hosted.", }, { Name: UseDynamicTraceForceSendInterval, DefaultValue: false, Deprecated: false, ToBeRemovedWith: "", Description: "When enabled, the trace force send interval for logs is dynamically adjusted based on the " + "trace update interval.", }, { Name: ScriptSections, DefaultValue: false, Deprecated: false, ToBeRemovedWith: "", Description: "When enabled, each script line from the `.gitlab-ci.yml` file is in a collapsible " + "section in the job output, and shows the duration of each line. " + "When the command spans multiple lines, the complete command is " + "displayed within the job log output terminal.", }, { Name: EnableJobCleanup, DefaultValue: false, Deprecated: false, ToBeRemovedWith: "", Description: "When enabled, the project directory will be cleaned up at the end of the build. " + "If `GIT_CLONE` is used, the whole project directory will be deleted. If `GIT_FETCH` is used, " + "a series of Git `clean` commands will be issued.", }, { Name: KubernetesHonorEntrypoint, DefaultValue: false, Deprecated: false, ToBeRemovedWith: "", Description: "When enabled, the Docker entrypoint of an image will be honored if " + "`FF_USE_LEGACY_KUBERNETES_EXECUTION_STRATEGY` is not set to true", }, { Name: PosixlyCorrectEscapes, DefaultValue: false, Deprecated: false, ToBeRemovedWith: "", Description: "When enabled, [POSIX shell escapes](https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_02) " + "are used rather than [`bash`-style ANSI-C quoting](https://www.gnu.org/software/bash/manual/html_node/Quoting.html). " + "This should be enabled if the job environment uses a POSIX-compliant shell.", }, { Name: ResolveFullTLSChain, DefaultValue: false, Deprecated: false, Description: "In GitLab Runner 16.4 and later, the default is `false`. In GitLab Runner 16.3 and earlier, the default is `true`. " + "When enabled, the runner resolves a full TLS " + "chain all the way down to a self-signed root certificate " + "for `CI_SERVER_TLS_CA_FILE`. This was previously " + "[required to make Git HTTPS clones work](tls-self-signed.md#git-cloning) " + "for a Git client built with libcurl prior to v7.68.0 and OpenSSL. " + "However, the process to resolve certificates might fail on " + "some operating systems, such as macOS, that reject root certificates " + "signed with older signature algorithms. " + "If certificate resolution fails, you might need to disable this feature. " + "This feature flag can only be disabled in the " + "[`[runners.feature_flags]` configuration](#enable-feature-flag-in-runner-configuration).", }, { Name: DisablePowershellStdin, DefaultValue: false, Deprecated: false, Description: "When enabled, PowerShell scripts for shell and custom executors are passed by " + "file, rather than passed and executed via stdin. This is required for jobs' " + "`allow_failure:exit_codes` keywords to work correctly.", }, { Name: UsePodActiveDeadlineSeconds, DefaultValue: true, Deprecated: false, ToBeRemovedWith: "", Description: "When enabled, the [pod `activeDeadlineSeconds`]" + "(https://kubernetes.io/docs/reference/kubernetes-api/workload-resources/pod-v1/#lifecycle)" + " is set to the CI/CD job timeout. This flag affects the " + "[pod's lifecycle](../executors/kubernetes/_index.md#pod-lifecycle).", }, { Name: UseAdvancedPodSpecConfiguration, DefaultValue: false, Deprecated: false, ToBeRemovedWith: "", Description: "When enabled, the user can set an entire whole pod specification in the `config.toml` file. " + "For more information, see [Overwrite generated pod specifications (Experiment)]" + "(../executors/kubernetes/_index.md#overwrite-generated-pod-specifications).", }, { Name: SetPermissionsBeforeCleanup, DefaultValue: true, Deprecated: false, Description: "When enabled, permissions on directories and files in the project directory are " + "set first, to ensure that deletions during cleanup are successful.", }, { Name: EnableSecretResolvingFailsIfMissing, DefaultValue: true, Deprecated: false, Description: "When enabled, secret resolving fails if the value cannot be found.", }, { Name: PrintPodEvents, DefaultValue: false, Deprecated: false, Description: "When enabled, all events associated with the build pod will be printed until it's started.", }, { Name: UseGitBundleURIs, DefaultValue: true, Deprecated: false, Description: "When enabled, the Git `transfer.bundleURI` configuration option is set to `true`. This FF is enabled by default. " + "Set to `false` to disable Git bundle support.", }, { Name: UseGitNativeClone, DefaultValue: false, Deprecated: false, Description: "When enabled and `GIT_STRATEGY=clone`, the `git-clone(1)` command is used instead of `git-init(1)` + `git-fetch(1)` to clone the project. " + "This requires Git version 2.49 and later, and falls back to `init` + `fetch` if not available.", }, { Name: UseDumbInitWithKubernetesExecutor, DefaultValue: false, Deprecated: false, Description: "When enabled, `dumb-init` is used to execute all the scripts. " + "This allows `dumb-init` to run as the first process in the helper and build container.", }, { Name: UseInitWithDockerExecutor, DefaultValue: false, Deprecated: false, Description: "When enabled, the Docker executor starts the service and build containers with the `--init` option, which runs `tini-init` as PID 1.", }, { Name: LogImagesConfiguredForJob, DefaultValue: false, Deprecated: false, Description: "When enabled, the runner logs names of the image and service images defined for each received job.", }, { Name: UseDockerAutoscalerDialStdio, DefaultValue: true, Deprecated: false, Description: "When enabled (the default), `docker system stdio` is used to tunnel to the remote Docker daemon. When disabled, for SSH connections " + "a native SSH tunnel is used, and for WinRM connections a 'fleeting-proxy' helper binary is first deployed.", }, { Name: CleanUpFailedCacheExtract, DefaultValue: false, Deprecated: false, Description: "When enabled, commands are inserted into build scripts to detect a failed cache extraction " + "and clean up partial cache contents left behind.", }, { Name: UseWindowsJobObject, DefaultValue: false, Deprecated: false, Description: "When enabled, a job object is created for each process that the runner creates on Windows " + "with the shell and custom executors. To force-kill the processes, the runner closes " + "the job object. This should improve the termination of difficult-to-kill processes.", }, { Name: UseTimestamps, DefaultValue: false, Deprecated: false, Description: "When enabled timestamps are added to the beginning of each log trace line.", }, { Name: DisableAutomaticTokenRotation, DefaultValue: false, Deprecated: false, Description: "When enabled, it restricts automatic token rotation and logs a warning when the token is about to expire.", }, { Name: UseLegacyGCSCacheAdapter, DefaultValue: false, Deprecated: false, Description: "When enabled, the legacy GCS Cache adapter is used. When disabled (default), a newer GCS Cache adapter is used which uses Google Cloud Storage's SDK " + "for authentication. This should resolve authentication problems in environments that the legacy adapter struggled with, such as workload identity " + "configurations in GKE.", }, { Name: DisableUmaskForKubernetesExecutor, DefaultValue: false, Deprecated: false, ToBeRemovedWith: "", Description: "When enabled, removes the `umask 0000` call for jobs executed with the Kubernetes " + "executor. Instead, the runner tries to discover the user ID (UID) and group ID (GID) of the user the build container runs as. " + "The runner also changes the ownership of the working directory and files by running the `chown` " + "command in the predefined container (after updating sources, restoring cache, and downloading artifacts).", }, { Name: UseLegacyS3CacheAdapter, DefaultValue: false, Deprecated: false, Description: "When enabled, the legacy S3 Cache adapter is used. When disabled (default), a newer S3 Cache adapter is used which uses Amazon's S3 SDK " + "for authentication. This should resolve authentication problems in environments that the legacy adapter struggled with, such as custom STS endpoints.", }, { Name: GitURLsWithoutTokens, DefaultValue: true, Deprecated: false, Description: "When enabled, GitLab Runner doesn't embed the job token anywhere during Git configuration or command " + "execution. Instead, it sets up a Git credential helper that uses the environment variable to obtain the job token. " + "This approach limits token storage and reduces the risk of token leaks.", }, { Name: WaitForPodReachable, DefaultValue: false, Deprecated: false, Description: "When enabled, the runner waits for the Pod status to be 'Running', and for the Pod to be ready with its certificates attached.", }, { Name: UseNativeSteps, DefaultValue: true, Deprecated: false, Description: "When enabled and when a job is specified using the 'run' keyword, steps are executed using " + "[Native Step Runner Integration](../executors/docker.md#native-step-runner-integration). " + "This applies only to executors that support native steps integration like Docker, Docker Autoscaler, Docker for Windows.", }, { Name: MaskAllDefaultTokens, DefaultValue: true, Deprecated: false, Description: "When enabled, GitLab Runner automatically masks all default tokens patterns.", }, { Name: ExportHighCardinalityMetrics, DefaultValue: false, Deprecated: false, Description: "When enabled, the runner exports the metrics with high cardinality. Special care should be " + "taken when enabling this feature flag to avoid ingesting large amounts of data. For more information, see [Fleet scaling](../fleet_scaling/_index.md).", }, { Name: UseFleetingAcquireHeartbeats, DefaultValue: false, Deprecated: false, Description: "When enabled, fleeting instance connectivity is checked before a job is assigned to an instance.", }, { Name: UseExponentialBackoffStageRetry, DefaultValue: true, Deprecated: false, Description: "When enabled, the retries for `GET_SOURCES_ATTEMPTS`, `ARTIFACT_DOWNLOAD_ATTEMPTS`, `RESTORE_CACHE_ATTEMPTS`, and `EXECUTOR_JOB_SECTION_ATTEMPTS` " + "use exponential backoff (5 sec - 5 min).", }, { Name: UseAdaptiveRequestConcurrency, DefaultValue: true, Deprecated: false, Description: "When enabled, the `request_concurrency` setting becomes the maximum concurrency value, and the number of concurrent requests adjusts based on the " + "rate of successful job requests.", }, } func GetAll() []FeatureFlag { return flags } func IsOn(logger logrus.FieldLogger, value string) bool { if value == "" { return false } on, err := strconv.ParseBool(value) if err != nil { logger.WithError(err). WithField("value", value). Error("Error while parsing the value of feature flag") return false } return on }