import * as plugins from './mod.plugins' import * as paths from '../npmci.paths' import { bash } from '../npmci.bash' import * as helpers from './mod.helpers' // classes import { Dockerfile } from './mod.classes.dockerfile' import { DockerRegistry } from './mod.classes.dockerregistry' import { RegistryStorage } from './mod.classes.registrystorage' // instances let npmciRegistryStorage = new RegistryStorage() export { Dockerfile, helpers } export let modArgvArg // will be set through the build command /** * handle cli input * @param argvArg */ export let handleCli = async (argvArg) => { modArgvArg = argvArg if (argvArg._.length >= 2) { let action: string = argvArg._[ 1 ] switch (action) { case 'build': await build() break case 'login': case 'prepare': await login() break case 'test': await test() break case 'push': await push(argvArg) break case 'pull': await pull(argvArg) break default: plugins.beautylog.error(`>>npmci docker ...<< action >>${action}<< not supported`) } } else { plugins.beautylog.log(`>>npmci docker ...<< cli arguments invalid... Please read the documentation.`) } } /** * builds a cwd of Dockerfiles by triggering a promisechain */ export let build = async () => { await prepare() plugins.beautylog.log('now building Dockerfiles...') await helpers.readDockerfiles() .then(helpers.sortDockerfiles) .then(helpers.mapDockerfiles) .then(helpers.buildDockerfiles) } /** * login to the DockerRegistries */ export let login = async () => { await prepare() await npmciRegistryStorage.loginAll() } /** * logs in docker */ export let prepare = async () => { // Always login to GitLab Registry if (!process.env.CI_BUILD_TOKEN || process.env.CI_BUILD_TOKEN === '') { plugins.beautylog.error('No registry token specified by gitlab!') process.exit(1) } npmciRegistryStorage.addRegistry(new DockerRegistry({ registryUrl: 'registry.gitlab.com', username: 'gitlab-ci-token', password: process.env.CI_BUILD_TOKEN })) // handle registries await plugins.smartparam.forEachMinimatch(process.env, 'NPMCI_LOGIN_DOCKER*', async (envString) => { npmciRegistryStorage.addRegistry( DockerRegistry.fromEnvString(envString) ) }) return } export let push = async (argvArg) => { await prepare() let registryUrlArg = argvArg._[ 2 ] let suffix = null if (argvArg._.length >= 4) { suffix = argvArg._[ 3 ] } let dockerfileArray = await helpers.readDockerfiles() .then(helpers.sortDockerfiles) .then(helpers.mapDockerfiles) let localDockerRegistry = npmciRegistryStorage.getRegistryByUrl(registryUrlArg) if (!localDockerRegistry) { plugins.beautylog.error(`Cannot push to registry ${registryUrlArg}, because it was not found in the authenticated registry list.`) process.exit(1) } for (let dockerfile of dockerfileArray) { await dockerfile.push(localDockerRegistry, suffix) } } export let pull = async (argvArg) => { await prepare() let registryUrlArg = argvArg._[ 2 ] let suffix = null if (argvArg._.length >= 4) { suffix = argvArg._[ 3 ] } let localDockerRegistry = npmciRegistryStorage.getRegistryByUrl(registryUrlArg) let dockerfileArray = await helpers.readDockerfiles() .then(helpers.sortDockerfiles) .then(helpers.mapDockerfiles) for (let dockerfile of dockerfileArray) { await dockerfile.pull(localDockerRegistry, suffix) } } export let test = async () => { await prepare() return await helpers.readDockerfiles() .then(helpers.testDockerfiles) }