Compare commits

...

50 Commits

Author SHA1 Message Date
446d140e32 3.1.68 2019-11-23 19:45:00 +00:00
726948651e fix(core): update 2019-11-23 19:44:59 +00:00
dd0a7bb782 3.1.67 2019-10-04 15:18:51 +02:00
fca00ffcf8 fix(core): update 2019-10-04 15:18:51 +02:00
13f6334ae5 3.1.66 2019-10-03 00:00:20 +02:00
7275a858d6 fix(core): update 2019-10-03 00:00:20 +02:00
5a3befe5af 3.1.65 2019-10-02 23:55:55 +02:00
385a93a05e update 2019-10-02 23:55:51 +02:00
b4d444ff05 3.1.64 2019-10-02 14:54:21 +02:00
487bcb9a70 fix(core): update 2019-10-02 14:54:21 +02:00
aaf11b66d7 3.1.63 2019-10-02 11:57:00 +02:00
83d7d46896 fix(core): update 2019-10-02 11:56:59 +02:00
693bda6a49 3.1.62 2019-10-02 11:56:06 +02:00
bfe3e266ee fix(core): update 2019-10-02 11:56:05 +02:00
5f33ebd8a7 3.1.61 2019-10-02 11:33:52 +02:00
f78c80e100 fix(core): update 2019-10-02 11:33:52 +02:00
f4d8656831 3.1.60 2019-09-01 14:21:30 +02:00
2290081ef0 fix(core): update 2019-09-01 14:21:30 +02:00
189d02a16f 3.1.59 2019-09-01 14:11:35 +02:00
55aee04334 fix(core): update 2019-09-01 14:11:35 +02:00
0e407b9b9d 3.1.58 2019-09-01 13:54:00 +02:00
24095bbd40 fix(core): update 2019-09-01 13:54:00 +02:00
f97ee94b5a 3.1.57 2019-09-01 13:51:12 +02:00
4cf7aea374 fix(core): update 2019-09-01 13:51:11 +02:00
6ab5e9cb30 3.1.56 2019-09-01 13:49:28 +02:00
95c1145bf5 3.1.55 2019-09-01 13:49:12 +02:00
ea04a1b788 fix(core): update 2019-09-01 13:49:11 +02:00
3bc2499d09 3.1.54 2019-09-01 13:46:03 +02:00
1f5967ac45 fix(core): update 2019-09-01 13:46:03 +02:00
fd952f086b 3.1.53 2019-09-01 13:45:19 +02:00
79500cb2c2 fix(core): update 2019-09-01 13:45:18 +02:00
6c58864fcf 3.1.52 2019-09-01 13:44:22 +02:00
7ea3ac182d fix(core): update 2019-09-01 13:44:21 +02:00
8979d26005 3.1.51 2019-09-01 13:41:04 +02:00
c8876dac88 fix(core): update 2019-09-01 13:41:03 +02:00
9c8a257c2a 3.1.50 2019-08-30 18:40:00 +02:00
8b77930ece fix(core): update 2019-08-30 18:39:59 +02:00
ba672d030f 3.1.49 2019-08-30 14:51:04 +02:00
8ad7e016e7 fix(core): update 2019-08-30 14:51:03 +02:00
d843311d7b 3.1.48 2019-08-30 13:30:16 +02:00
14ef2cfa9b 3.1.47 2019-08-30 12:24:01 +02:00
648effcf86 fix(core): update 2019-08-30 12:24:00 +02:00
572738e88f 3.1.46 2019-08-30 10:40:38 +02:00
129ae93044 fix(core): update 2019-08-30 10:40:38 +02:00
e910892231 3.1.45 2019-08-30 10:38:48 +02:00
6d9cabf7ee fix(core): update 2019-08-30 10:38:47 +02:00
7c7787e811 3.1.44 2019-08-29 20:56:03 +02:00
bde26cc312 fix(core): update 2019-08-29 20:56:02 +02:00
29e81f3ae7 3.1.43 2019-08-29 20:38:45 +02:00
6337b20d62 fix(core): update 2019-08-29 20:38:44 +02:00
15 changed files with 563 additions and 372 deletions

