Refactor handling of feature flags

This commit centralizes how feature flags are handled. All feature flags
must now add an entry in the `featureFlagConfig` dictionary. This
dictionary associates the flag with an environment variable name and
optionally a minimum version for CodeQL.

The new logic is:

- if the environment variable is set to false: disabled
- if the minimum version requirement specified and met: disabled
- if the environment variable is set to true: enable
- Otherwise check feature flag enablement from the server
This commit is contained in:
Andrew Eisenberg 2022-10-05 15:54:07 -07:00
parent 24c8de16fa
commit e5c3375225
27 changed files with 400 additions and 368 deletions

27
lib/util.js generated
View file

@ -424,12 +424,6 @@ var EnvVar;
* own sandwiched workflow mechanism
*/
EnvVar["FEATURE_SANDWICH"] = "CODEQL_ACTION_FEATURE_SANDWICH";
/**
* If set to the "true" string and the codeql CLI version is greater than
* `CODEQL_VERSION_CONFIG_FILES`, then the codeql-action will pass the
* the codeql-config file to the codeql CLI to be processed there.
*/
EnvVar["CODEQL_PASS_CONFIG_TO_CLI"] = "CODEQL_PASS_CONFIG_TO_CLI";
})(EnvVar = exports.EnvVar || (exports.EnvVar = {}));
const exportVar = (mode, name, value) => {
if (mode === Mode.actions) {
@ -491,9 +485,6 @@ function getRequiredEnvParam(paramName) {
return value;
}
exports.getRequiredEnvParam = getRequiredEnvParam;
function getOptionalEnvParam(paramName) {
return process.env[paramName] || "";
}
class HTTPError extends Error {
constructor(message, status) {
super(message);
@ -663,20 +654,7 @@ exports.isInTestMode = isInTestMode;
* that gets passed to the CLI.
*/
async function useCodeScanningConfigInCli(codeql, featureFlags) {
const envVarIsEnabled = getOptionalEnvParam(EnvVar.CODEQL_PASS_CONFIG_TO_CLI);
// If the user has explicitly turned off the feature, then don't use it.
if (envVarIsEnabled.toLocaleLowerCase() === "false") {
return false;
}
// If the user has explicitly turned on the feature, then use it.
// Or if the feature flag is enabled, then use it.
const isEnabled = envVarIsEnabled.toLocaleLowerCase() === "true" ||
(await featureFlags.getValue(feature_flags_1.FeatureFlag.CliConfigFileEnabled));
if (!isEnabled) {
return false;
}
// If the CLI version is too old, then don't use it.
return await codeQlVersionAbove(codeql, codeql_1.CODEQL_VERSION_CONFIG_FILES);
return await featureFlags.getValue(feature_flags_1.FeatureFlag.CliConfigFileEnabled, codeql);
}
exports.useCodeScanningConfigInCli = useCodeScanningConfigInCli;
async function logCodeScanningConfigInCli(codeql, featureFlags, logger) {
@ -722,8 +700,7 @@ function listFolder(dir) {
}
exports.listFolder = listFolder;
async function isGoExtractionReconciliationEnabled(featureFlags) {
return (process.env["CODEQL_ACTION_RECONCILE_GO_EXTRACTION"] === "true" ||
(await featureFlags.getValue(feature_flags_1.FeatureFlag.GolangExtractionReconciliationEnabled)));
return await featureFlags.getValue(feature_flags_1.FeatureFlag.GolangExtractionReconciliationEnabled);
}
exports.isGoExtractionReconciliationEnabled = isGoExtractionReconciliationEnabled;
/**