137 lines
		
	
	
		
			17 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			137 lines
		
	
	
		
			17 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| "use strict";
 | |
| var plugins = require("./npmci.plugins");
 | |
| var NpmciEnv = require("./npmci.env");
 | |
| exports.build = function () {
 | |
|     var done = plugins.q.defer();
 | |
|     plugins.gulp.src("./Dockerfile*")
 | |
|         .pipe(readDockerfiles())
 | |
|         .pipe(plugins.gulpFunction(function () {
 | |
|         sortDockerfiles()
 | |
|             .then(buildDockerfiles)
 | |
|             .then(done.resolve);
 | |
|     }, "atEnd"));
 | |
|     return done.promise;
 | |
| };
 | |
| var readDockerfiles = function () {
 | |
|     return plugins.through2.obj(function (file, enc, cb) {
 | |
|         var myDockerfile = new Dockerfile({
 | |
|             filePath: file.path,
 | |
|             read: true
 | |
|         });
 | |
|         NpmciEnv.dockerFiles.push(myDockerfile);
 | |
|         cb(null, file);
 | |
|     });
 | |
| };
 | |
| var cleanTagsArrayFunction = function () {
 | |
|     var cleanTagsArray = [];
 | |
|     NpmciEnv.dockerFiles.forEach(function (dockerfileArg) {
 | |
|         cleanTagsArray.push(dockerfileArg.cleanTag);
 | |
|     });
 | |
|     return cleanTagsArray;
 | |
| };
 | |
| var sortDockerfiles = function () {
 | |
|     var done = plugins.q.defer();
 | |
|     var sortableArray = NpmciEnv.dockerFiles;
 | |
|     var sortedArray = [];
 | |
|     var sorterFunctionCounter = 0;
 | |
|     var sorterFunction = function () {
 | |
|         var cleanTags = cleanTagsArrayFunction();
 | |
|         sortableArray.forEach(function (dockerfileArg) {
 | |
|             if (cleanTags.indexOf(dockerfileArg.baseImage) == -1) {
 | |
|                 var dockerfileArgIndex = sortableArray.indexOf(dockerfileArg);
 | |
|                 sortableArray.splice(dockerfileArgIndex);
 | |
|                 sortedArray.push(dockerfileArg);
 | |
|             }
 | |
|         });
 | |
|         if (sortableArray.length == 0) {
 | |
|             console.log(sortedArray);
 | |
|             NpmciEnv.dockerFiles = sortedArray;
 | |
|             done.resolve();
 | |
|         }
 | |
|         else if (sorterFunctionCounter < 100) {
 | |
|             sorterFunctionCounter++;
 | |
|             sorterFunction();
 | |
|         }
 | |
|         ;
 | |
|     };
 | |
|     sorterFunction();
 | |
|     return done.promise;
 | |
| };
 | |
| var buildDockerfiles = function () {
 | |
|     var done = plugins.q.defer();
 | |
|     NpmciEnv.dockerFiles.forEach(function (dockerfileArg) {
 | |
|         dockerfileArg.build();
 | |
|     });
 | |
|     done.resolve();
 | |
|     return done.promise;
 | |
| };
 | |
| var Dockerfile = (function () {
 | |
|     function Dockerfile(options) {
 | |
|         this.filePath = options.filePath;
 | |
|         this.repo = NpmciEnv.repo.user + "/" + NpmciEnv.repo.repo;
 | |
|         this.version = dockerFileVersion(plugins.path.parse(options.filePath).base);
 | |
|         this.cleanTag = this.repo + ":" + this.version;
 | |
|         if (options.filePath && options.read) {
 | |
|             this.content = plugins.smartfile.local.toStringSync(plugins.path.resolve(options.filePath));
 | |
|         }
 | |
|         ;
 | |
|         this.baseImage = dockerBaseImage(this.content);
 | |
|     }
 | |
|     ;
 | |
|     Dockerfile.prototype.build = function () {
 | |
|         if (!this.buildTag) {
 | |
|             var tag = exports.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!");
 | |
|         }
 | |
|     };
 | |
|     ;
 | |
|     Dockerfile.prototype.push = function () {
 | |
|         if (this.buildTag) {
 | |
|             plugins.shelljs.exec("docker push " + this.buildTag);
 | |
|         }
 | |
|         else {
 | |
|             plugins.beautylog.error("Dockerfile hasn't been built yet!");
 | |
|         }
 | |
|     };
 | |
|     return Dockerfile;
 | |
| }());
 | |