View File

@@ -1,7 +1,5 @@
# gitzone ci_default # gitzone ci_default
image: registry.gitlab.com/hosttoday/ht-docker-node:npmci image: registry.gitlab.com/hosttoday/ht-docker-node:npmci
variables:
GIT_STRATEGY: clone
cache: cache:
paths: paths:
@@ -102,7 +100,7 @@ trigger:
pages: pages:
image: hosttoday/ht-docker-dbase:npmci image: hosttoday/ht-docker-dbase:npmci
services: services:
- docker:18-dind - docker:stable-dind
stage: metadata stage: metadata
script: script:
- npmci command npm install -g @gitzone/tsdoc - npmci command npm install -g @gitzone/tsdoc

705
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,6 +1,6 @@
{ {
"name": "@shipzone/npmci", "name": "@shipzone/npmci",
"version": "3.1.42", "version": "3.1.68",
"private": false, "private": false,
"description": "node and docker in gitlab ci on steroids", "description": "node and docker in gitlab ci on steroids",
"main": "dist/index.js", "main": "dist/index.js",
@@ -9,8 +9,8 @@
"npmci": "cli.js" "npmci": "cli.js"
}, },
"scripts": { "scripts": {
"test": "(rm -f config.json) && tstest test/", "test": "tstest test/",
"build": "(rm -f config.json) && tsbuild && (npm run testVersion)", "build": "tsbuild && (npm run testVersion)",
"testVersion": "(cd test/assets/ && node ../../cli.js -v)" "testVersion": "(cd test/assets/ && node ../../cli.js -v)"
}, },
"repository": { "repository": {
@@ -26,32 +26,33 @@
"devDependencies": { "devDependencies": {
"@gitzone/tsbuild": "^2.1.17", "@gitzone/tsbuild": "^2.1.17",
"@gitzone/tsrun": "^1.2.6", "@gitzone/tsrun": "^1.2.6",
"@gitzone/tstest": "^1.0.24", "@gitzone/tstest": "^1.0.28",
"@pushrocks/tapbundle": "^3.0.13", "@pushrocks/tapbundle": "^3.2.0",
"@types/node": "^12.7.2", "@types/node": "^12.12.12",
"tslint": "^5.19.0", "tslint": "^5.20.1",
"tslint-config-prettier": "^1.18.0" "tslint-config-prettier": "^1.18.0"
}, },
"dependencies": { "dependencies": {
"@apiglobal/typedrequest": "^1.0.24",
"@pushrocks/lik": "^3.0.11", "@pushrocks/lik": "^3.0.11",
"@pushrocks/npmextra": "^3.0.5", "@pushrocks/npmextra": "^3.0.7",
"@pushrocks/projectinfo": "^4.0.2", "@pushrocks/projectinfo": "^4.0.2",
"@pushrocks/qenv": "^4.0.2", "@pushrocks/qenv": "^4.0.6",
"@pushrocks/smartanalytics": "^2.0.15", "@pushrocks/smartanalytics": "^2.0.15",
"@pushrocks/smartcli": "^3.0.7", "@pushrocks/smartcli": "^3.0.7",
"@pushrocks/smartdelay": "^2.0.3", "@pushrocks/smartdelay": "^2.0.6",
"@pushrocks/smartfile": "^7.0.2", "@pushrocks/smartfile": "^7.0.6",
"@pushrocks/smartgit": "^1.0.13", "@pushrocks/smartgit": "^1.0.13",
"@pushrocks/smartlog": "^2.0.19", "@pushrocks/smartlog": "^2.0.21",
"@pushrocks/smartlog-destination-local": "^8.0.2", "@pushrocks/smartlog-destination-local": "^8.0.2",
"@pushrocks/smartparam": "^1.0.4", "@pushrocks/smartparam": "^1.0.4",
"@pushrocks/smartpromise": "^3.0.2", "@pushrocks/smartpromise": "^3.0.6",
"@pushrocks/smartrequest": "^1.1.23", "@pushrocks/smartrequest": "^1.1.43",
"@pushrocks/smartshell": "^2.0.23", "@pushrocks/smartshell": "^2.0.25",
"@pushrocks/smartsocket": "^1.1.45", "@pushrocks/smartsocket": "^1.1.58",
"@pushrocks/smartssh": "^1.2.3", "@pushrocks/smartssh": "^1.2.3",
"@pushrocks/smartstring": "^3.0.10", "@pushrocks/smartstring": "^3.0.14",
"@servezone/servezone-interfaces": "^2.0.28", "@servezone/servezone-interfaces": "^2.0.51",
"@types/shelljs": "^0.8.5", "@types/shelljs": "^0.8.5",
"@types/through2": "^2.0.34", "@types/through2": "^2.0.34",
"through2": "^3.0.1" "through2": "^3.0.1"

View File

@@ -29,28 +29,34 @@ let sortableArray: npmci.Dockerfile[];
tap.test('should return valid Dockerfiles', async () => { tap.test('should return valid Dockerfiles', async () => {
const npmciInstance = new npmci.Npmci(); const npmciInstance = new npmci.Npmci();
dockerfile1 = new npmci.Dockerfile(npmciInstance.dockerManager, { filePath: './Dockerfile', read: true }); dockerfile1 = new npmci.Dockerfile(npmciInstance.dockerManager, {
dockerfile2 = new npmci.Dockerfile(npmciInstance.dockerManager, { filePath: './Dockerfile_sometag1', read: true }); filePath: './Dockerfile',
read: true
});
dockerfile2 = new npmci.Dockerfile(npmciInstance.dockerManager, {
filePath: './Dockerfile_sometag1',
read: true
});
expect(dockerfile1.version).to.equal('latest'); expect(dockerfile1.version).to.equal('latest');
return expect(dockerfile2.version).to.equal('sometag1'); return expect(dockerfile2.version).to.equal('sometag1');
}); });
tap.test('should read a directory of Dockerfiles', async () => { tap.test('should read a directory of Dockerfiles', async () => {
const npmciInstance = new npmci.Npmci(); const npmciInstance = new npmci.Npmci();
return npmci.Dockerfile return npmci.Dockerfile.readDockerfiles(npmciInstance.dockerManager).then(
.readDockerfiles(npmciInstance.dockerManager) async (readDockerfilesArrayArg: npmci.Dockerfile[]) => {
.then(async (readDockerfilesArrayArg: npmci.Dockerfile[]) => {
sortableArray = readDockerfilesArrayArg; sortableArray = readDockerfilesArrayArg;
return expect(readDockerfilesArrayArg[1].version).to.equal('sometag1'); return expect(readDockerfilesArrayArg[1].version).to.equal('sometag1');
}); }
);
}); });
tap.test('should sort an array of Dockerfiles', async () => { tap.test('should sort an array of Dockerfiles', async () => {
return npmci.Dockerfile return npmci.Dockerfile.sortDockerfiles(sortableArray).then(
.sortDockerfiles(sortableArray) async (sortedArrayArg: npmci.Dockerfile[]) => {
.then(async (sortedArrayArg: npmci.Dockerfile[]) => {
console.log(sortedArrayArg); console.log(sortedArrayArg);
}); }
);
}); });
tap.test('should build all Dockerfiles', async () => { tap.test('should build all Dockerfiles', async () => {

View File

@@ -1,8 +1,32 @@
import * as plugins from '../npmci.plugins'; import * as plugins from '../npmci.plugins';
import { Npmci } from '../npmci.classes.npmci';
import { logger } from '../npmci.logging';
/** /**
* * connects to cloudly
*/ */
export class CloudlyConnector { export class CloudlyConnector {
public npmciRef: Npmci;
constructor(npmciRefArg: Npmci) {
this.npmciRef = npmciRefArg;
}
public async announceDockerContainer(optionsArg: plugins.servezoneInterfaces.version.IVersionData) {
const cloudlyUrl = this.npmciRef.npmciConfig.getConfig().urlCloudly;
if (!cloudlyUrl) {
logger.log(
'warn',
'no cloudly url provided. Thus we cannot announce the newly built Dockerimage!'
);
return;
}
const typedrequest = new plugins.typedrequest.TypedRequest<
plugins.servezoneInterfaces.request.version.IRequest_Any_Cloudly_VersionManager_Update
>(`https://${cloudlyUrl}/versionmanager`, 'update');
const response = await typedrequest.fire(optionsArg);
}
} }

View File

@@ -50,7 +50,7 @@ export class NpmciDockerManager {
`>>npmci docker ...<< cli arguments invalid... Please read the documentation.` `>>npmci docker ...<< cli arguments invalid... Please read the documentation.`
); );
} }
} };
/** /**
* builds a cwd of Dockerfiles by triggering a promisechain * builds a cwd of Dockerfiles by triggering a promisechain
@@ -62,7 +62,7 @@ export class NpmciDockerManager {
.then(Dockerfile.sortDockerfiles) .then(Dockerfile.sortDockerfiles)
.then(Dockerfile.mapDockerfiles) .then(Dockerfile.mapDockerfiles)
.then(Dockerfile.buildDockerfiles); .then(Dockerfile.buildDockerfiles);
} };
/** /**
* login to the DockerRegistries * login to the DockerRegistries
@@ -70,7 +70,7 @@ export class NpmciDockerManager {
public login = async () => { public login = async () => {
await this.prepare(); await this.prepare();
await this.npmciRegistryStorage.loginAll(); await this.npmciRegistryStorage.loginAll();
} };
/** /**
* logs in docker * logs in docker
@@ -98,7 +98,7 @@ export class NpmciDockerManager {
} }
); );
return; return;
} };
/** /**
* pushes an image towards a registry * pushes an image towards a registry
@@ -146,7 +146,7 @@ export class NpmciDockerManager {
await dockerfile.push(dockerRegistryToPushTo, suffix); await dockerfile.push(dockerRegistryToPushTo, suffix);
} }
} }
} };
/** /**
* pulls an image * pulls an image
@@ -165,7 +165,7 @@ export class NpmciDockerManager {
for (const dockerfile of dockerfileArray) { for (const dockerfile of dockerfileArray) {
await dockerfile.pull(localDockerRegistry, suffix); await dockerfile.pull(localDockerRegistry, suffix);
} }
} };
/** /**
* tests docker files * tests docker files
@@ -173,5 +173,5 @@ export class NpmciDockerManager {
public test = async () => { public test = async () => {
await this.prepare(); await this.prepare();
return await Dockerfile.readDockerfiles(this).then(Dockerfile.testDockerfiles); return await Dockerfile.readDockerfiles(this).then(Dockerfile.testDockerfiles);
} };
} }

View File

@@ -214,6 +214,7 @@ export class Dockerfile {
public version: string; public version: string;
public cleanTag: string; public cleanTag: string;
public buildTag: string; public buildTag: string;
public pushTag: string;
public containerName: string; public containerName: string;
public content: string; public content: string;
public baseImage: string; public baseImage: string;
@@ -248,7 +249,9 @@ export class Dockerfile {
public async build() { public async build() {
logger.log('info', 'now building Dockerfile for ' + this.cleanTag); logger.log('info', 'now building Dockerfile for ' + this.cleanTag);
const buildArgsString = await Dockerfile.getDockerBuildArgs(this.npmciDockerManagerRef); const buildArgsString = await Dockerfile.getDockerBuildArgs(this.npmciDockerManagerRef);
const buildCommand = `docker build -t ${this.buildTag} -f ${this.filePath} ${buildArgsString} .`; const buildCommand = `docker build --label="version=${
this.npmciDockerManagerRef.npmciRef.npmciConfig.getConfig().projectInfo.npm.version
}" -t ${this.buildTag} -f ${this.filePath} ${buildArgsString} .`;
await bash(buildCommand); await bash(buildCommand);
return; return;
} }
@@ -257,15 +260,24 @@ export class Dockerfile {
* pushes the Dockerfile to a registry * pushes the Dockerfile to a registry
*/ */
public async push(dockerRegistryArg: DockerRegistry, versionSuffix: string = null) { public async push(dockerRegistryArg: DockerRegistry, versionSuffix: string = null) {
const pushTag = Dockerfile.getDockerTagString( this.pushTag = Dockerfile.getDockerTagString(
this.npmciDockerManagerRef, this.npmciDockerManagerRef,
dockerRegistryArg.registryUrl, dockerRegistryArg.registryUrl,
this.repo, this.repo,
this.version, this.version,
versionSuffix versionSuffix
); );
await bash(`docker tag ${this.buildTag} ${pushTag}`); await bash(`docker tag ${this.buildTag} ${this.pushTag}`);
await bash(`docker push ${pushTag}`); await bash(`docker push ${this.pushTag}`);
const imageDigest = (await bash(
`docker inspect --format="{{index .RepoDigests 0}}" ${this.pushTag}`
)).split('@')[1];
console.log(`The image ${this.pushTag} has digest ${imageDigest}`);
await this.npmciDockerManagerRef.npmciRef.cloudlyConnector.announceDockerContainer({
dockerImageUrl: this.pushTag,
dockerImageVersion: this.npmciDockerManagerRef.npmciRef.npmciConfig.getConfig().projectInfo
.npm.version
});
} }
/** /**

View File

@@ -3,4 +3,3 @@ import * as plugins from './mod.plugins';
import * as paths from '../npmci.paths'; import * as paths from '../npmci.paths';
import { Dockerfile } from './mod.classes.dockerfile'; import { Dockerfile } from './mod.classes.dockerfile';

View File

@@ -1,6 +1,6 @@
import { logger } from '../npmci.logging'; import { logger } from '../npmci.logging';
import * as plugins from './mod.plugins'; import * as plugins from './mod.plugins';
import { bash } from '../npmci.bash'; import { bash, bashNoError } from '../npmci.bash';
import { Npmci } from '../npmci.classes.npmci'; import { Npmci } from '../npmci.classes.npmci';
export class NpmciGitManager { export class NpmciGitManager {
@@ -27,12 +27,12 @@ export class NpmciGitManager {
} else { } else {
logger.log('info', `npmci git -> cli arguments invalid! Please read the documentation.`); logger.log('info', `npmci git -> cli arguments invalid! Please read the documentation.`);
} }
} };
public mirror = async () => { public mirror = async () => {
const githubToken = process.env.NPMCI_GIT_GITHUBTOKEN; const githubToken = process.env.NPMCI_GIT_GITHUBTOKEN;
const githubUser = process.env.NPMCI_GIT_GITHUBGROUP || this.npmciRef.npmciEnv.repo.user; const githubUser = process.env.NPMCI_GIT_GITHUBGROUP || this.npmciRef.npmciEnv.repo.user;
const githubRepo = process.env.NPMCI_GIT_GITHUB || this.npmciRef.npmciEnv.repo; const githubRepo = process.env.NPMCI_GIT_GITHUB || this.npmciRef.npmciEnv.repo.repo;
if ( if (
this.npmciRef.npmciConfig.getConfig().projectInfo.npm.packageJson.private === true || this.npmciRef.npmciConfig.getConfig().projectInfo.npm.packageJson.private === true ||
this.npmciRef.npmciConfig.getConfig().npmAccessLevel === 'private' this.npmciRef.npmciConfig.getConfig().npmAccessLevel === 'private'
@@ -49,17 +49,25 @@ export class NpmciGitManager {
// plugins.smartgit.GitRepo; // plugins.smartgit.GitRepo;
// remove old mirrors
await bashNoError('git remote rm mirror');
await bash(`git fetch`);
// add the mirror // add the mirror
await bash( await bashNoError(
`git remote add mirror https://${githubToken}@github.com/${githubUser}/${githubRepo}.git` `git remote add mirror https://${githubToken}@github.com/${githubUser}/${githubRepo}.git`
); );
await bash(`git push mirror --all`); await bashNoError(`git push mirror --all`);
await bashNoError(`git checkout origin/master`);
await bashNoError(`git push mirror master`);
logger.log('ok', 'pushed all branches to mirror!'); logger.log('ok', 'pushed all branches to mirror!');
await bash(`git push mirror --tags`); await bashNoError(`git push mirror --tags`);
logger.log('ok', 'pushed all tags to mirror!'); logger.log('ok', 'pushed all tags to mirror!');
// remove old mirrors
await bashNoError('git remote rm mirror');
} else { } else {
logger.log('error', `cannot find NPMCI_GIT_GITHUBTOKEN env var!`); logger.log('error', `cannot find NPMCI_GIT_GITHUBTOKEN env var!`);
process.exit(1); process.exit(1);
} }
} };
} }

View File

@@ -22,6 +22,9 @@ export class NpmciNpmManager {
case 'install': case 'install':
await this.install(); await this.install();
break; break;
case 'build':
await this.build();
break;
case 'prepare': case 'prepare':
await this.prepare(); await this.prepare();
break; break;
@@ -133,8 +136,8 @@ export class NpmciNpmManager {
await bash(`npm -v`); await bash(`npm -v`);
// -> build it // -> build it
await bash(`npm install`); await this.install();
await bash(`npm run build`); await this.build();
logger.log('success', `Nice!!! The build for the publication was successfull!`); logger.log('success', `Nice!!! The build for the publication was successfull!`);
logger.log('info', `Lets clean up so we don't publish any packages that don't belong to us:`); logger.log('info', `Lets clean up so we don't publish any packages that don't belong to us:`);
@@ -152,7 +155,12 @@ export class NpmciNpmManager {
public async install(): Promise<void> { public async install(): Promise<void> {
logger.log('info', 'now installing dependencies:'); logger.log('info', 'now installing dependencies:');
await bash('npm install'); await bash('npm ci');
}
public async build(): Promise<void> {
logger.log('info', 'now building the project:');
await bash('npm run build');
} }
public async test(): Promise<void> { public async test(): Promise<void> {

View File

@@ -34,7 +34,7 @@ export class Npmci {
projectId: 'gitzone', projectId: 'gitzone',
appName: 'npmci' appName: 'npmci'
}); });
this.cloudlyConnector = new CloudlyConnector(); this.cloudlyConnector = new CloudlyConnector(this);
this.npmciEnv = new NpmciEnv(this); this.npmciEnv = new NpmciEnv(this);
this.npmciInfo = new NpmciInfo(this); this.npmciInfo = new NpmciInfo(this);
this.npmciCli = new NpmciCli(this); this.npmciCli = new NpmciCli(this);

View File

@@ -106,5 +106,5 @@ export class NpmciCli {
public startParse = () => { public startParse = () => {
this.smartcli.startParse(); this.smartcli.startParse();
} };
} }

View File

@@ -1,10 +1,9 @@
import * as plugins from './npmci.plugins'; import * as plugins from './npmci.plugins';
import * as paths from './npmci.paths'; import * as paths from './npmci.paths';
import { logger } from "./npmci.logging"; import { logger } from './npmci.logging';
import { Npmci } from './npmci.classes.npmci'; import { Npmci } from './npmci.classes.npmci';
export class NpmciInfo { export class NpmciInfo {
public npmciRef: Npmci; public npmciRef: Npmci;
public projectInfo = new plugins.projectinfo.ProjectinfoNpm(paths.NpmciPackageRoot); public projectInfo = new plugins.projectinfo.ProjectinfoNpm(paths.NpmciPackageRoot);
@@ -12,7 +11,7 @@ export class NpmciInfo {
this.npmciRef = npmciArg; this.npmciRef = npmciArg;
} }
public printToConsole () { public printToConsole() {
logger.log('info', `npmci version: ${this.projectInfo.version}`); logger.log('info', `npmci version: ${this.projectInfo.version}`);
} }
} }

View File

@@ -3,12 +3,15 @@ import * as path from 'path';
export { path }; export { path };
// @apiglobal
import * as typedrequest from '@apiglobal/typedrequest';
export { typedrequest };
// @servezone // @servezone
import * as servezoneInterfaces from '@servezone/servezone-interfaces'; import * as servezoneInterfaces from '@servezone/servezone-interfaces';
export { export { servezoneInterfaces };
servezoneInterfaces
};
// @pushrocks // @pushrocks
import * as npmextra from '@pushrocks/npmextra'; import * as npmextra from '@pushrocks/npmextra';