0
Fork 0
mirror of https://github.com/verdaccio/verdaccio.git synced 2024-12-16 21:56:25 -05:00

feat: environment variables support in configuration file (#2199)

* feat:Environment variables support in configuration file

* add changeset

* remove fixes typo

Co-authored-by: amit <amit@enso.security>
This commit is contained in:
amit 2021-04-25 12:08:14 +04:00 committed by GitHub
parent 04931c968e
commit 1810ed0d81
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
10 changed files with 62 additions and 26 deletions

View file

@ -0,0 +1,11 @@
---
'@verdaccio/config': patch
---
Feature
- add option to set storage from environment variable VERDACCIO_STORAGE_PATH
#### Related tickets
https://github.com/verdaccio/verdaccio/issues/1681

View file

@ -44,3 +44,7 @@ The default header to identify the protocol is `X-Forwarded-Proto`, but there ar
``` ```
$ VERDACCIO_FORWARDED_PROTO=CloudFront-Forwarded-Proto verdaccio --listen 5000 $ VERDACCIO_FORWARDED_PROTO=CloudFront-Forwarded-Proto verdaccio --listen 5000
``` ```
#### VERDACCIO_STORAGE_PATH
By default, the storage is taken from config file, but using this variable allows to set it from environment variable.

View file

@ -50,7 +50,7 @@ class Config implements AppConfig {
public constructor(config: ConfigRuntime) { public constructor(config: ConfigRuntime) {
const self = this; const self = this;
this.storage = config.storage; this.storage = process.env.VERDACCIO_STORAGE_PATH || config.storage;
this.config_path = config.config_path; this.config_path = config.config_path;
this.plugins = config.plugins; this.plugins = config.plugins;
this.security = _.merge(defaultSecurity, config.security); this.security = _.merge(defaultSecurity, config.security);

View file

@ -1,14 +1,7 @@
import path from 'path';
import { parseConfigFile } from '../src'; import { parseConfigFile } from '../src';
import { parseConfigurationFile } from './utils';
describe('Package access utilities', () => { describe('Package access utilities', () => {
const parseConfigurationFile = (conf) => {
const { name, ext } = path.parse(conf);
const format = ext.startsWith('.') ? ext.substring(1) : 'yaml';
return path.join(__dirname, `./partials/config/${format}/${name}.${format}`);
};
describe('JSON format', () => { describe('JSON format', () => {
test('parse default.json', () => { test('parse default.json', () => {
const config = parseConfigFile(parseConfigurationFile('default.json')); const config = parseConfigFile(parseConfigurationFile('default.json'));

View file

@ -10,6 +10,7 @@ import {
ROLES, ROLES,
WEB_TITLE, WEB_TITLE,
} from '../src'; } from '../src';
import { parseConfigurationFile } from './utils';
const resolveConf = (conf) => { const resolveConf = (conf) => {
const { name, ext } = path.parse(conf); const { name, ext } = path.parse(conf);
@ -80,6 +81,32 @@ describe('check basic content parsed file', () => {
checkDefaultConfPackages(config); checkDefaultConfPackages(config);
}); });
test('should set storage to value set in VERDACCIO_STORAGE_PATH environment variable', () => {
const storageLocation = '/tmp/verdaccio';
process.env.VERDACCIO_STORAGE_PATH = storageLocation;
const config = new Config(parseConfigFile(resolveConf('default')));
expect(config.storage).toBe(storageLocation);
delete process.env.VERDACCIO_STORAGE_PATH;
});
test('should set storage path to VERDACCIO_STORAGE_PATH if both config and env are set', () => {
const storageLocation = '/tmp/verdaccio';
process.env.VERDACCIO_STORAGE_PATH = storageLocation;
const config = new Config(parseConfigFile(parseConfigurationFile('storage')));
expect(config.storage).toBe(storageLocation);
delete process.env.VERDACCIO_STORAGE_PATH;
});
test('should take storage from environment variable if not exists in configs', () => {
const storageLocation = '/tmp/verdaccio';
process.env.VERDACCIO_STORAGE_PATH = storageLocation;
const defaultConfig = parseConfigFile(resolveConf('default'));
delete defaultConfig.storage;
const config = new Config(defaultConfig);
expect(config.storage).toBe(storageLocation);
delete process.env.VERDACCIO_STORAGE_PATH;
});
test('parse docker.yaml', () => { test('parse docker.yaml', () => {
const config = new Config(parseConfigFile(resolveConf('docker'))); const config = new Config(parseConfigFile(resolveConf('docker')));
checkDefaultUplink(config); checkDefaultUplink(config);

View file

@ -1,4 +1,3 @@
import path from 'path';
import _ from 'lodash'; import _ from 'lodash';
import { import {
@ -7,15 +6,9 @@ import {
PACKAGE_ACCESS, PACKAGE_ACCESS,
} from '../src/package-access'; } from '../src/package-access';
import { parseConfigFile } from '../src'; import { parseConfigFile } from '../src';
import { parseConfigurationFile } from './utils';
describe('Package access utilities', () => { describe('Package access utilities', () => {
const parseConfigurationFile = (conf) => {
const { name, ext } = path.parse(conf);
const format = ext.startsWith('.') ? ext.substring(1) : 'yaml';
return path.join(__dirname, `./partials/config/${format}/${name}.${format}`);
};
describe('normalisePackageAccess', () => { describe('normalisePackageAccess', () => {
test('should test basic conversion', () => { test('should test basic conversion', () => {
const { packages } = parseConfigFile(parseConfigurationFile('pkgs-basic')); const { packages } = parseConfigFile(parseConfigurationFile('pkgs-basic'));

View file

@ -0,0 +1,7 @@
---
storage: './storage_default_storage'
logs:
- type: stdout
format: pretty
level: warn

View file

@ -1,16 +1,8 @@
import path from 'path';
import { hasProxyTo, sanityCheckUplinksProps, uplinkSanityCheck } from '../src/uplinks'; import { hasProxyTo, sanityCheckUplinksProps, uplinkSanityCheck } from '../src/uplinks';
import { normalisePackageAccess, parseConfigFile } from '../src'; import { normalisePackageAccess, parseConfigFile } from '../src';
import { parseConfigurationFile } from './utils';
describe('Uplinks Utilities', () => { describe('Uplinks Utilities', () => {
const parseConfigurationFile = (conf) => {
const { name, ext } = path.parse(conf);
const format = ext.startsWith('.') ? ext.substring(1) : 'yaml';
return path.join(__dirname, `./partials/config/${format}/${name}.${format}`);
};
describe('uplinkSanityCheck', () => { describe('uplinkSanityCheck', () => {
test('should test basic conversion', () => { test('should test basic conversion', () => {
const uplinks = uplinkSanityCheck( const uplinks = uplinkSanityCheck(

View file

@ -0,0 +1 @@
export { parseConfigurationFile } from './parse-configuration-file';

View file

@ -0,0 +1,8 @@
import path from 'path';
export const parseConfigurationFile = (conf: string) => {
const { name, ext } = path.parse(conf);
const format = ext.startsWith('.') ? ext.substring(1) : 'yaml';
return path.join(__dirname, `../partials/config/${format}/${name}.${format}`);
};