| exports.Dockerfile = Dockerfile;
 | |
| var dockerFileVersion = function (dockerfileNameArg) {
 | |
|     var versionString;
 | |
|     var versionRegex = /Dockerfile_([a-zA-Z0-9\.]*)$/;
 | |
|     var regexResultArray = versionRegex.exec(dockerfileNameArg);
 | |
|     if (regexResultArray && regexResultArray.length == 2) {
 | |
|         versionString = regexResultArray[1];
 | |
|     }
 | |
|     else {
 | |
|         versionString = "latest";
 | |
|     }
 | |
|     return versionString;
 | |
| };
 | |
| var dockerBaseImage = function (dockerfileContentArg) {
 | |
|     var baseImageRegex = /FROM\s([a-zA-z0-9\/\-\:]*)\n/;
 | |
|     var regexResultArray = baseImageRegex.exec(dockerfileContentArg);
 | |
|     return regexResultArray[1];
 | |
| };
 | |
| exports.dockerTag = function (repoArg, versionArg) {
 | |
|     var tagString;
 | |
|     var registry = NpmciEnv.dockerRegistry;
 | |
|     if (process.env.CI_BUILD_STAGE == "build" || process.env.CI_BUILD_STAGE == "test") {
 | |
|         registry = "registry.gitlab.com";
 | |
|     }
 | |
|     var repo = repoArg;
 | |
|     var version = versionArg;
 | |
|     if (process.env.CI_BUILD_STAGE == "build" || process.env.CI_BUILD_STAGE == "test") {
 | |
|         version = version + "_test";
 | |
|     }
 | |
|     tagString = registry + "/" + repo + ":" + version;
 | |
|     return tagString;
 | |
| };
 | |
| 
 | |
