| 
									
										
										
										
											2016-06-04 18:41:35 +02:00
										 |  |  | import * as plugins from "./npmci.plugins" | 
					
						
							| 
									
										
										
										
											2016-06-05 01:31:21 +02:00
										 |  |  | import * as NpmciEnv from "./npmci.env"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-04 18:41:35 +02:00
										 |  |  | export let build = function(){ | 
					
						
							| 
									
										
										
										
											2016-06-05 06:26:05 +02:00
										 |  |  |     let done = plugins.q.defer(); | 
					
						
							| 
									
										
										
										
											2016-06-05 05:16:14 +02:00
										 |  |  |     plugins.gulp.dest("./Dockerfile*") | 
					
						
							|  |  |  |         .pipe(readDockerfiles) | 
					
						
							| 
									
										
										
										
											2016-06-05 06:20:05 +02:00
										 |  |  |         .pipe(plugins.gulpFunction(function(){ | 
					
						
							|  |  |  |             sortDockerfiles() | 
					
						
							|  |  |  |                 .then(buildDockerfiles) | 
					
						
							|  |  |  |                 .then(done.resolve); | 
					
						
							|  |  |  |         },"atEnd")); | 
					
						
							| 
									
										
										
										
											2016-06-04 18:41:35 +02:00
										 |  |  |     return done.promise; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-05 02:17:55 +02:00
										 |  |  | let readDockerfiles = function(){ | 
					
						
							|  |  |  |     return function(file,enc,cb){ | 
					
						
							| 
									
										
										
										
											2016-06-05 05:16:14 +02:00
										 |  |  |         let myDockerfile = new Dockerfile({ | 
					
						
							|  |  |  |             filePath:file.path, | 
					
						
							|  |  |  |             read:true | 
					
						
							|  |  |  |         }); | 
					
						
							| 
									
										
										
										
											2016-06-05 02:17:55 +02:00
										 |  |  |         NpmciEnv.dockerFiles.push( | 
					
						
							| 
									
										
										
										
											2016-06-05 05:16:14 +02:00
										 |  |  |             myDockerfile | 
					
						
							| 
									
										
										
										
											2016-06-05 02:17:55 +02:00
										 |  |  |         ); | 
					
						
							| 
									
										
										
										
											2016-06-05 05:16:14 +02:00
										 |  |  |         cb(null,file); | 
					
						
							| 
									
										
										
										
											2016-06-05 02:17:55 +02:00
										 |  |  |     }; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2016-06-05 01:22:04 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-05 06:20:05 +02:00
										 |  |  | let sortDockerfiles = function(){ | 
					
						
							|  |  |  |     let done = plugins.q.defer(); | 
					
						
							|  |  |  |     let redoSort:boolean; | 
					
						
							|  |  |  |     let sortFunction = function(){ | 
					
						
							|  |  |  |         redoSort = false; | 
					
						
							|  |  |  |         let notYetBuiltImages:string[] = []; | 
					
						
							|  |  |  |         NpmciEnv.dockerFiles.forEach((dockerFileArg)=>{ | 
					
						
							|  |  |  |             notYetBuiltImages.push(dockerFileArg.cleanTag); | 
					
						
							|  |  |  |         }); | 
					
						
							|  |  |  |         NpmciEnv.dockerFiles.sort(function(a,b){ | 
					
						
							|  |  |  |             plugins.beautylog.log("sort build order for Dockerimages"); | 
					
						
							|  |  |  |             let aIndex = notYetBuiltImages.indexOf(a.cleanTag); | 
					
						
							|  |  |  |             if(aIndex != -1){notYetBuiltImages.splice(aIndex,1)} | 
					
						
							|  |  |  |             if(notYetBuiltImages.indexOf(b.cleanTag) != -1){ | 
					
						
							|  |  |  |                 redoSort = true; | 
					
						
							|  |  |  |                 return -1; | 
					
						
							|  |  |  |             } else { | 
					
						
							|  |  |  |                 return 0 | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         }); | 
					
						
							|  |  |  |         if(redoSort){ | 
					
						
							|  |  |  |             sortFunction(); | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |             done.resolve(); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  |     sortFunction(); | 
					
						
							|  |  |  |     return done.promise; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-05 05:16:14 +02:00
										 |  |  | let buildDockerfiles = function(){ | 
					
						
							| 
									
										
										
										
											2016-06-05 06:20:05 +02:00
										 |  |  |     let done = plugins.q.defer(); | 
					
						
							|  |  |  |     NpmciEnv.dockerFiles.forEach(function(dockerfileArg){ | 
					
						
							|  |  |  |         dockerfileArg.build(); | 
					
						
							|  |  |  |     }) | 
					
						
							|  |  |  |     done.resolve(); | 
					
						
							|  |  |  |     return done.promise; | 
					
						
							| 
									
										
										
										
											2016-06-05 05:16:14 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-05 02:17:55 +02:00
										 |  |  | export class Dockerfile { | 
					
						
							| 
									
										
										
										
											2016-06-05 04:45:46 +02:00
										 |  |  |     filePath:string; | 
					
						
							| 
									
										
										
										
											2016-06-05 01:31:21 +02:00
										 |  |  |     repo:string; | 
					
						
							|  |  |  |     version:string; | 
					
						
							| 
									
										
										
										
											2016-06-05 06:20:05 +02:00
										 |  |  |     cleanTag:string; | 
					
						
							|  |  |  |     buildTag:string; | 
					
						
							| 
									
										
										
										
											2016-06-05 04:19:54 +02:00
										 |  |  |     content:string; | 
					
						
							| 
									
										
										
										
											2016-06-05 01:31:21 +02:00
										 |  |  |     baseImage:string; | 
					
						
							| 
									
										
										
										
											2016-06-05 02:17:55 +02:00
										 |  |  |     constructor(options:{filePath?:string,fileContents?:string|Buffer,read?:boolean}){ | 
					
						
							| 
									
										
										
										
											2016-06-05 04:45:46 +02:00
										 |  |  |         this.filePath = options.filePath; | 
					
						
							| 
									
										
										
										
											2016-06-05 04:19:54 +02:00
										 |  |  |         this.repo = NpmciEnv.repo.user + "/" + NpmciEnv.repo.repo; | 
					
						
							|  |  |  |         this.version = dockerFileVersion(plugins.path.parse(options.filePath).base); | 
					
						
							| 
									
										
										
										
											2016-06-05 06:20:05 +02:00
										 |  |  |         this.cleanTag = this.repo + ":" + this.version; | 
					
						
							| 
									
										
										
										
											2016-06-05 02:17:55 +02:00
										 |  |  |         if(options.filePath && options.read){ | 
					
						
							| 
									
										
										
										
											2016-06-05 04:19:54 +02:00
										 |  |  |             this.content = plugins.smartfile.local.toStringSync(plugins.path.resolve(options.filePath)); | 
					
						
							|  |  |  |         }; | 
					
						
							|  |  |  |         this.baseImage = dockerBaseImage(this.content); | 
					
						
							| 
									
										
										
										
											2016-06-05 01:31:21 +02:00
										 |  |  |     }; | 
					
						
							|  |  |  |     build(){ | 
					
						
							| 
									
										
										
										
											2016-06-05 05:16:14 +02:00
										 |  |  |         if(!this.buildTag){ | 
					
						
							|  |  |  |             let tag = dockerTag(this.repo,this.version); | 
					
						
							|  |  |  |             plugins.shelljs.exec("docker build -t " + tag + " -f " + this.filePath + " ."); | 
					
						
							|  |  |  |             this.buildTag = tag; | 
					
						
							|  |  |  |             NpmciEnv.dockerFilesBuilt.push(this); | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |             plugins.beautylog.error("This Dockerfile already has been built!"); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |          | 
					
						
							| 
									
										
										
										
											2016-06-05 01:31:21 +02:00
										 |  |  |     }; | 
					
						
							| 
									
										
										
										
											2016-06-05 02:17:55 +02:00
										 |  |  |     push(){ | 
					
						
							| 
									
										
										
										
											2016-06-05 04:45:46 +02:00
										 |  |  |         if(this.buildTag){ | 
					
						
							|  |  |  |             plugins.shelljs.exec("docker push " + this.buildTag); | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |             plugins.beautylog.error("Dockerfile hasn't been built yet!"); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2016-06-05 02:17:55 +02:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2016-06-05 01:31:21 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-05 04:19:54 +02:00
										 |  |  | let dockerFileVersion = function(dockerfileNameArg:string):string{ | 
					
						
							|  |  |  |     let versionString:string; | 
					
						
							|  |  |  |     let versionRegex = /Dockerfile_([a-zA-Z0-9\.]*)$/; | 
					
						
							|  |  |  |     let regexResultArray = versionRegex.exec(dockerfileNameArg); | 
					
						
							|  |  |  |     if(regexResultArray.length = 2){ | 
					
						
							|  |  |  |         versionString = regexResultArray[1];         | 
					
						
							| 
									
										
										
										
											2016-06-05 01:31:21 +02:00
										 |  |  |     } else { | 
					
						
							| 
									
										
										
										
											2016-06-05 04:19:54 +02:00
										 |  |  |         versionString = "latest"; | 
					
						
							| 
									
										
										
										
											2016-06-05 01:31:21 +02:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2016-06-05 04:19:54 +02:00
										 |  |  |     return versionString; | 
					
						
							| 
									
										
										
										
											2016-06-05 01:31:21 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-05 04:19:54 +02:00
										 |  |  | let dockerBaseImage = function(dockerfileContentArg:string){ | 
					
						
							|  |  |  |     let baseImageRegex = /FROM\s([a-zA-z0-9\/\-\:]*)\n/ | 
					
						
							|  |  |  |     let regexResultArray = baseImageRegex.exec(dockerfileContentArg) | 
					
						
							|  |  |  |     return regexResultArray[1]; | 
					
						
							| 
									
										
										
										
											2016-06-05 01:31:21 +02:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2016-06-05 01:22:04 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-05 04:45:46 +02:00
										 |  |  | export let dockerTag = function(repoArg:string,versionArg:string):string{ | 
					
						
							|  |  |  |     let tagString:string; | 
					
						
							|  |  |  |     let registry = NpmciEnv.dockerRegistry; | 
					
						
							| 
									
										
										
										
											2016-06-05 04:19:54 +02:00
										 |  |  |     if(process.env.CI_BUILD_STAGE == "test"){ | 
					
						
							| 
									
										
										
										
											2016-06-05 04:45:46 +02:00
										 |  |  |         registry = "registry.gitlab.com"; | 
					
						
							|  |  |  |     }  | 
					
						
							|  |  |  |     let repo = repoArg; | 
					
						
							|  |  |  |     let version = versionArg; | 
					
						
							|  |  |  |     if(process.env.CI_BUILD_STAGE == "test" || process.env.CI_BUILD_STAGE == "build"){ | 
					
						
							|  |  |  |         version = version + "_test"; | 
					
						
							| 
									
										
										
										
											2016-06-05 04:19:54 +02:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2016-06-05 04:45:46 +02:00
										 |  |  |     tagString = registry + "/" + repo + ":" + version; | 
					
						
							|  |  |  |     return tagString; | 
					
						
							| 
									
										
										
										
											2016-06-05 04:19:54 +02:00
										 |  |  | }; |