mirror of
https://github.com/caprover/caprover
synced 2026-09-24 07:35:36 +00:00
split template helper into templatehelper and version printer
This commit is contained in:
@@ -1,95 +1,29 @@
|
||||
"use strict";
|
||||
const request = require("request");
|
||||
const fs = require("fs-extra");
|
||||
const ApiStatusCodes = require("../api/ApiStatusCodes");
|
||||
const Logger = require("../utils/Logger");
|
||||
const CaptainConstants = require("../utils/CaptainConstants");
|
||||
function getTagsForImage(imageBaseName, url, allTags) {
|
||||
if (!url) {
|
||||
url =
|
||||
'https://hub.docker.com/v2/repositories/' + imageBaseName + '/tags';
|
||||
}
|
||||
return new Promise(function (resolve, reject) {
|
||||
request(url, function (error, response, body) {
|
||||
if (error || !body) {
|
||||
Logger.e(error);
|
||||
reject(error);
|
||||
return;
|
||||
}
|
||||
try {
|
||||
// Sometimes Docker server is down and it crashes Captain!
|
||||
body = JSON.parse(body);
|
||||
}
|
||||
catch (e) {
|
||||
Logger.e(e);
|
||||
}
|
||||
let results;
|
||||
if (body) {
|
||||
results = body.results;
|
||||
}
|
||||
if (!results) {
|
||||
Logger.e('NO RESULT');
|
||||
reject(new Error('NO RESULT'));
|
||||
return;
|
||||
}
|
||||
if (!allTags) {
|
||||
allTags = [];
|
||||
}
|
||||
for (let idx = 0; idx < results.length; idx++) {
|
||||
allTags.push(results[idx].name);
|
||||
}
|
||||
if (body.next) {
|
||||
resolve(getTagsForImage(imageBaseName, body.next, allTags));
|
||||
return;
|
||||
}
|
||||
resolve(allTags);
|
||||
});
|
||||
});
|
||||
}
|
||||
function firstEndsWithSecond(str1, str2) {
|
||||
if (!str1 || !str2) {
|
||||
throw new Error('Str1 or Str2 are null ' + !str1 + ' ' + !str2);
|
||||
}
|
||||
const idx = str1.indexOf(str2);
|
||||
return idx >= 0 && idx + str2.length === str1.length;
|
||||
}
|
||||
function isEmpty(obj) {
|
||||
for (const key in obj) {
|
||||
if (obj.hasOwnProperty(key)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
const TemplateHelperVersionPrinter = require("./TemplateHelperVersionPrinter");
|
||||
class TemplateHelper {
|
||||
constructor() {
|
||||
const templates = [
|
||||
{
|
||||
templateName: 'node',
|
||||
dockerHubImageName: 'library/node',
|
||||
dockerFileFromName: 'node',
|
||||
displayName: 'NodeJS',
|
||||
tagSuffix: '-alpine',
|
||||
},
|
||||
{
|
||||
templateName: 'php',
|
||||
dockerHubImageName: 'library/php',
|
||||
dockerFileFromName: 'php',
|
||||
displayName: 'PHP',
|
||||
tagSuffix: '-apache',
|
||||
},
|
||||
{
|
||||
templateName: 'python-django',
|
||||
dockerHubImageName: 'library/python',
|
||||
dockerFileFromName: 'python-django',
|
||||
displayName: 'Python Django',
|
||||
tagSuffix: '-alpine3.6',
|
||||
},
|
||||
{
|
||||
templateName: 'ruby-rack',
|
||||
dockerHubImageName: 'library/ruby',
|
||||
dockerFileFromName: 'ruby-rack',
|
||||
displayName: 'Ruby Rack',
|
||||
tagSuffix: '-alpine3.7',
|
||||
},
|
||||
];
|
||||
@@ -98,60 +32,8 @@ class TemplateHelper {
|
||||
templates[i].postFromLines = fs.readFileSync(dockerfilesRoot + templates[i].templateName, 'utf8');
|
||||
}
|
||||
this.templates = templates;
|
||||
this.cachedImageTags = {};
|
||||
if (CaptainConstants.isDebug) {
|
||||
this.printAvailableImageTagsForReadme();
|
||||
}
|
||||
}
|
||||
getDockerVersionsForTemplateName(templateName) {
|
||||
const self = this;
|
||||
const templateObj = self.getTemplateFromTemplateName(templateName);
|
||||
if (isEmpty(this.cachedImageTags)) {
|
||||
throw ApiStatusCodes.createError(ApiStatusCodes.STATUS_ERROR_GENERIC, 'Please wait about 30 seconds, then try again.');
|
||||
}
|
||||
const tags = self.cachedImageTags[templateObj.dockerHubImageName];
|
||||
const dockerVersions = [];
|
||||
for (let i = 0; i < tags.length; i++) {
|
||||
const t = tags[i];
|
||||
if (firstEndsWithSecond(t, templateObj.tagSuffix)) {
|
||||
dockerVersions.push(t.substring(0, t.length - templateObj.tagSuffix.length));
|
||||
}
|
||||
}
|
||||
return dockerVersions;
|
||||
}
|
||||
printAvailableImageTagsForReadme() {
|
||||
const self = this;
|
||||
self.cachedImageTags = {};
|
||||
const tempCache = {};
|
||||
for (let i = 0; i < self.templates.length; i++) {
|
||||
const currentImageName = self.templates[i].dockerHubImageName;
|
||||
getTagsForImage(currentImageName, undefined, undefined)
|
||||
.then(function (tags) {
|
||||
tempCache[currentImageName] = tags;
|
||||
let isAllDone = true;
|
||||
for (let j = 0; j < self.templates.length; j++) {
|
||||
const imageName = self.templates[j].dockerHubImageName;
|
||||
if (!tempCache[imageName]) {
|
||||
isAllDone = false;
|
||||
}
|
||||
}
|
||||
if (isAllDone) {
|
||||
Logger.d('Template Cache Updated!');
|
||||
self.cachedImageTags = tempCache;
|
||||
// Used for README
|
||||
for (let tempIdx = 0; tempIdx < self.templates.length; tempIdx++) {
|
||||
Logger.d(' ');
|
||||
Logger.d(self.templates[tempIdx].templateName + '/');
|
||||
Logger.d(self
|
||||
.getDockerVersionsForTemplateName(self.templates[tempIdx].templateName)
|
||||
.join(', '));
|
||||
Logger.d(' ');
|
||||
}
|
||||
}
|
||||
})
|
||||
.catch(function (error) {
|
||||
Logger.e(error);
|
||||
});
|
||||
new TemplateHelperVersionPrinter().printAvailableImageTagsForReadme(this.templates);
|
||||
}
|
||||
}
|
||||
getTemplateFromTemplateName(templateName) {
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1,118 @@
|
||||
"use strict";
|
||||
const request = require("request");
|
||||
const ApiStatusCodes = require("../api/ApiStatusCodes");
|
||||
const Logger = require("../utils/Logger");
|
||||
function getTagsForImage(imageBaseName, url, allTags) {
|
||||
if (!url) {
|
||||
url =
|
||||
'https://hub.docker.com/v2/repositories/' + imageBaseName + '/tags';
|
||||
}
|
||||
return new Promise(function (resolve, reject) {
|
||||
request(url, function (error, response, body) {
|
||||
if (error || !body) {
|
||||
Logger.e(error);
|
||||
reject(error);
|
||||
return;
|
||||
}
|
||||
try {
|
||||
// Sometimes Docker server is down and it crashes Captain!
|
||||
body = JSON.parse(body);
|
||||
}
|
||||
catch (e) {
|
||||
Logger.e(e);
|
||||
}
|
||||
let results;
|
||||
if (body) {
|
||||
results = body.results;
|
||||
}
|
||||
if (!results) {
|
||||
Logger.e('NO RESULT');
|
||||
reject(new Error('NO RESULT'));
|
||||
return;
|
||||
}
|
||||
if (!allTags) {
|
||||
allTags = [];
|
||||
}
|
||||
for (let idx = 0; idx < results.length; idx++) {
|
||||
allTags.push(results[idx].name);
|
||||
}
|
||||
if (body.next) {
|
||||
resolve(getTagsForImage(imageBaseName, body.next, allTags));
|
||||
return;
|
||||
}
|
||||
resolve(allTags);
|
||||
});
|
||||
});
|
||||
}
|
||||
function firstEndsWithSecond(str1, str2) {
|
||||
if (!str1 || !str2) {
|
||||
throw new Error('Str1 or Str2 are null ' + !str1 + ' ' + !str2);
|
||||
}
|
||||
const idx = str1.indexOf(str2);
|
||||
return idx >= 0 && idx + str2.length === str1.length;
|
||||
}
|
||||
function isEmpty(obj) {
|
||||
for (const key in obj) {
|
||||
if (obj.hasOwnProperty(key)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
class TemplateHelperVersionPrinter {
|
||||
constructor() {
|
||||
this.cachedImageTags = {};
|
||||
}
|
||||
getDockerVersionsForTemplateName(templateObj) {
|
||||
const self = this;
|
||||
if (isEmpty(this.cachedImageTags)) {
|
||||
throw ApiStatusCodes.createError(ApiStatusCodes.STATUS_ERROR_GENERIC, 'Please wait about 30 seconds, then try again.');
|
||||
}
|
||||
const tags = self.cachedImageTags[templateObj.dockerHubImageName];
|
||||
const dockerVersions = [];
|
||||
for (let i = 0; i < tags.length; i++) {
|
||||
const t = tags[i];
|
||||
if (firstEndsWithSecond(t, templateObj.tagSuffix)) {
|
||||
dockerVersions.push(t.substring(0, t.length - templateObj.tagSuffix.length));
|
||||
}
|
||||
}
|
||||
return dockerVersions;
|
||||
}
|
||||
printAvailableImageTagsForReadme(templates) {
|
||||
const self = this;
|
||||
self.cachedImageTags = {};
|
||||
const tempCache = {};
|
||||
for (let i = 0; i < templates.length; i++) {
|
||||
const currentImageName = templates[i].dockerHubImageName;
|
||||
getTagsForImage(currentImageName, undefined, undefined)
|
||||
.then(function (tags) {
|
||||
tempCache[currentImageName] = tags;
|
||||
let isAllDone = true;
|
||||
for (let j = 0; j < templates.length; j++) {
|
||||
const imageName = templates[j].dockerHubImageName;
|
||||
if (!tempCache[imageName]) {
|
||||
isAllDone = false;
|
||||
}
|
||||
}
|
||||
if (isAllDone) {
|
||||
Logger.d('Template Cache Updated!');
|
||||
self.cachedImageTags = tempCache;
|
||||
// Used for README
|
||||
for (let tempIdx = 0; tempIdx < templates.length; tempIdx++) {
|
||||
Logger.d(' ');
|
||||
Logger.d(templates[tempIdx].templateName + '/');
|
||||
Logger.d(self
|
||||
.getDockerVersionsForTemplateName(templates[tempIdx])
|
||||
.join(', '));
|
||||
Logger.d(' ');
|
||||
}
|
||||
}
|
||||
})
|
||||
.catch(function (error) {
|
||||
Logger.e(error);
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
module.exports = TemplateHelperVersionPrinter;
|
||||
//# sourceMappingURL=TemplateHelperVersionPrinter.js.map
|
||||
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"TemplateHelperVersionPrinter.js","sourceRoot":"","sources":["../../src/user/TemplateHelperVersionPrinter.ts"],"names":[],"mappings":"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"}
|
||||
@@ -16,3 +16,10 @@ export interface IDockerContainerResource {
|
||||
Limits?: { NanoCPUs?: number; MemoryBytes?: number }
|
||||
Reservation?: { NanoCPUs?: number; MemoryBytes?: number }
|
||||
}
|
||||
|
||||
export interface ITemplate {
|
||||
templateName: string
|
||||
dockerHubImageName: string
|
||||
tagSuffix: string
|
||||
postFromLines?: string
|
||||
}
|
||||
@@ -3,126 +3,32 @@ import fs = require('fs-extra')
|
||||
import ApiStatusCodes = require('../api/ApiStatusCodes')
|
||||
import Logger = require('../utils/Logger')
|
||||
import CaptainConstants = require('../utils/CaptainConstants')
|
||||
|
||||
function getTagsForImage(
|
||||
imageBaseName: string,
|
||||
url: string | undefined,
|
||||
allTags: string[] | undefined
|
||||
): Promise<string[]> {
|
||||
if (!url) {
|
||||
url =
|
||||
'https://hub.docker.com/v2/repositories/' + imageBaseName + '/tags'
|
||||
}
|
||||
|
||||
return new Promise<string[]>(function(resolve, reject) {
|
||||
request(
|
||||
url!,
|
||||
|
||||
function(error, response, body) {
|
||||
if (error || !body) {
|
||||
Logger.e(error)
|
||||
reject(error)
|
||||
return
|
||||
}
|
||||
|
||||
try {
|
||||
// Sometimes Docker server is down and it crashes Captain!
|
||||
body = JSON.parse(body)
|
||||
} catch (e) {
|
||||
Logger.e(e)
|
||||
}
|
||||
|
||||
let results: any
|
||||
|
||||
if (body) {
|
||||
results = body.results
|
||||
}
|
||||
|
||||
if (!results) {
|
||||
Logger.e('NO RESULT')
|
||||
reject(new Error('NO RESULT'))
|
||||
return
|
||||
}
|
||||
|
||||
if (!allTags) {
|
||||
allTags = []
|
||||
}
|
||||
|
||||
for (let idx = 0; idx < results.length; idx++) {
|
||||
allTags.push(results[idx].name)
|
||||
}
|
||||
|
||||
if (body.next) {
|
||||
resolve(getTagsForImage(imageBaseName, body.next, allTags))
|
||||
return
|
||||
}
|
||||
|
||||
resolve(allTags)
|
||||
}
|
||||
)
|
||||
})
|
||||
}
|
||||
|
||||
function firstEndsWithSecond(str1: string, str2: string) {
|
||||
if (!str1 || !str2) {
|
||||
throw new Error('Str1 or Str2 are null ' + !str1 + ' ' + !str2)
|
||||
}
|
||||
const idx = str1.indexOf(str2)
|
||||
return idx >= 0 && idx + str2.length === str1.length
|
||||
}
|
||||
|
||||
function isEmpty(obj: any) {
|
||||
for (const key in obj) {
|
||||
if (obj.hasOwnProperty(key)) {
|
||||
return false
|
||||
}
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
interface ITemplate {
|
||||
templateName: string
|
||||
dockerHubImageName: string
|
||||
dockerFileFromName: string
|
||||
displayName: string
|
||||
tagSuffix: string
|
||||
postFromLines?: string
|
||||
}
|
||||
|
||||
type AnyHashMap = IHashMapGeneric<any>
|
||||
import { ITemplate } from '../models/OtherTypes'
|
||||
import TemplateHelperVersionPrinter = require('./TemplateHelperVersionPrinter')
|
||||
|
||||
class TemplateHelper {
|
||||
private templates: ITemplate[]
|
||||
private cachedImageTags: AnyHashMap
|
||||
|
||||
constructor() {
|
||||
const templates: ITemplate[] = [
|
||||
{
|
||||
templateName: 'node',
|
||||
dockerHubImageName: 'library/node',
|
||||
dockerFileFromName: 'node',
|
||||
displayName: 'NodeJS',
|
||||
tagSuffix: '-alpine',
|
||||
},
|
||||
{
|
||||
templateName: 'php',
|
||||
dockerHubImageName: 'library/php',
|
||||
dockerFileFromName: 'php',
|
||||
displayName: 'PHP',
|
||||
tagSuffix: '-apache',
|
||||
},
|
||||
{
|
||||
templateName: 'python-django',
|
||||
dockerHubImageName: 'library/python',
|
||||
dockerFileFromName: 'python-django',
|
||||
displayName: 'Python Django',
|
||||
tagSuffix: '-alpine3.6',
|
||||
},
|
||||
{
|
||||
templateName: 'ruby-rack',
|
||||
dockerHubImageName: 'library/ruby',
|
||||
dockerFileFromName: 'ruby-rack',
|
||||
displayName: 'Ruby Rack',
|
||||
tagSuffix: '-alpine3.7',
|
||||
},
|
||||
]
|
||||
@@ -137,89 +43,12 @@ class TemplateHelper {
|
||||
}
|
||||
|
||||
this.templates = templates
|
||||
this.cachedImageTags = {}
|
||||
|
||||
if (CaptainConstants.isDebug) {
|
||||
this.printAvailableImageTagsForReadme()
|
||||
}
|
||||
}
|
||||
|
||||
getDockerVersionsForTemplateName(templateName: string) {
|
||||
const self = this
|
||||
|
||||
const templateObj = self.getTemplateFromTemplateName(templateName)
|
||||
|
||||
if (isEmpty(this.cachedImageTags)) {
|
||||
throw ApiStatusCodes.createError(
|
||||
ApiStatusCodes.STATUS_ERROR_GENERIC,
|
||||
'Please wait about 30 seconds, then try again.'
|
||||
new TemplateHelperVersionPrinter().printAvailableImageTagsForReadme(
|
||||
this.templates
|
||||
)
|
||||
}
|
||||
|
||||
const tags = self.cachedImageTags[templateObj.dockerHubImageName]
|
||||
|
||||
const dockerVersions = []
|
||||
for (let i = 0; i < tags.length; i++) {
|
||||
const t = tags[i]
|
||||
if (firstEndsWithSecond(t, templateObj.tagSuffix)) {
|
||||
dockerVersions.push(
|
||||
t.substring(0, t.length - templateObj.tagSuffix.length)
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
return dockerVersions
|
||||
}
|
||||
|
||||
printAvailableImageTagsForReadme() {
|
||||
const self = this
|
||||
self.cachedImageTags = {}
|
||||
|
||||
const tempCache: AnyHashMap = {}
|
||||
for (let i = 0; i < self.templates.length; i++) {
|
||||
const currentImageName = self.templates[i].dockerHubImageName
|
||||
|
||||
getTagsForImage(currentImageName, undefined, undefined)
|
||||
.then(function(tags) {
|
||||
tempCache[currentImageName] = tags
|
||||
|
||||
let isAllDone = true
|
||||
|
||||
for (let j = 0; j < self.templates.length; j++) {
|
||||
const imageName = self.templates[j].dockerHubImageName
|
||||
if (!tempCache[imageName]) {
|
||||
isAllDone = false
|
||||
}
|
||||
}
|
||||
|
||||
if (isAllDone) {
|
||||
Logger.d('Template Cache Updated!')
|
||||
|
||||
self.cachedImageTags = tempCache
|
||||
|
||||
// Used for README
|
||||
for (
|
||||
let tempIdx = 0;
|
||||
tempIdx < self.templates.length;
|
||||
tempIdx++
|
||||
) {
|
||||
Logger.d(' ')
|
||||
Logger.d(self.templates[tempIdx].templateName + '/')
|
||||
Logger.d(
|
||||
self
|
||||
.getDockerVersionsForTemplateName(
|
||||
self.templates[tempIdx].templateName
|
||||
)
|
||||
.join(', ')
|
||||
)
|
||||
Logger.d(' ')
|
||||
}
|
||||
}
|
||||
})
|
||||
.catch(function(error) {
|
||||
Logger.e(error)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
getTemplateFromTemplateName(templateName: string) {
|
||||
|
||||
@@ -0,0 +1,170 @@
|
||||
import request = require('request')
|
||||
import fs = require('fs-extra')
|
||||
import ApiStatusCodes = require('../api/ApiStatusCodes')
|
||||
import Logger = require('../utils/Logger')
|
||||
import CaptainConstants = require('../utils/CaptainConstants')
|
||||
import { ITemplate } from '../models/OtherTypes'
|
||||
|
||||
function getTagsForImage(
|
||||
imageBaseName: string,
|
||||
url: string | undefined,
|
||||
allTags: string[] | undefined
|
||||
): Promise<string[]> {
|
||||
if (!url) {
|
||||
url =
|
||||
'https://hub.docker.com/v2/repositories/' + imageBaseName + '/tags'
|
||||
}
|
||||
|
||||
return new Promise<string[]>(function(resolve, reject) {
|
||||
request(
|
||||
url!,
|
||||
|
||||
function(error, response, body) {
|
||||
if (error || !body) {
|
||||
Logger.e(error)
|
||||
reject(error)
|
||||
return
|
||||
}
|
||||
|
||||
try {
|
||||
// Sometimes Docker server is down and it crashes Captain!
|
||||
body = JSON.parse(body)
|
||||
} catch (e) {
|
||||
Logger.e(e)
|
||||
}
|
||||
|
||||
let results: any
|
||||
|
||||
if (body) {
|
||||
results = body.results
|
||||
}
|
||||
|
||||
if (!results) {
|
||||
Logger.e('NO RESULT')
|
||||
reject(new Error('NO RESULT'))
|
||||
return
|
||||
}
|
||||
|
||||
if (!allTags) {
|
||||
allTags = []
|
||||
}
|
||||
|
||||
for (let idx = 0; idx < results.length; idx++) {
|
||||
allTags.push(results[idx].name)
|
||||
}
|
||||
|
||||
if (body.next) {
|
||||
resolve(getTagsForImage(imageBaseName, body.next, allTags))
|
||||
return
|
||||
}
|
||||
|
||||
resolve(allTags)
|
||||
}
|
||||
)
|
||||
})
|
||||
}
|
||||
|
||||
function firstEndsWithSecond(str1: string, str2: string) {
|
||||
if (!str1 || !str2) {
|
||||
throw new Error('Str1 or Str2 are null ' + !str1 + ' ' + !str2)
|
||||
}
|
||||
const idx = str1.indexOf(str2)
|
||||
return idx >= 0 && idx + str2.length === str1.length
|
||||
}
|
||||
|
||||
function isEmpty(obj: any) {
|
||||
for (const key in obj) {
|
||||
if (obj.hasOwnProperty(key)) {
|
||||
return false
|
||||
}
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
type AnyHashMap = IHashMapGeneric<any>
|
||||
|
||||
class TemplateHelperVersionPrinter {
|
||||
private cachedImageTags: AnyHashMap
|
||||
|
||||
constructor() {
|
||||
this.cachedImageTags = {}
|
||||
}
|
||||
|
||||
getDockerVersionsForTemplateName(templateObj: ITemplate) {
|
||||
const self = this
|
||||
|
||||
if (isEmpty(this.cachedImageTags)) {
|
||||
throw ApiStatusCodes.createError(
|
||||
ApiStatusCodes.STATUS_ERROR_GENERIC,
|
||||
'Please wait about 30 seconds, then try again.'
|
||||
)
|
||||
}
|
||||
|
||||
const tags = self.cachedImageTags[templateObj.dockerHubImageName]
|
||||
|
||||
const dockerVersions = []
|
||||
for (let i = 0; i < tags.length; i++) {
|
||||
const t = tags[i]
|
||||
if (firstEndsWithSecond(t, templateObj.tagSuffix)) {
|
||||
dockerVersions.push(
|
||||
t.substring(0, t.length - templateObj.tagSuffix.length)
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
return dockerVersions
|
||||
}
|
||||
|
||||
printAvailableImageTagsForReadme(templates: ITemplate[]) {
|
||||
const self = this
|
||||
self.cachedImageTags = {}
|
||||
|
||||
const tempCache: AnyHashMap = {}
|
||||
for (let i = 0; i < templates.length; i++) {
|
||||
const currentImageName = templates[i].dockerHubImageName
|
||||
|
||||
getTagsForImage(currentImageName, undefined, undefined)
|
||||
.then(function(tags) {
|
||||
tempCache[currentImageName] = tags
|
||||
|
||||
let isAllDone = true
|
||||
|
||||
for (let j = 0; j < templates.length; j++) {
|
||||
const imageName = templates[j].dockerHubImageName
|
||||
if (!tempCache[imageName]) {
|
||||
isAllDone = false
|
||||
}
|
||||
}
|
||||
|
||||
if (isAllDone) {
|
||||
Logger.d('Template Cache Updated!')
|
||||
|
||||
self.cachedImageTags = tempCache
|
||||
|
||||
// Used for README
|
||||
for (
|
||||
let tempIdx = 0;
|
||||
tempIdx < templates.length;
|
||||
tempIdx++
|
||||
) {
|
||||
Logger.d(' ')
|
||||
Logger.d(templates[tempIdx].templateName + '/')
|
||||
Logger.d(
|
||||
self
|
||||
.getDockerVersionsForTemplateName(
|
||||
templates[tempIdx]
|
||||
)
|
||||
.join(', ')
|
||||
)
|
||||
Logger.d(' ')
|
||||
}
|
||||
}
|
||||
})
|
||||
.catch(function(error) {
|
||||
Logger.e(error)
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export = TemplateHelperVersionPrinter
|
||||
Reference in New Issue
Block a user