"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 sortDockerfiles = function () { var done = plugins.q.defer(); var redoSort; var sortCounter = 0; var sortFunction = function () { redoSort = false; var notYetBuiltImages = []; NpmciEnv.dockerFiles.forEach(function (dockerFileArg) { notYetBuiltImages.push(dockerFileArg.cleanTag); }); NpmciEnv.dockerFiles.sort(function (a, b) { plugins.beautylog.log("sort build order for Dockerimages"); var 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 && sortCounter <= 100) { sortCounter++; sortFunction(); } else { done.resolve(); } }; sortFunction(); 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 == "test") { registry = "registry.gitlab.com"; } var repo = repoArg; var version = versionArg; if (process.env.CI_BUILD_STAGE == "test" || process.env.CI_BUILD_STAGE == "build") { version = version + "_test"; } tagString = registry + "/" + repo + ":" + version; return tagString; }; //# sourceMappingURL=data:application/json;charset=utf8;base64,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LE9BQU8sQ0FBQyxDQUFBLENBQUM7UUFDOUUsT0FBTyxHQUFHLE9BQU8sR0FBRyxPQUFPLENBQUM7SUFDaEMsQ0FBQztJQUNELFNBQVMsR0FBRyxRQUFRLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsT0FBTyxDQUFDO0lBQ2xELE1BQU0sQ0FBQyxTQUFTLENBQUM7QUFDckIsQ0FBQyxDQUFDIiwiZmlsZSI6Im5wbWNpLmJ1aWxkLmRvY2tlci5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHBsdWdpbnMgZnJvbSBcIi4vbnBtY2kucGx1Z2luc1wiXG5pbXBvcnQgKiBhcyBOcG1jaUVudiBmcm9tIFwiLi9ucG1jaS5lbnZcIjtcblxuXG5leHBvcnQgbGV0IGJ1aWxkID0gZnVuY3Rpb24oKXtcbiAgICBsZXQgZG9uZSA9IHBsdWdpbnMucS5kZWZlcigpO1xuICAgIHBsdWdpbnMuZ3VscC5zcmMoXCIuL0RvY2tlcmZpbGUqXCIpXG4gICAgICAgIC5waXBlKHJlYWREb2NrZXJmaWxlcygpKVxuICAgICAgICAucGlwZShwbHVnaW5zLmd1bHBGdW5jdGlvbihmdW5jdGlvbigpe1xuICAgICAgICAgICAgc29ydERvY2tlcmZpbGVzKClcbiAgICAgICAgICAgICAgICAudGhlbihidWlsZERvY2tlcmZpbGVzKVxuICAgICAgICAgICAgICAgIC50aGVuKGRvbmUucmVzb2x2ZSk7XG4gICAgICAgIH0sXCJhdEVuZFwiKSk7XG4gICAgcmV0dXJuIGRvbmUucHJvbWlzZTtcbn1cblxubGV0IHJlYWREb2NrZXJmaWxlcyA9IGZ1bmN0aW9uKCl7XG4gICAgcmV0dXJuIHBsdWdpbnMudGhyb3VnaDIub2JqKGZ1bmN0aW9uKGZpbGUsZW5jLGNiKXtcbiAgICAgICAgbGV0IG15RG9ja2VyZmlsZSA9IG5ldyBEb2NrZXJmaWxlKHtcbiAgICAgICAgICAgIGZpbGVQYXRoOmZpbGUucGF0aCxcbiAgICAgICAgICAgIHJlYWQ6dHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgTnBtY2lFbnYuZG9ja2VyRmlsZXMucHVzaChcbiAgICAgICAgICAgIG15RG9ja2VyZmlsZVxuICAgICAgICApO1xuICAgICAgICBjYihudWxsLGZpbGUpO1xuICAgIH0pO1xufVxuXG5sZXQgc29ydERvY2tlcmZpbGVzID0gZnVuY3Rpb24oKXtcbiAgICBsZXQgZG9uZSA9IHBsdWdpbnMucS5kZWZlcigpO1xuICAgIGxldCByZWRvU29ydDpib29sZWFuO1xuICAgIGxldCBzb3J0Q291bnRlcjpudW1iZXIgPSAwO1xuICAgIGxldCBzb3J0RnVuY3Rpb24gPSBmdW5jdGlvbigpe1xuICAgICAgICByZWRvU29ydCA9IGZhbHNlO1xuICAgICAgICBsZXQgbm90WWV0QnVpbHRJbWFnZXM6c3RyaW5nW10gPSBbXTtcbiAgICAgICAgTnBtY2lFbnYuZG9ja2VyRmlsZXMuZm9yRWFjaCgoZG9ja2VyRmlsZUFyZyk9PntcbiAgICAgICAgICAgIG5vdFlldEJ1aWx0SW1hZ2VzLnB1c2goZG9ja2VyRmlsZUFyZy5jbGVhblRhZyk7XG4gICAgICAgIH0pO1xuICAgICAgICBOcG1jaUVudi5kb2NrZXJGaWxlcy5zb3J0KGZ1bmN0aW9uKGEsYil7XG4gICAgICAgICAgICBwbHVnaW5zLmJlYXV0eWxvZy5sb2coXCJzb3J0IGJ1aWxkIG9yZGVyIGZvciBEb2NrZXJpbWFnZXNcIik7XG4gICAgICAgICAgICBsZXQgYUluZGV4ID0gbm90WWV0QnVpbHRJbWFnZXMuaW5kZXhPZihhLmNsZWFuVGFnKTtcbiAgICAgICAgICAgIGlmKGFJbmRleCAhPSAtMSl7bm90WWV0QnVpbHRJbWFnZXMuc3BsaWNlKGFJbmRleCwxKX1cbiAgICAgICAgICAgIGlmKG5vdFlldEJ1aWx0SW1hZ2VzLmluZGV4T2YoYi5jbGVhblRhZykgIT0gLTEpe1xuICAgICAgICAgICAgICAgIHJlZG9Tb3J0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDBcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGlmKHJlZG9Tb3J0ICYmIHNvcnRDb3VudGVyIDw9IDEwMCl7XG4gICAgICAgICAgICBzb3J0Q291bnRlcisrO1xuICAgICAgICAgICAgc29ydEZ1bmN0aW9uKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkb25lLnJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgc29ydEZ1bmN0aW9uKCk7XG4gICAgcmV0dXJuIGRvbmUucHJvbWlzZTtcbn1cblxubGV0IGJ1aWxkRG9ja2VyZmlsZXMgPSBmdW5jdGlvbigpe1xuICAgIGxldCBkb25lID0gcGx1Z2lucy5xLmRlZmVyKCk7XG4gICAgTnBtY2lFbnYuZG9ja2VyRmlsZXMuZm9yRWFjaChmdW5jdGlvbihkb2NrZXJmaWxlQXJnKXtcbiAgICAgICAgZG9ja2VyZmlsZUFyZy5idWlsZCgpO1xuICAgIH0pXG4gICAgZG9uZS5yZXNvbHZlKCk7XG4gICAgcmV0dXJuIGRvbmUucHJvbWlzZTtcbn1cblxuZXhwb3J0IGNsYXNzIERvY2tlcmZpbGUge1xuICAgIGZpbGVQYXRoOnN0cmluZztcbiAgICByZXBvOnN0cmluZztcbiAgICB2ZXJzaW9uOnN0cmluZztcbiAgICBjbGVhblRhZzpzdHJpbmc7XG4gICAgYnVpbGRUYWc6c3RyaW5nO1xuICAgIGNvbnRlbnQ6c3RyaW5nO1xuICAgIGJhc2VJbWFnZTpzdHJpbmc7XG4gICAgY29uc3RydWN0b3Iob3B0aW9uczp7ZmlsZVBhdGg/OnN0cmluZyxmaWxlQ29udGVudHM/OnN0cmluZ3xCdWZmZXIscmVhZD86Ym9vbGVhbn0pe1xuICAgICAgICB0aGlzLmZpbGVQYXRoID0gb3B0aW9ucy5maWxlUGF0aDtcbiAgICAgICAgdGhpcy5yZXBvID0gTnBtY2lFbnYucmVwby51c2VyICsgXCIvXCIgKyBOcG1jaUVudi5yZXBvLnJlcG87XG4gICAgICAgIHRoaXMudmVyc2lvbiA9IGRvY2tlckZpbGVWZXJzaW9uKHBsdWdpbnMucGF0aC5wYXJzZShvcHRpb25zLmZpbGVQYXRoKS5iYXNlKTtcbiAgICAgICAgdGhpcy5jbGVhblRhZyA9IHRoaXMucmVwbyArIFwiOlwiICsgdGhpcy52ZXJzaW9uO1xuICAgICAgICBpZihvcHRpb25zLmZpbGVQYXRoICYmIG9wdGlvbnMucmVhZCl7XG4gICAgICAgICAgICB0aGlzLmNvbnRlbnQgPSBwbHVnaW5zLnNtYXJ0ZmlsZS5sb2NhbC50b1N0cmluZ1N5bmMocGx1Z2lucy5wYXRoLnJlc29sdmUob3B0aW9ucy5maWxlUGF0aCkpO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmJhc2VJbWFnZSA9IGRvY2tlckJhc2VJbWFnZSh0aGlzLmNvbnRlbnQpO1xuICAgIH07XG4gICAgYnVpbGQoKXtcbiAgICAgICAgaWYoIXRoaXMuYnVpbGRUYWcpe1xuICAgICAgICAgICAgbGV0IHRhZyA9IGRvY2tlclRhZyh0aGlzLnJlcG8sdGhpcy52ZXJzaW9uKTtcbiAgICAgICAgICAgIHBsdWdpbnMuc2hlbGxqcy5leGVjKFwiZG9ja2VyIGJ1aWxkIC10IFwiICsgdGFnICsgXCIgLWYgXCIgKyB0aGlzLmZpbGVQYXRoICsgXCIgLlwiKTtcbiAgICAgICAgICAgIHRoaXMuYnVpbGRUYWcgPSB0YWc7XG4gICAgICAgICAgICBOcG1jaUVudi5kb2NrZXJGaWxlc0J1aWx0LnB1c2godGhpcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwbHVnaW5zLmJlYXV0eWxvZy5lcnJvcihcIlRoaXMgRG9ja2VyZmlsZSBhbHJlYWR5IGhhcyBiZWVuIGJ1aWx0IVwiKTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICB9O1xuICAgIHB1c2goKXtcbiAgICAgICAgaWYodGhpcy5idWlsZFRhZyl7XG4gICAgICAgICAgICBwbHVnaW5zLnNoZWxsanMuZXhlYyhcImRvY2tlciBwdXNoIFwiICsgdGhpcy5idWlsZFRhZyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwbHVnaW5zLmJlYXV0eWxvZy5lcnJvcihcIkRvY2tlcmZpbGUgaGFzbid0IGJlZW4gYnVpbHQgeWV0IVwiKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxubGV0IGRvY2tlckZpbGVWZXJzaW9uID0gZnVuY3Rpb24oZG9ja2VyZmlsZU5hbWVBcmc6c3RyaW5nKTpzdHJpbmd7XG4gICAgbGV0IHZlcnNpb25TdHJpbmc6c3RyaW5nO1xuICAgIGxldCB2ZXJzaW9uUmVnZXggPSAvRG9ja2VyZmlsZV8oW2EtekEtWjAtOVxcLl0qKSQvO1xuICAgIGxldCByZWdleFJlc3VsdEFycmF5ID0gdmVyc2lvblJlZ2V4LmV4ZWMoZG9ja2VyZmlsZU5hbWVBcmcpO1xuICAgIGlmKHJlZ2V4UmVzdWx0QXJyYXkgJiYgcmVnZXhSZXN1bHRBcnJheS5sZW5ndGggPT0gMil7XG4gICAgICAgIHZlcnNpb25TdHJpbmcgPSByZWdleFJlc3VsdEFycmF5WzFdOyAgICAgICAgXG4gICAgfSBlbHNlIHtcbiAgICAgICAgdmVyc2lvblN0cmluZyA9IFwibGF0ZXN0XCI7XG4gICAgfVxuICAgIHJldHVybiB2ZXJzaW9uU3RyaW5nO1xufVxuXG5sZXQgZG9ja2VyQmFzZUltYWdlID0gZnVuY3Rpb24oZG9ja2VyZmlsZUNvbnRlbnRBcmc6c3RyaW5nKXtcbiAgICBsZXQgYmFzZUltYWdlUmVnZXggPSAvRlJPTVxccyhbYS16QS16MC05XFwvXFwtXFw6XSopXFxuL1xuICAgIGxldCByZWdleFJlc3VsdEFycmF5ID0gYmFzZUltYWdlUmVnZXguZXhlYyhkb2NrZXJmaWxlQ29udGVudEFyZylcbiAgICByZXR1cm4gcmVnZXhSZXN1bHRBcnJheVsxXTtcbn1cblxuZXhwb3J0IGxldCBkb2NrZXJUYWcgPSBmdW5jdGlvbihyZXBvQXJnOnN0cmluZyx2ZXJzaW9uQXJnOnN0cmluZyk6c3RyaW5ne1xuICAgIGxldCB0YWdTdHJpbmc6c3RyaW5nO1xuICAgIGxldCByZWdpc3RyeSA9IE5wbWNpRW52LmRvY2tlclJlZ2lzdHJ5O1xuICAgIGlmKHByb2Nlc3MuZW52LkNJX0JVSUxEX1NUQUdFID09IFwidGVzdFwiKXtcbiAgICAgICAgcmVnaXN0cnkgPSBcInJlZ2lzdHJ5LmdpdGxhYi5jb21cIjtcbiAgICB9IFxuICAgIGxldCByZXBvID0gcmVwb0FyZztcbiAgICBsZXQgdmVyc2lvbiA9IHZlcnNpb25Bcmc7XG4gICAgaWYocHJvY2Vzcy5lbnYuQ0lfQlVJTERfU1RBR0UgPT0gXCJ0ZXN0XCIgfHwgcHJvY2Vzcy5lbnYuQ0lfQlVJTERfU1RBR0UgPT0gXCJidWlsZFwiKXtcbiAgICAgICAgdmVyc2lvbiA9IHZlcnNpb24gKyBcIl90ZXN0XCI7XG4gICAgfVxuICAgIHRhZ1N0cmluZyA9IHJlZ2lzdHJ5ICsgXCIvXCIgKyByZXBvICsgXCI6XCIgKyB2ZXJzaW9uO1xuICAgIHJldHVybiB0YWdTdHJpbmc7XG59O1xuIl19