| 
									
										
										
										
											2018-11-24 15:00:19 +01:00
										 |  |  | import { logger } from '../npmci.logging'; | 
					
						
							| 
									
										
										
										
											2018-04-04 22:25:13 +02:00
										 |  |  | import * as plugins from './mod.plugins'; | 
					
						
							|  |  |  | import * as paths from '../npmci.paths'; | 
					
						
							|  |  |  | import { bash } from '../npmci.bash'; | 
					
						
							| 
									
										
										
										
											2017-08-27 15:24:17 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-04 22:25:13 +02:00
										 |  |  | import * as helpers from './mod.helpers'; | 
					
						
							| 
									
										
										
										
											2017-08-28 01:03:59 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | // classes
 | 
					
						
							| 
									
										
										
										
											2018-04-04 22:25:13 +02:00
										 |  |  | import { Dockerfile } from './mod.classes.dockerfile'; | 
					
						
							|  |  |  | import { DockerRegistry } from './mod.classes.dockerregistry'; | 
					
						
							|  |  |  | import { RegistryStorage } from './mod.classes.registrystorage'; | 
					
						
							| 
									
										
										
										
											2017-08-28 01:03:59 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-19 10:41:58 +02:00
										 |  |  | // config
 | 
					
						
							|  |  |  | import { configObject } from '../npmci.config'; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-28 01:03:59 +02:00
										 |  |  | // instances
 | 
					
						
							| 
									
										
										
										
											2018-11-24 15:00:19 +01:00
										 |  |  | const npmciRegistryStorage = new RegistryStorage(); | 
					
						
							| 
									
										
										
										
											2017-08-28 01:03:59 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-04 22:25:13 +02:00
										 |  |  | export { Dockerfile, helpers }; | 
					
						
							| 
									
										
										
										
											2017-08-28 01:03:59 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-04 22:25:13 +02:00
										 |  |  | export let modArgvArg; // will be set through the build command
 | 
					
						
							| 
									
										
										
										
											2017-08-27 15:24:17 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * handle cli input | 
					
						
							|  |  |  |  * @param argvArg | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2019-06-19 11:35:19 +02:00
										 |  |  | export const handleCli = async argvArg => { | 
					
						
							| 
									
										
										
										
											2018-04-04 22:25:13 +02:00
										 |  |  |   modArgvArg = argvArg; | 
					
						
							| 
									
										
										
										
											2017-08-27 15:24:17 +02:00
										 |  |  |   if (argvArg._.length >= 2) { | 
					
						
							| 
									
										
										
										
											2018-11-24 15:00:19 +01:00
										 |  |  |     const action: string = argvArg._[1]; | 
					
						
							| 
									
										
										
										
											2017-08-27 15:24:17 +02:00
										 |  |  |     switch (action) { | 
					
						
							|  |  |  |       case 'build': | 
					
						
							| 
									
										
										
										
											2018-04-04 22:25:13 +02:00
										 |  |  |         await build(); | 
					
						
							|  |  |  |         break; | 
					
						
							| 
									
										
										
										
											2017-08-28 02:24:06 +02:00
										 |  |  |       case 'login': | 
					
						
							| 
									
										
										
										
											2017-09-12 21:02:41 +02:00
										 |  |  |       case 'prepare': | 
					
						
							| 
									
										
										
										
											2018-04-04 22:25:13 +02:00
										 |  |  |         await login(); | 
					
						
							|  |  |  |         break; | 
					
						
							| 
									
										
										
										
											2017-08-27 15:24:17 +02:00
										 |  |  |       case 'test': | 
					
						
							| 
									
										
										
										
											2018-04-04 22:25:13 +02:00
										 |  |  |         await test(); | 
					
						
							|  |  |  |         break; | 
					
						
							| 
									
										
										
										
											2017-08-28 01:03:59 +02:00
										 |  |  |       case 'push': | 
					
						
							| 
									
										
										
										
											2018-04-04 22:25:13 +02:00
										 |  |  |         await push(argvArg); | 
					
						
							|  |  |  |         break; | 
					
						
							| 
									
										
										
										
											2017-08-28 01:03:59 +02:00
										 |  |  |       case 'pull': | 
					
						
							| 
									
										
										
										
											2018-04-04 22:25:13 +02:00
										 |  |  |         await pull(argvArg); | 
					
						
							|  |  |  |         break; | 
					
						
							| 
									
										
										
										
											2017-08-27 15:24:17 +02:00
										 |  |  |       default: | 
					
						
							| 
									
										
										
										
											2018-11-24 15:00:19 +01:00
										 |  |  |         logger.log('error', `>>npmci docker ...<< action >>${action}<< not supported`); | 
					
						
							| 
									
										
										
										
											2017-08-27 15:24:17 +02:00
										 |  |  |     } | 
					
						
							|  |  |  |   } else { | 
					
						
							| 
									
										
										
										
											2018-11-24 15:00:19 +01:00
										 |  |  |     logger.log( | 
					
						
							|  |  |  |       'info', | 
					
						
							| 
									
										
										
										
											2018-04-04 22:25:13 +02:00
										 |  |  |       `>>npmci docker ...<< cli arguments invalid... Please read the documentation.` | 
					
						
							|  |  |  |     ); | 
					
						
							| 
									
										
										
										
											2017-08-27 15:24:17 +02:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2018-04-04 22:25:13 +02:00
										 |  |  | }; | 
					
						
							| 
									
										
										
										
											2017-08-27 15:24:17 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-28 01:03:59 +02:00
										 |  |  | /** | 
					
						
							|  |  |  |  * builds a cwd of Dockerfiles by triggering a promisechain | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2019-06-19 11:35:19 +02:00
										 |  |  | export const build = async () => { | 
					
						
							| 
									
										
										
										
											2018-04-04 22:25:13 +02:00
										 |  |  |   await prepare(); | 
					
						
							| 
									
										
										
										
											2018-11-24 15:00:19 +01:00
										 |  |  |   logger.log('info', 'now building Dockerfiles...'); | 
					
						
							| 
									
										
										
										
											2018-04-04 22:25:13 +02:00
										 |  |  |   await helpers | 
					
						
							|  |  |  |     .readDockerfiles() | 
					
						
							| 
									
										
										
										
											2017-08-28 01:03:59 +02:00
										 |  |  |     .then(helpers.sortDockerfiles) | 
					
						
							|  |  |  |     .then(helpers.mapDockerfiles) | 
					
						
							| 
									
										
										
										
											2018-04-04 22:25:13 +02:00
										 |  |  |     .then(helpers.buildDockerfiles); | 
					
						
							|  |  |  | }; | 
					
						
							| 
									
										
										
										
											2017-08-27 15:24:17 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-28 02:24:06 +02:00
										 |  |  | /** | 
					
						
							|  |  |  |  * login to the DockerRegistries | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2019-06-19 11:35:19 +02:00
										 |  |  | export const login = async () => { | 
					
						
							| 
									
										
										
										
											2018-04-04 22:25:13 +02:00
										 |  |  |   await prepare(); | 
					
						
							|  |  |  |   await npmciRegistryStorage.loginAll(); | 
					
						
							|  |  |  | }; | 
					
						
							| 
									
										
										
										
											2017-08-28 02:24:06 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-27 15:24:17 +02:00
										 |  |  | /** | 
					
						
							|  |  |  |  * logs in docker | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2019-06-19 11:35:19 +02:00
										 |  |  | export const prepare = async () => { | 
					
						
							| 
									
										
										
										
											2017-08-27 15:24:17 +02:00
										 |  |  |   // Always login to GitLab Registry
 | 
					
						
							|  |  |  |   if (!process.env.CI_BUILD_TOKEN || process.env.CI_BUILD_TOKEN === '') { | 
					
						
							| 
									
										
										
										
											2018-11-24 15:00:19 +01:00
										 |  |  |     logger.log('error', 'No registry token specified by gitlab!'); | 
					
						
							| 
									
										
										
										
											2018-04-04 22:25:13 +02:00
										 |  |  |     process.exit(1); | 
					
						
							| 
									
										
										
										
											2017-08-27 15:24:17 +02:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2018-04-04 22:25:13 +02:00
										 |  |  |   npmciRegistryStorage.addRegistry( | 
					
						
							|  |  |  |     new DockerRegistry({ | 
					
						
							|  |  |  |       registryUrl: 'registry.gitlab.com', | 
					
						
							|  |  |  |       username: 'gitlab-ci-token', | 
					
						
							|  |  |  |       password: process.env.CI_BUILD_TOKEN | 
					
						
							|  |  |  |     }) | 
					
						
							|  |  |  |   ); | 
					
						
							| 
									
										
										
										
											2017-08-27 15:24:17 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-28 01:03:59 +02:00
										 |  |  |   // handle registries
 | 
					
						
							| 
									
										
										
										
											2018-04-04 22:25:13 +02:00
										 |  |  |   await plugins.smartparam.forEachMinimatch(process.env, 'NPMCI_LOGIN_DOCKER*', async envString => { | 
					
						
							|  |  |  |     npmciRegistryStorage.addRegistry(DockerRegistry.fromEnvString(envString)); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  |   return; | 
					
						
							|  |  |  | }; | 
					
						
							| 
									
										
										
										
											2017-08-27 15:24:17 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-19 10:41:58 +02:00
										 |  |  | /** | 
					
						
							|  |  |  |  * pushes an image towards a registry | 
					
						
							|  |  |  |  * @param argvArg | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | export const push = async argvArg => { | 
					
						
							| 
									
										
										
										
											2018-04-04 22:25:13 +02:00
										 |  |  |   await prepare(); | 
					
						
							| 
									
										
										
										
											2019-06-19 10:41:58 +02:00
										 |  |  |   let dockerRegistryUrls: string[] = []; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // lets parse the input of cli and npmextra
 | 
					
						
							|  |  |  |   if (argvArg._.length >= 3 && argvArg._[2] !== 'npmextra') { | 
					
						
							|  |  |  |     dockerRegistryUrls.push(argvArg._[2]); | 
					
						
							| 
									
										
										
										
											2019-06-19 11:35:19 +02:00
										 |  |  |   } else { | 
					
						
							|  |  |  |     if (configObject.dockerRegistries.length === 0) { | 
					
						
							| 
									
										
										
										
											2019-06-19 14:00:24 +02:00
										 |  |  |       logger.log( | 
					
						
							|  |  |  |         'warn', | 
					
						
							|  |  |  |         `There are no docker registries listed in npmextra.json! This is strange!` | 
					
						
							|  |  |  |       ); | 
					
						
							| 
									
										
										
										
											2019-06-19 11:35:19 +02:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2019-06-19 10:41:58 +02:00
										 |  |  |     dockerRegistryUrls = dockerRegistryUrls.concat(configObject.dockerRegistries); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // lets determine the suffix
 | 
					
						
							| 
									
										
										
										
											2018-04-04 22:25:13 +02:00
										 |  |  |   let suffix = null; | 
					
						
							| 
									
										
										
										
											2017-08-28 01:03:59 +02:00
										 |  |  |   if (argvArg._.length >= 4) { | 
					
						
							| 
									
										
										
										
											2018-04-04 22:25:13 +02:00
										 |  |  |     suffix = argvArg._[3]; | 
					
						
							| 
									
										
										
										
											2017-08-27 15:24:17 +02:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2019-06-19 10:41:58 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |   // lets push to the registries
 | 
					
						
							|  |  |  |   for (const dockerRegistryUrl of dockerRegistryUrls) { | 
					
						
							|  |  |  |     const dockerfileArray = await helpers | 
					
						
							|  |  |  |       .readDockerfiles() | 
					
						
							|  |  |  |       .then(helpers.sortDockerfiles) | 
					
						
							|  |  |  |       .then(helpers.mapDockerfiles); | 
					
						
							|  |  |  |     const dockerRegistryToPushTo = npmciRegistryStorage.getRegistryByUrl(dockerRegistryUrl); | 
					
						
							|  |  |  |     if (!dockerRegistryToPushTo) { | 
					
						
							|  |  |  |       logger.log( | 
					
						
							|  |  |  |         'error', | 
					
						
							|  |  |  |         `Cannot push to registry ${dockerRegistryUrl}, because it was not found in the authenticated registry list.` | 
					
						
							|  |  |  |       ); | 
					
						
							|  |  |  |       process.exit(1); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     for (const dockerfile of dockerfileArray) { | 
					
						
							|  |  |  |       await dockerfile.push(dockerRegistryToPushTo, suffix); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2017-08-27 15:24:17 +02:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2018-04-04 22:25:13 +02:00
										 |  |  | }; | 
					
						
							| 
									
										
										
										
											2017-08-27 15:24:17 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-19 11:35:19 +02:00
										 |  |  | export const pull = async argvArg => { | 
					
						
							| 
									
										
										
										
											2018-04-04 22:25:13 +02:00
										 |  |  |   await prepare(); | 
					
						
							| 
									
										
										
										
											2018-11-24 15:00:19 +01:00
										 |  |  |   const registryUrlArg = argvArg._[2]; | 
					
						
							| 
									
										
										
										
											2018-04-04 22:25:13 +02:00
										 |  |  |   let suffix = null; | 
					
						
							| 
									
										
										
										
											2017-08-28 01:03:59 +02:00
										 |  |  |   if (argvArg._.length >= 4) { | 
					
						
							| 
									
										
										
										
											2018-04-04 22:25:13 +02:00
										 |  |  |     suffix = argvArg._[3]; | 
					
						
							| 
									
										
										
										
											2017-08-27 15:24:17 +02:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2018-11-24 15:00:19 +01:00
										 |  |  |   const localDockerRegistry = npmciRegistryStorage.getRegistryByUrl(registryUrlArg); | 
					
						
							|  |  |  |   const dockerfileArray = await helpers | 
					
						
							| 
									
										
										
										
											2018-04-04 22:25:13 +02:00
										 |  |  |     .readDockerfiles() | 
					
						
							| 
									
										
										
										
											2017-08-28 01:03:59 +02:00
										 |  |  |     .then(helpers.sortDockerfiles) | 
					
						
							| 
									
										
										
										
											2018-04-04 22:25:13 +02:00
										 |  |  |     .then(helpers.mapDockerfiles); | 
					
						
							| 
									
										
										
										
											2018-11-24 15:00:19 +01:00
										 |  |  |   for (const dockerfile of dockerfileArray) { | 
					
						
							| 
									
										
										
										
											2018-04-04 22:25:13 +02:00
										 |  |  |     await dockerfile.pull(localDockerRegistry, suffix); | 
					
						
							| 
									
										
										
										
											2017-08-27 15:24:17 +02:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2018-04-04 22:25:13 +02:00
										 |  |  | }; | 
					
						
							| 
									
										
										
										
											2017-08-27 15:24:17 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-19 11:35:19 +02:00
										 |  |  | /** | 
					
						
							|  |  |  |  * tests docker files | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | export const test = async () => { | 
					
						
							| 
									
										
										
										
											2018-04-04 22:25:13 +02:00
										 |  |  |   await prepare(); | 
					
						
							|  |  |  |   return await helpers.readDockerfiles().then(helpers.testDockerfiles); | 
					
						
							|  |  |  | }; |