From a54015da161d7a7a6eb03d4018ec428828b7cf50 Mon Sep 17 00:00:00 2001 From: Phil Kunz Date: Wed, 8 Mar 2017 14:50:41 +0100 Subject: [PATCH] update async functions --- ts/npmci.command.ts | 22 ++++----- ts/npmci.config.ts | 18 ++++---- ts/npmci.env.ts | 65 +++++++++++++------------- ts/npmci.install.ts | 22 +++++---- ts/npmci.prepare.ts | 103 +++++++++++++++++++----------------------- ts/npmci.publish.ts | 49 ++++++++++---------- ts/npmci.servezone.ts | 2 +- ts/npmci.ssh.ts | 56 +++++++++++------------ ts/npmci.test.ts | 57 ++++++++--------------- ts/npmci.trigger.ts | 39 ++++++++-------- 10 files changed, 197 insertions(+), 236 deletions(-) diff --git a/ts/npmci.command.ts b/ts/npmci.command.ts index 7f6ef4a..8376f2a 100644 --- a/ts/npmci.command.ts +++ b/ts/npmci.command.ts @@ -1,15 +1,13 @@ import * as plugins from './npmci.plugins' -import {bash} from './npmci.bash' +import { bash } from './npmci.bash' -export let command = () => { - let done = plugins.q.defer() - let wrappedCommand: string = '' - let argvArray = process.argv - for (let i = 3; i < argvArray.length; i++) { - wrappedCommand = wrappedCommand + argvArray[i] - if (i + 1 !== argvArray.length) { wrappedCommand = wrappedCommand + ' ' } - } - bash(wrappedCommand) - done.resolve() - return done.promise +export let command = async () => { + let wrappedCommand: string = '' + let argvArray = process.argv + for (let i = 3; i < argvArray.length; i++) { + wrappedCommand = wrappedCommand + argvArray[i] + if (i + 1 !== argvArray.length) { wrappedCommand = wrappedCommand + ' ' } + } + await bash(wrappedCommand) + return } diff --git a/ts/npmci.config.ts b/ts/npmci.config.ts index 9681198..54e2ac2 100644 --- a/ts/npmci.config.ts +++ b/ts/npmci.config.ts @@ -4,16 +4,14 @@ import * as plugins from './npmci.plugins' import * as paths from './npmci.paths' export interface INpmciOptions { - globalNpmTools: string[] + globalNpmTools: string[] } -export let getConfig = () => { - let done = q.defer() - let npmciNpmextra = new plugins.npmextra.Npmextra(paths.cwd) - let defaultConfig: INpmciOptions = { - globalNpmTools: [] - } - let npmciConfig = npmciNpmextra.dataFor('npmci', defaultConfig) - done.resolve(npmciConfig) - return done.promise +export let getConfig = async (): Promise => { + let npmciNpmextra = new plugins.npmextra.Npmextra(paths.cwd) + let defaultConfig: INpmciOptions = { + globalNpmTools: [] + } + let npmciConfig = npmciNpmextra.dataFor('npmci', defaultConfig) + return npmciConfig } diff --git a/ts/npmci.env.ts b/ts/npmci.env.ts index 9e2c75d..c21ecae 100644 --- a/ts/npmci.env.ts +++ b/ts/npmci.env.ts @@ -1,7 +1,7 @@ import * as plugins from './npmci.plugins' import * as paths from './npmci.paths' -import {GitRepo} from 'smartstring' -import {Dockerfile} from './npmci.build.docker' +import { GitRepo } from 'smartstring' +import { Dockerfile } from './npmci.build.docker' export let repo: GitRepo if (process.env.CI_BUILD_REPO) repo = new GitRepo(process.env.CI_BUILD_REPO) @@ -11,48 +11,47 @@ export let buildStage: string = process.env.CI_BUILD_STAGE // handling config between commands export let dockerRegistry: string // will be set by npmci.prepare export let setDockerRegistry = (dockerRegistryArg: string) => { - dockerRegistry = dockerRegistryArg + dockerRegistry = dockerRegistryArg } export let dockerFilesBuilt: Dockerfile[] = [] export let dockerFiles: Dockerfile[] = [] export let config = { - dockerRegistry: undefined, // this will be set later on store - dockerFilesBuilt: dockerFilesBuilt, - dockerFiles: dockerFiles, - project: undefined + dockerRegistry: undefined, // this will be set later on store + dockerFilesBuilt: dockerFilesBuilt, + dockerFiles: dockerFiles, + project: undefined } export let configStore = () => { - config.dockerRegistry = dockerRegistry - plugins.smartfile.memory.toFsSync( - JSON.stringify(config), - paths.NpmciPackageConfig - ) + config.dockerRegistry = dockerRegistry + plugins.smartfile.memory.toFsSync( + JSON.stringify(config), + paths.NpmciPackageConfig + ) } let configLoad = () => { - // internal config to transfer information in between npmci shell calls - try { - plugins.lodash.assign(config,plugins.smartfile.fs.toObjectSync(paths.NpmciPackageConfig,'json')) - } - catch (err) { - configStore() - plugins.beautylog.log('config initialized!') - } + // internal config to transfer information in between npmci shell calls + try { + plugins.lodash.assign(config, plugins.smartfile.fs.toObjectSync(paths.NpmciPackageConfig, 'json')) + } catch (err) { + configStore() + plugins.beautylog.log('config initialized!') + } - // project config - try { - if (!config.project) { - config.project = plugins.smartfile.fs.toObjectSync(paths.NpmciProjectDir,'npmci.json') - plugins.beautylog.ok('project config found!') - }; - } - catch (err) { - config.project = {} - plugins.beautylog.log('no project config found, so proceeding with default behaviour!') - } + // project config + try { + if (!config.project) { + config.project = plugins.smartfile.fs.toObjectSync(paths.NpmciProjectDir, 'npmci.json') + plugins.beautylog.ok('project config found!') + }; + } + catch (err) { + config.project = {} + plugins.beautylog.log('no project config found, so proceeding with default behaviour!') + } - config.dockerRegistry ? dockerRegistry = config.dockerRegistry : void(0) - config.dockerFilesBuilt ? dockerFilesBuilt = config.dockerFilesBuilt : void(0) + config.dockerRegistry ? dockerRegistry = config.dockerRegistry : void (0) + config.dockerFilesBuilt ? dockerFilesBuilt = config.dockerFilesBuilt : void (0) } configLoad() diff --git a/ts/npmci.install.ts b/ts/npmci.install.ts index a9a5c7e..bbc7f8d 100644 --- a/ts/npmci.install.ts +++ b/ts/npmci.install.ts @@ -2,8 +2,12 @@ import * as plugins from './npmci.plugins' import * as configModule from './npmci.config' import { bash, bashNoError } from './npmci.bash' import { nvmAvailable } from './npmci.bash' -export let install = (versionArg) => { - let done = plugins.q.defer() + +/** + * Install a specific version of node + * @param versionArg + */ +export let install = async (versionArg) => { plugins.beautylog.log(`now installing node version ${versionArg}`) let version: string if (versionArg === 'stable') { @@ -16,30 +20,28 @@ export let install = (versionArg) => { version = versionArg }; if (nvmAvailable) { - bash(`nvm install ${version} && nvm alias default ${version}`) + await bash(`nvm install ${version} && nvm alias default ${version}`) plugins.beautylog.success(`Node version ${version} successfully installed!`) } else { plugins.beautylog.warn('Nvm not in path so staying at installed node version!') }; - bash('node -v') - bash('npm -v') + await bash('node -v') + await bash('npm -v') // lets look for further config configModule.getConfig() - .then(configArg => { + .then(async configArg => { plugins.beautylog.log('Now checking for needed global npm tools...') for (let npmTool of configArg.globalNpmTools) { plugins.beautylog.info(`Checking for global "${npmTool}"`) - let whichOutput = bashNoError(`which ${npmTool}`) + let whichOutput: string = await bashNoError(`which ${npmTool}`) let toolAvailable: boolean = !((/not\sfound/.test(whichOutput)) || whichOutput === '') if (toolAvailable) { plugins.beautylog.log(`Tool ${npmTool} is available`) } else { plugins.beautylog.info(`globally installing ${npmTool} from npm`) - bash(`npm install ${npmTool} -q -g`) + await bash(`npm install ${npmTool} -q -g`) } } plugins.beautylog.success('all global npm tools specified in npmextra.json are now available!') - done.resolve() }) - return done.promise } diff --git a/ts/npmci.prepare.ts b/ts/npmci.prepare.ts index a442d8b..b23eabd 100644 --- a/ts/npmci.prepare.ts +++ b/ts/npmci.prepare.ts @@ -1,5 +1,5 @@ import * as plugins from './npmci.plugins' -import {bash} from './npmci.bash' +import { bash } from './npmci.bash' import * as env from './npmci.env' import * as sshModule from './npmci.ssh' @@ -9,85 +9,74 @@ import * as sshModule from './npmci.ssh' /** * defines possible prepare services */ -export type TPrepService = 'npm' | 'docker' | 'docker-gitlab' | 'ssh'; +export type TPrepService = 'npm' | 'docker' | 'docker-gitlab' | 'ssh' /** * authenticates npm with token from env var */ -let npm = function(){ - let done = plugins.q.defer() - - let npmrcPrefix: string = '//registry.npmjs.org/:_authToken=' - let npmToken: string = process.env.NPMCI_TOKEN_NPM - let npmrcFileString = npmrcPrefix + npmToken - - if (npmToken) { - plugins.beautylog.info('found access token') - } else { - plugins.beautylog.error('no access token found! Exiting!') - process.exit(1) - } - plugins.smartfile.memory.toFsSync(npmrcFileString,'/root/.npmrc') - done.resolve() - return done.promise +let npm = async () => { + let npmrcPrefix: string = '//registry.npmjs.org/:_authToken=' + let npmToken: string = process.env.NPMCI_TOKEN_NPM + let npmrcFileString: string = npmrcPrefix + npmToken + if (npmToken) { + plugins.beautylog.info('found access token') + } else { + plugins.beautylog.error('no access token found! Exiting!') + process.exit(1) + } + plugins.smartfile.memory.toFsSync(npmrcFileString, '/root/.npmrc') + return } /** * logs in docker */ -let docker = function(){ - let done = plugins.q.defer() - env.setDockerRegistry('docker.io') - let dockerRegex = /^([a-zA-Z0-9\.]*)\|([a-zA-Z0-9\.]*)/ - if (!process.env.NPMCI_LOGIN_DOCKER) { - plugins.beautylog.error('You have to specify Login Data to the Docker Registry') - process.exit(1) - } - plugins.shelljs.exec('docker login -u gitlab-ci-token -p ' + process.env.CI_BUILD_TOKEN + ' ' + 'registry.gitlab.com') // Always also login to GitLab Registry - let dockerRegexResultArray = dockerRegex.exec(process.env.NPMCI_LOGIN_DOCKER) - let username = dockerRegexResultArray[1] - let password = dockerRegexResultArray[2] - plugins.shelljs.exec('docker login -u ' + username + ' -p ' + password) - done.resolve() - return done.promise +let docker = async () => { + env.setDockerRegistry('docker.io') + let dockerRegex = /^([a-zA-Z0-9\.]*)\|([a-zA-Z0-9\.]*)/ + if (!process.env.NPMCI_LOGIN_DOCKER) { + plugins.beautylog.error('You have to specify Login Data to the Docker Registry') + process.exit(1) + } + plugins.shelljs.exec('docker login -u gitlab-ci-token -p ' + process.env.CI_BUILD_TOKEN + ' ' + 'registry.gitlab.com') // Always also login to GitLab Registry + let dockerRegexResultArray = dockerRegex.exec(process.env.NPMCI_LOGIN_DOCKER) + let username = dockerRegexResultArray[1] + let password = dockerRegexResultArray[2] + plugins.shelljs.exec('docker login -u ' + username + ' -p ' + password) + return } /** * prepare docker for gitlab registry */ -let dockerGitlab = function(){ - let done = plugins.q.defer() - env.setDockerRegistry('registry.gitlab.com') - plugins.shelljs.exec('docker login -u gitlab-ci-token -p ' + process.env.CI_BUILD_TOKEN + ' ' + 'registry.gitlab.com') - done.resolve() - return done.promise +let dockerGitlab = async () => { + env.setDockerRegistry('registry.gitlab.com') + plugins.shelljs.exec('docker login -u gitlab-ci-token -p ' + process.env.CI_BUILD_TOKEN + ' ' + 'registry.gitlab.com') + return } /** * prepare ssh */ -let ssh = function(){ - let done = plugins.q.defer() - sshModule.ssh() - .then(done.resolve) - return done.promise +let ssh = async () => { + await sshModule.ssh() } /** * the main exported prepare function * @param servieArg describes the service to prepare */ -export let prepare = function(serviceArg: TPrepService){ - switch (serviceArg) { - case 'npm': - return npm() - case 'docker': - return docker() - case 'docker-gitlab': - return dockerGitlab() - case 'ssh': - return ssh() - default: - break - } +export let prepare = async (serviceArg: TPrepService) => { + switch (serviceArg) { + case 'npm': + return await npm() + case 'docker': + return await docker() + case 'docker-gitlab': + return await dockerGitlab() + case 'ssh': + return await ssh() + default: + break + } } diff --git a/ts/npmci.publish.ts b/ts/npmci.publish.ts index 6617090..314f431 100644 --- a/ts/npmci.publish.ts +++ b/ts/npmci.publish.ts @@ -1,49 +1,46 @@ import * as plugins from './npmci.plugins' -import {prepare} from './npmci.prepare' -import {bash} from './npmci.bash' +import { prepare } from './npmci.prepare' +import { bash } from './npmci.bash' import * as NpmciEnv from './npmci.env' import * as NpmciBuildDocker from './npmci.build.docker' /** * type of supported services */ -export type TPubService = 'npm' | 'docker'; +export type TPubService = 'npm' | 'docker' /** * the main exported publish function. * @param pubServiceArg references targeted service to publish to */ -export let publish = (pubServiceArg: TPubService = 'npm') => { - switch (pubServiceArg) { - case 'npm': - return publishNpm() - case 'docker': - return publishDocker() - } +export let publish = async (pubServiceArg: TPubService = 'npm') => { + switch (pubServiceArg) { + case 'npm': + return await publishNpm() + case 'docker': + return await publishDocker() + } } /** * tries to publish current cwd to NPM registry */ -let publishNpm = function(){ - let done = plugins.q.defer() - prepare('npm') - .then(function(){ - bash('npm publish') - plugins.beautylog.ok('Done!') - done.resolve() - }) - return done.promise +let publishNpm = async () => { + await prepare('npm') + .then(async function () { + await bash('npm publish') + plugins.beautylog.ok('Done!') + }) } /** * tries to pubish current cwd to Docker registry */ -let publishDocker = function(){ - let done = plugins.q.defer() - NpmciBuildDocker.readDockerfiles() - .then(NpmciBuildDocker.pullDockerfileImages) - .then(NpmciBuildDocker.pushDockerfiles) - .then(done.resolve) - return done.promise +let publishDocker = async () => { + return await NpmciBuildDocker.readDockerfiles() + .then(NpmciBuildDocker.pullDockerfileImages) + .then(NpmciBuildDocker.pushDockerfiles) + .then(dockerfileArray => { + return dockerfileArray + }) } diff --git a/ts/npmci.servezone.ts b/ts/npmci.servezone.ts index 99d5b69..7f6a232 100644 --- a/ts/npmci.servezone.ts +++ b/ts/npmci.servezone.ts @@ -25,7 +25,7 @@ let smartsocketClientConstructorOptions = { /** * the main run function to submit a service to a servezone */ -export let run = (configArg) => { +export let run = async (configArg) => { new plugins.smartsocket.SmartsocketClient( smartsocketClientConstructorOptions ) diff --git a/ts/npmci.ssh.ts b/ts/npmci.ssh.ts index 4849d4f..42591a6 100644 --- a/ts/npmci.ssh.ts +++ b/ts/npmci.ssh.ts @@ -6,45 +6,43 @@ let sshInstance: plugins.smartssh.SshInstance /** * checks for ENV vars in form of NPMCI_SSHKEY_* and deploys any found ones */ -export let ssh = () => { - let done = plugins.q.defer() - sshInstance = new plugins.smartssh.SshInstance() // init ssh instance - plugins.smartparam.forEachMinimatch(process.env,'NPMCI_SSHKEY_*',evaluateSshEnv) - if (!process.env.NPMTS_TEST) { - sshInstance.writeToDisk() - } else { - plugins.beautylog.log('In test mode, so not storing SSH keys to disk!') - }; - done.resolve() - return done.promise +export let ssh = async () => { + sshInstance = new plugins.smartssh.SshInstance() // init ssh instance + plugins.smartparam.forEachMinimatch(process.env, 'NPMCI_SSHKEY_*', evaluateSshEnv) + if (!process.env.NPMTS_TEST) { + sshInstance.writeToDisk() + } else { + plugins.beautylog.log('In test mode, so not storing SSH keys to disk!') + }; } /** * gets called for each found SSH ENV Var and deploys it */ -let evaluateSshEnv = (sshkeyEnvVarArg) => { - let resultArray = sshRegex.exec(sshkeyEnvVarArg) - let sshKey = new plugins.smartssh.SshKey() - plugins.beautylog.info('Found SSH identity for ' + resultArray[1]) - if (notUndefined(resultArray[1])) { - plugins.beautylog.log('---> host defined!') - sshKey.host = resultArray[1] - } - if (notUndefined(resultArray[2])) { - plugins.beautylog.log('---> privKey defined!') - sshKey.privKeyBase64 = resultArray[2] - }; - if (notUndefined(resultArray[3])) { - '---> pubKey defined!' - sshKey.pubKeyBase64 = resultArray[3] - }; +let evaluateSshEnv = async (sshkeyEnvVarArg) => { + let resultArray = sshRegex.exec(sshkeyEnvVarArg) + let sshKey = new plugins.smartssh.SshKey() + plugins.beautylog.info('Found SSH identity for ' + resultArray[1]) + if (notUndefined(resultArray[1])) { + plugins.beautylog.log('---> host defined!') + sshKey.host = resultArray[1] + } + if (notUndefined(resultArray[2])) { + plugins.beautylog.log('---> privKey defined!') + sshKey.privKeyBase64 = resultArray[2] + }; + if (notUndefined(resultArray[3])) { + '---> pubKey defined!' + sshKey.pubKeyBase64 = resultArray[3] + }; - sshInstance.addKey(sshKey) + sshInstance.addKey(sshKey) + return } /** * checks if not undefined */ let notUndefined = (stringArg: string) => { - return (stringArg && stringArg !== 'undefined' && stringArg !== '##') + return (stringArg && stringArg !== 'undefined' && stringArg !== '##') } diff --git a/ts/npmci.test.ts b/ts/npmci.test.ts index bae0ade..e0f0862 100644 --- a/ts/npmci.test.ts +++ b/ts/npmci.test.ts @@ -1,49 +1,32 @@ import * as plugins from './npmci.plugins' -import {bash} from './npmci.bash' -import {install} from './npmci.install' +import { bash } from './npmci.bash' +import { install } from './npmci.install' import * as env from './npmci.env' import * as NpmciBuildDocker from './npmci.build.docker' -export let test = (versionArg) => { - let done = plugins.q.defer() - if (versionArg === 'docker') { - testDocker() - .then(() => { - done.resolve() - }) - } else { - install(versionArg) - .then(npmDependencies) - .then(npmTest) - .then(() => { - done.resolve() - }) - } - return done.promise +export let test = async (versionArg): Promise => { + if (versionArg === 'docker') { + await testDocker() + } else { + await install(versionArg) + .then(npmDependencies) + .then(npmTest) + } } -let npmDependencies = function(){ - let done = plugins.q.defer() - plugins.beautylog.info('now installing dependencies:') - bash('npm install') - done.resolve() - return done.promise +let npmDependencies = async () => { + plugins.beautylog.info('now installing dependencies:') + await bash('npm install') } -let npmTest = () => { - let done = plugins.q.defer() - plugins.beautylog.info('now starting tests:') - bash('npm test') - done.resolve() - return done.promise +let npmTest = async () => { + plugins.beautylog.info('now starting tests:') + await bash('npm test') } -let testDocker = function(){ - let done = plugins.q.defer() - NpmciBuildDocker.readDockerfiles() - .then(NpmciBuildDocker.pullDockerfileImages) - .then(NpmciBuildDocker.testDockerfiles) - .then(done.resolve) - return done.promise +let testDocker = async (): Promise => { + return await NpmciBuildDocker.readDockerfiles() + .then(NpmciBuildDocker.pullDockerfileImages) + .then(NpmciBuildDocker.testDockerfiles) } diff --git a/ts/npmci.trigger.ts b/ts/npmci.trigger.ts index d305b47..78df6ec 100644 --- a/ts/npmci.trigger.ts +++ b/ts/npmci.trigger.ts @@ -4,27 +4,24 @@ import { bash } from './npmci.bash' let triggerValueRegex = /^([a-zA-Z0-9\.]*)\|([a-zA-Z0-9\.]*)\|([a-zA-Z0-9\.]*)\|([a-zA-Z0-9\.]*)\|?([a-zA-Z0-9\.\-\/]*)/ -export let trigger = function () { - let done = plugins.q.defer() - plugins.beautylog.info('now running triggers') - plugins.smartparam.forEachMinimatch(process.env, 'NPMCI_TRIGGER_*', evaluateTrigger) - done.resolve() - return done.promise +export let trigger = async () => { + plugins.beautylog.info('now running triggers') + plugins.smartparam.forEachMinimatch(process.env, 'NPMCI_TRIGGER_*', evaluateTrigger) } -let evaluateTrigger = (triggerEnvVarArg) => { - let triggerRegexResultArray = triggerValueRegex.exec(triggerEnvVarArg) - let regexDomain = triggerRegexResultArray[1] - let regexProjectId = triggerRegexResultArray[2] - let regexProjectTriggerToken = triggerRegexResultArray[3] - let regexRefName = triggerRegexResultArray[4] - let regexTriggerName - if (triggerRegexResultArray.length === 6) { - regexTriggerName = triggerRegexResultArray[5] - } else { - regexTriggerName = 'Unnamed Trigger' - } - plugins.beautylog.info('Found Trigger!') - plugins.beautylog.log('triggering build for ref ' + regexRefName + ' of ' + regexTriggerName) - plugins.request.post('https://gitlab.com/api/v3/projects/' + regexProjectId + '/trigger/builds', { form: { token: regexProjectTriggerToken, ref: regexRefName } }) +let evaluateTrigger = async (triggerEnvVarArg) => { + let triggerRegexResultArray = triggerValueRegex.exec(triggerEnvVarArg) + let regexDomain = triggerRegexResultArray[1] + let regexProjectId = triggerRegexResultArray[2] + let regexProjectTriggerToken = triggerRegexResultArray[3] + let regexRefName = triggerRegexResultArray[4] + let regexTriggerName + if (triggerRegexResultArray.length === 6) { + regexTriggerName = triggerRegexResultArray[5] + } else { + regexTriggerName = 'Unnamed Trigger' + } + plugins.beautylog.info('Found Trigger!') + plugins.beautylog.log('triggering build for ref ' + regexRefName + ' of ' + regexTriggerName) + plugins.request.post('https://gitlab.com/api/v3/projects/' + regexProjectId + '/trigger/builds', { form: { token: regexProjectTriggerToken, ref: regexRefName } }) }