| //# sourceMappingURL=data:application/json;charset=utf8;base64,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Q0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGNBQWMsSUFBSSxPQUFPLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxjQUFjLElBQUksTUFBTSxDQUFDLENBQUEsQ0FBQztRQUM5RSxPQUFPLEdBQUcsT0FBTyxHQUFHLE9BQU8sQ0FBQztJQUNoQyxDQUFDO0lBQ0QsU0FBUyxHQUFHLFFBQVEsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxPQUFPLENBQUM7SUFDbEQsTUFBTSxDQUFDLFNBQVMsQ0FBQztBQUNyQixDQUFDLENBQUMiLCJmaWxlIjoibnBtY2kuYnVpbGQuZG9ja2VyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgcGx1Z2lucyBmcm9tIFwiLi9ucG1jaS5wbHVnaW5zXCJcbmltcG9ydCAqIGFzIE5wbWNpRW52IGZyb20gXCIuL25wbWNpLmVudlwiO1xuXG5cbmV4cG9ydCBsZXQgYnVpbGQgPSBmdW5jdGlvbigpe1xuICAgIGxldCBkb25lID0gcGx1Z2lucy5xLmRlZmVyKCk7XG4gICAgcGx1Z2lucy5ndWxwLnNyYyhcIi4vRG9ja2VyZmlsZSpcIilcbiAgICAgICAgLnBpcGUocmVhZERvY2tlcmZpbGVzKCkpXG4gICAgICAgIC5waXBlKHBsdWdpbnMuZ3VscEZ1bmN0aW9uKGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICBzb3J0RG9ja2VyZmlsZXMoKVxuICAgICAgICAgICAgICAgIC50aGVuKGJ1aWxkRG9ja2VyZmlsZXMpXG4gICAgICAgICAgICAgICAgLnRoZW4oZG9uZS5yZXNvbHZlKTtcbiAgICAgICAgfSxcImF0RW5kXCIpKTtcbiAgICByZXR1cm4gZG9uZS5wcm9taXNlO1xufVxuXG5sZXQgcmVhZERvY2tlcmZpbGVzID0gZnVuY3Rpb24oKXtcbiAgICByZXR1cm4gcGx1Z2lucy50aHJvdWdoMi5vYmooZnVuY3Rpb24oZmlsZSxlbmMsY2Ipe1xuICAgICAgICBsZXQgbXlEb2NrZXJmaWxlID0gbmV3IERvY2tlcmZpbGUoe1xuICAgICAgICAgICAgZmlsZVBhdGg6ZmlsZS5wYXRoLFxuICAgICAgICAgICAgcmVhZDp0cnVlXG4gICAgICAgIH0pO1xuICAgICAgICBOcG1jaUVudi5kb2NrZXJGaWxlcy5wdXNoKFxuICAgICAgICAgICAgbXlEb2NrZXJmaWxlXG4gICAgICAgICk7XG4gICAgICAgIGNiKG51bGwsZmlsZSk7XG4gICAgfSk7XG59XG5cbmxldCBjbGVhblRhZ3NBcnJheUZ1bmN0aW9uID0gZnVuY3Rpb24oKXtcbiAgICBsZXQgY2xlYW5UYWdzQXJyYXkgPSBbXTtcbiAgICBOcG1jaUVudi5kb2NrZXJGaWxlcy5mb3JFYWNoKGZ1bmN0aW9uKGRvY2tlcmZpbGVBcmcpe1xuICAgICAgICBjbGVhblRhZ3NBcnJheS5wdXNoKGRvY2tlcmZpbGVBcmcuY2xlYW5UYWcpO1xuICAgIH0pO1xuICAgIHJldHVybiBjbGVhblRhZ3NBcnJheTtcbn1cblxubGV0IHNvcnREb2NrZXJmaWxlcyA9IGZ1bmN0aW9uKCl7XG4gICAgbGV0IGRvbmUgPSBwbHVnaW5zLnEuZGVmZXIoKTtcbiAgICBsZXQgc29ydGFibGVBcnJheSA9IE5wbWNpRW52LmRvY2tlckZpbGVzO1xuICAgIGxldCBzb3J0ZWRBcnJheTpEb2NrZXJmaWxlW10gPSBbXTsgXG4gICAgbGV0IHNvcnRlckZ1bmN0aW9uQ291bnRlcjpudW1iZXIgPSAwO1xuICAgIGxldCBzb3J0ZXJGdW5jdGlvbiA9IGZ1bmN0aW9uKCl7XG4gICAgICAgIGxldCBjbGVhblRhZ3MgPSBjbGVhblRhZ3NBcnJheUZ1bmN0aW9uKCk7XG4gICAgICAgIHNvcnRhYmxlQXJyYXkuZm9yRWFjaCgoZG9ja2VyZmlsZUFyZyk9PntcbiAgICAgICAgICAgIGlmKGNsZWFuVGFncy5pbmRleE9mKGRvY2tlcmZpbGVBcmcuYmFzZUltYWdlKSA9PSAtMSl7XG4gICAgICAgICAgICAgICAgbGV0IGRvY2tlcmZpbGVBcmdJbmRleCA9IHNvcnRhYmxlQXJyYXkuaW5kZXhPZihkb2NrZXJmaWxlQXJnKTtcbiAgICAgICAgICAgICAgICBzb3J0YWJsZUFycmF5LnNwbGljZShkb2NrZXJmaWxlQXJnSW5kZXgpO1xuICAgICAgICAgICAgICAgIHNvcnRlZEFycmF5LnB1c2goZG9ja2VyZmlsZUFyZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBpZihzb3J0YWJsZUFycmF5Lmxlbmd0aCA9PSAwKXtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKHNvcnRlZEFycmF5KTtcbiAgICAgICAgICAgIE5wbWNpRW52LmRvY2tlckZpbGVzID0gc29ydGVkQXJyYXk7XG4gICAgICAgICAgICBkb25lLnJlc29sdmUoKTtcbiAgICAgICAgfSBlbHNlIGlmIChzb3J0ZXJGdW5jdGlvbkNvdW50ZXIgPCAxMDApIHtcbiAgICAgICAgICAgIHNvcnRlckZ1bmN0aW9uQ291bnRlcisrO1xuICAgICAgICAgICAgc29ydGVyRnVuY3Rpb24oKTtcbiAgICAgICAgfTtcbiAgICB9XG4gICAgc29ydGVyRnVuY3Rpb24oKTtcbiAgICByZXR1cm4gZG9uZS5wcm9taXNlO1xufVxuXG5sZXQgYnVpbGREb2NrZXJmaWxlcyA9IGZ1bmN0aW9uKCl7XG4gICAgbGV0IGRvbmUgPSBwbHVnaW5zLnEuZGVmZXIoKTtcbiAgICBOcG1jaUVudi5kb2NrZXJGaWxlcy5mb3JFYWNoKGZ1bmN0aW9uKGRvY2tlcmZpbGVBcmcpe1xuICAgICAgICBkb2NrZXJmaWxlQXJnLmJ1aWxkKCk7XG4gICAgfSlcbiAgICBkb25lLnJlc29sdmUoKTtcbiAgICByZXR1cm4gZG9uZS5wcm9taXNlO1xufVxuXG5leHBvcnQgY2xhc3MgRG9ja2VyZmlsZSB7XG4gICAgZmlsZVBhdGg6c3RyaW5nO1xuICAgIHJlcG86c3RyaW5nO1xuICAgIHZlcnNpb246c3RyaW5nO1xuICAgIGNsZWFuVGFnOnN0cmluZztcbiAgICBidWlsZFRhZzpzdHJpbmc7XG4gICAgY29udGVudDpzdHJpbmc7XG4gICAgYmFzZUltYWdlOnN0cmluZztcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zOntmaWxlUGF0aD86c3RyaW5nLGZpbGVDb250ZW50cz86c3RyaW5nfEJ1ZmZlcixyZWFkPzpib29sZWFufSl7XG4gICAgICAgIHRoaXMuZmlsZVBhdGggPSBvcHRpb25zLmZpbGVQYXRoO1xuICAgICAgICB0aGlzLnJlcG8gPSBOcG1jaUVudi5yZXBvLnVzZXIgKyBcIi9cIiArIE5wbWNpRW52LnJlcG8ucmVwbztcbiAgICAgICAgdGhpcy52ZXJzaW9uID0gZG9ja2VyRmlsZVZlcnNpb24ocGx1Z2lucy5wYXRoLnBhcnNlKG9wdGlvbnMuZmlsZVBhdGgpLmJhc2UpO1xuICAgICAgICB0aGlzLmNsZWFuVGFnID0gdGhpcy5yZXBvICsgXCI6XCIgKyB0aGlzLnZlcnNpb247XG4gICAgICAgIGlmKG9wdGlvbnMuZmlsZVBhdGggJiYgb3B0aW9ucy5yZWFkKXtcbiAgICAgICAgICAgIHRoaXMuY29udGVudCA9IHBsdWdpbnMuc21hcnRmaWxlLmxvY2FsLnRvU3RyaW5nU3luYyhwbHVnaW5zLnBhdGgucmVzb2x2ZShvcHRpb25zLmZpbGVQYXRoKSk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuYmFzZUltYWdlID0gZG9ja2VyQmFzZUltYWdlKHRoaXMuY29udGVudCk7XG4gICAgfTtcbiAgICBidWlsZCgpe1xuICAgICAgICBpZighdGhpcy5idWlsZFRhZyl7XG4gICAgICAgICAgICBsZXQgdGFnID0gZG9ja2VyVGFnKHRoaXMucmVwbyx0aGlzLnZlcnNpb24pO1xuICAgICAgICAgICAgcGx1Z2lucy5zaGVsbGpzLmV4ZWMoXCJkb2NrZXIgYnVpbGQgLXQgXCIgKyB0YWcgKyBcIiAtZiBcIiArIHRoaXMuZmlsZVBhdGggKyBcIiAuXCIpO1xuICAgICAgICAgICAgdGhpcy5idWlsZFRhZyA9IHRhZztcbiAgICAgICAgICAgIE5wbWNpRW52LmRvY2tlckZpbGVzQnVpbHQucHVzaCh0aGlzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBsdWdpbnMuYmVhdXR5bG9nLmVycm9yKFwiVGhpcyBEb2NrZXJmaWxlIGFscmVhZHkgaGFzIGJlZW4gYnVpbHQhXCIpO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgIH07XG4gICAgcHVzaCgpe1xuICAgICAgICBpZih0aGlzLmJ1aWxkVGFnKXtcbiAgICAgICAgICAgIHBsdWdpbnMuc2hlbGxqcy5leGVjKFwiZG9ja2VyIHB1c2ggXCIgKyB0aGlzLmJ1aWxkVGFnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBsdWdpbnMuYmVhdXR5bG9nLmVycm9yKFwiRG9ja2VyZmlsZSBoYXNuJ3QgYmVlbiBidWlsdCB5ZXQhXCIpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5sZXQgZG9ja2VyRmlsZVZlcnNpb24gPSBmdW5jdGlvbihkb2NrZXJmaWxlTmFtZUFyZzpzdHJpbmcpOnN0cmluZ3tcbiAgICBsZXQgdmVyc2lvblN0cmluZzpzdHJpbmc7XG4gICAgbGV0IHZlcnNpb25SZWdleCA9IC9Eb2NrZXJmaWxlXyhbYS16QS1aMC05XFwuXSopJC87XG4gICAgbGV0IHJlZ2V4UmVzdWx0QXJyYXkgPSB2ZXJzaW9uUmVnZXguZXhlYyhkb2NrZXJmaWxlTmFtZUFyZyk7XG4gICAgaWYocmVnZXhSZXN1bHRBcnJheSAmJiByZWdleFJlc3VsdEFycmF5Lmxlbmd0aCA9PSAyKXtcbiAgICAgICAgdmVyc2lvblN0cmluZyA9IHJlZ2V4UmVzdWx0QXJyYXlbMV07ICAgICAgICBcbiAgICB9IGVsc2Uge1xuICAgICAgICB2ZXJzaW9uU3RyaW5nID0gXCJsYXRlc3RcIjtcbiAgICB9XG4gICAgcmV0dXJuIHZlcnNpb25TdHJpbmc7XG59XG5cbmxldCBkb2NrZXJCYXNlSW1hZ2UgPSBmdW5jdGlvbihkb2NrZXJmaWxlQ29udGVudEFyZzpzdHJpbmcpe1xuICAgIGxldCBiYXNlSW1hZ2VSZWdleCA9IC9GUk9NXFxzKFthLXpBLXowLTlcXC9cXC1cXDpdKilcXG4vXG4gICAgbGV0IHJlZ2V4UmVzdWx0QXJyYXkgPSBiYXNlSW1hZ2VSZWdleC5leGVjKGRvY2tlcmZpbGVDb250ZW50QXJnKVxuICAgIHJldHVybiByZWdleFJlc3VsdEFycmF5WzFdO1xufVxuXG5leHBvcnQgbGV0IGRvY2tlclRhZyA9IGZ1bmN0aW9uKHJlcG9Bcmc6c3RyaW5nLHZlcnNpb25Bcmc6c3RyaW5nKTpzdHJpbmd7XG4gICAgbGV0IHRhZ1N0cmluZzpzdHJpbmc7XG4gICAgbGV0IHJlZ2lzdHJ5ID0gTnBtY2lFbnYuZG9ja2VyUmVnaXN0cnk7XG4gICAgaWYocHJvY2Vzcy5lbnYuQ0lfQlVJTERfU1RBR0UgPT0gXCJidWlsZFwiICB8fCBwcm9jZXNzLmVudi5DSV9CVUlMRF9TVEFHRSA9PSBcInRlc3RcIil7XG4gICAgICAgIHJlZ2lzdHJ5ID0gXCJyZWdpc3RyeS5naXRsYWIuY29tXCI7XG4gICAgfSBcbiAgICBsZXQgcmVwbyA9IHJlcG9Bcmc7XG4gICAgbGV0IHZlcnNpb24gPSB2ZXJzaW9uQXJnO1xuICAgIGlmKHByb2Nlc3MuZW52LkNJX0JVSUxEX1NUQUdFID09IFwiYnVpbGRcIiB8fCBwcm9jZXNzLmVudi5DSV9CVUlMRF9TVEFHRSA9PSBcInRlc3RcIil7XG4gICAgICAgIHZlcnNpb24gPSB2ZXJzaW9uICsgXCJfdGVzdFwiO1xuICAgIH1cbiAgICB0YWdTdHJpbmcgPSByZWdpc3RyeSArIFwiL1wiICsgcmVwbyArIFwiOlwiICsgdmVyc2lvbjtcbiAgICByZXR1cm4gdGFnU3RyaW5nO1xufTtcbiJdfQ==
 |