import * as plugins from "./npmci.plugins" import * as NpmciEnv from "./npmci.env"; export let build = function(){ let done = plugins.q.defer();; plugins.gulp.dest("./Dockerfile*") .pipe(readDockerfiles) .pipe(plugins.gulpFunction(done.resolve,"atEnd")); return done.promise; } let readDockerfiles = function(){ return function(file,enc,cb){ let myDockerfile = new Dockerfile({ filePath:file.path, read:true }); NpmciEnv.dockerFiles.push( myDockerfile ); file["Dockerfile"] = myDockerfile; cb(null,file); }; } let buildDockerfiles = function(){ return function(file,enc,cb){ file.myDockerfile.build(); cb(); } } export class Dockerfile { filePath:string; buildTag:string; repo:string; version:string; content:string; baseImage:string; constructor(options:{filePath?:string,fileContents?:string|Buffer,read?:boolean}){ this.filePath = options.filePath; this.repo = NpmciEnv.repo.user + "/" + NpmciEnv.repo.repo; this.version = dockerFileVersion(plugins.path.parse(options.filePath).base); if(options.filePath && options.read){ this.content = plugins.smartfile.local.toStringSync(plugins.path.resolve(options.filePath)); }; this.baseImage = dockerBaseImage(this.content); }; build(){ 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!"); } }; push(){ if(this.buildTag){ plugins.shelljs.exec("docker push " + this.buildTag); } else { plugins.beautylog.error("Dockerfile hasn't been built yet!"); } } } 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]; } else { versionString = "latest"; } return versionString; } let dockerBaseImage = function(dockerfileContentArg:string){ let baseImageRegex = /FROM\s([a-zA-z0-9\/\-\:]*)\n/ let regexResultArray = baseImageRegex.exec(dockerfileContentArg) return regexResultArray[1]; } export let dockerTag = function(repoArg:string,versionArg:string):string{ let tagString:string; let registry = NpmciEnv.dockerRegistry; if(process.env.CI_BUILD_STAGE == "test"){ 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"; } tagString = registry + "/" + repo + ":" + version; return tagString; };