Compare commits

...

28 Commits

Author SHA1 Message Date
50d3f2d795 4.1.22 2023-07-12 18:23:32 +02:00
305856b9e1 fix(core): update 2023-07-12 18:23:31 +02:00
3683743f3c 4.1.21 2023-07-12 15:35:39 +02:00
41237e0e5f fix(core): update 2023-07-12 15:35:38 +02:00
bce84a0e74 4.1.20 2023-07-02 00:10:28 +02:00
79bed919d8 fix(core): update 2023-07-02 00:10:27 +02:00
4b202ce00e 4.1.19 2023-07-01 22:09:54 +02:00
16ca787314 fix(core): update 2023-07-01 22:09:54 +02:00
3a9b6f658a 4.1.18 2023-07-01 22:05:44 +02:00
5c5dbf303f fix(core): update 2023-07-01 22:05:43 +02:00
4c07131e51 4.1.17 2023-07-01 19:23:17 +02:00
ba039469ff fix(core): update 2023-07-01 19:23:17 +02:00
49f2498ecd 4.1.16 2023-07-01 19:02:07 +02:00
1060060366 fix(core): update 2023-07-01 19:02:06 +02:00
0fa3a579f7 4.1.15 2023-06-26 10:09:25 +02:00
0e4556d59e fix(core): update 2023-06-26 10:09:24 +02:00
e2e7967fba 4.1.14 2023-06-26 09:28:19 +02:00
45b8d67abf fix(core): update 2023-06-26 09:28:19 +02:00
0a69aa5d62 4.1.13 2023-06-26 02:43:45 +02:00
dfbab1a1df fix(core): update 2023-06-26 02:43:45 +02:00
e58f009a24 4.1.12 2023-06-26 01:03:44 +02:00
2afd9cddc5 fix(core): update 2023-06-26 01:03:44 +02:00
d79c5366ef 4.1.11 2023-06-26 00:09:56 +02:00
8e4f7ad244 fix(core): update 2023-06-26 00:09:54 +02:00
39de3a1601 4.1.10 2023-06-25 23:59:26 +02:00
cb3d2964d1 fix(core): update 2023-06-25 23:59:25 +02:00
6b5390cef8 4.1.9 2023-06-25 23:26:25 +02:00
2736b85de3 fix(core): update 2023-06-25 23:26:25 +02:00
21 changed files with 1912 additions and 1203 deletions

View File

@@ -9,6 +9,7 @@ env:
IMAGE: registry.gitlab.com/hosttoday/ht-docker-node:npmci
NPMCI_TOKEN_NPM: ${{secrets.NPMCI_TOKEN_NPM}}
NPMCI_GIT_GITHUBTOKEN: ${{secrets.NPMCI_GIT_GITHUBTOKEN}}
NPMCI_LOGIN_DOCKER_GITEA: ${{secrets.NPMCI_DOCKER_REGISTRYURL_DEFAULT}}|${{ gitea.repository_owner }}|${{ secrets.GITEA_TOKEN }}
jobs:

View File

@@ -1,6 +1,6 @@
{
"name": "@shipzone/npmci",
"version": "4.1.8",
"version": "4.1.22",
"private": false,
"description": "node and docker in gitlab ci on steroids",
"main": "dist_ts/index.js",
@@ -26,37 +26,37 @@
},
"homepage": "https://gitlab.com/gitzone/npmci#README",
"devDependencies": {
"@gitzone/tsbuild": "^2.1.65",
"@gitzone/tsrun": "^1.2.37",
"@gitzone/tstest": "^1.0.73",
"@pushrocks/tapbundle": "^5.0.4",
"@types/node": "^18.8.3"
"@gitzone/tsbuild": "^2.1.66",
"@gitzone/tsrun": "^1.2.42",
"@gitzone/tstest": "^1.0.74",
"@push.rocks/tapbundle": "^5.0.8",
"@types/node": "^20.4.1"
},
"dependencies": {
"@apiglobal/typedrequest": "^2.0.10",
"@pushrocks/lik": "^6.0.0",
"@pushrocks/npmextra": "^3.0.9",
"@pushrocks/projectinfo": "^5.0.1",
"@pushrocks/qenv": "^5.0.2",
"@pushrocks/smartanalytics": "^2.0.15",
"@pushrocks/smartcli": "^4.0.6",
"@pushrocks/smartdelay": "^2.0.13",
"@pushrocks/smartenv": "^5.0.3",
"@pushrocks/smartfile": "^10.0.5",
"@pushrocks/smartgit": "^3.0.0",
"@pushrocks/smartlog": "^3.0.1",
"@pushrocks/smartlog-destination-local": "^8.0.8",
"@pushrocks/smartparam": "^1.1.6",
"@pushrocks/smartpath": "^5.0.5",
"@pushrocks/smartpromise": "^3.1.7",
"@pushrocks/smartrequest": "^2.0.11",
"@pushrocks/smartshell": "^2.0.30",
"@pushrocks/smartsocket": "^2.0.7",
"@pushrocks/smartssh": "^2.0.0",
"@pushrocks/smartstring": "^4.0.5",
"@apiglobal/typedrequest": "^2.0.12",
"@push.rocks/lik": "^6.0.3",
"@push.rocks/npmextra": "^3.0.9",
"@push.rocks/projectinfo": "^5.0.1",
"@push.rocks/qenv": "^5.0.2",
"@push.rocks/smartanalytics": "^2.0.15",
"@push.rocks/smartcli": "^4.0.6",
"@push.rocks/smartdelay": "^3.0.1",
"@push.rocks/smartenv": "^5.0.5",
"@push.rocks/smartfile": "^10.0.28",
"@push.rocks/smartgit": "^3.0.0",
"@push.rocks/smartlog": "^3.0.2",
"@push.rocks/smartlog-destination-local": "^9.0.0",
"@push.rocks/smartobject": "^1.0.10",
"@push.rocks/smartpath": "^5.0.11",
"@push.rocks/smartpromise": "^4.0.2",
"@push.rocks/smartrequest": "^2.0.18",
"@push.rocks/smartshell": "^3.0.3",
"@push.rocks/smartsocket": "^2.0.19",
"@push.rocks/smartssh": "^2.0.0",
"@push.rocks/smartstring": "^4.0.7",
"@servezone/interfaces": "^1.0.3",
"@tsclass/tsclass": "^4.0.21",
"@types/through2": "^2.0.36",
"@tsclass/tsclass": "^4.0.42",
"@types/through2": "^2.0.38",
"through2": "^4.0.2"
},
"files": [

2840
pnpm-lock.yaml generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,5 +1,5 @@
process.env['NODE_TLS_REJECT_UNAUTHORIZED'] = '0';
import { tap, expect } from '@pushrocks/tapbundle';
import { tap, expect } from '@push.rocks/tapbundle';
import * as cloudlyConnectorMod from '../ts/connector.cloudly/cloudlyconnector.js';

View File

@@ -1,6 +1,6 @@
import { tap, expect } from '@pushrocks/tapbundle';
import { tap, expect } from '@push.rocks/tapbundle';
import * as path from 'path';
import * as smartpath from '@pushrocks/smartpath';
import * as smartpath from '@push.rocks/smartpath';
process.env.NPMTS_TEST = 'true';
process.env.NPMCI_URL_CLOUDLY = 'localhost';
@@ -21,6 +21,8 @@ process.cwd = () => {
let npmci: typeof import('../ts/index.js');
type TNpmciTypes = typeof import('../ts/index.js');
tap.preTask('should import npmci', async () => {
npmci = await import('../ts/index.js');
});

View File

@@ -3,6 +3,6 @@
*/
export const commitinfo = {
name: '@shipzone/npmci',
version: '4.1.8',
version: '4.1.22',
description: 'node and docker in gitlab ci on steroids'
}

View File

@@ -0,0 +1,67 @@
import { logger } from '../npmci.logging.js';
import * as plugins from './mod.plugins.js';
import * as paths from '../npmci.paths.js';
import { bash } from '../npmci.bash.js';
import { Npmci } from '../npmci.classes.npmci.js';
export class NpmciCloudronManager {
public npmciRef: Npmci;
constructor(npmciArg: Npmci) {
this.npmciRef = npmciArg;
}
/**
* handle cli input
* @param argvArg
*/
public handleCli = async (argvArg: any) => {
if (argvArg._.length >= 2) {
const action: string = argvArg._[1];
switch (action) {
case 'deploy':
await this.deploy();
break;
default:
logger.log('error', `>>npmci cloudron ...<< action >>${action}<< not supported`);
}
} else {
logger.log(
'info',
`>>npmci cloudron ...<< cli arguments invalid... Please read the documentation.`
);
}
};
/**
* Replaces the version string in CloudronManifest file
* @param versionArg
*/
public deploy = async () => {
logger.log('info', 'now deploying to cloudron...');
logger.log('info', 'installing cloudron cli...');
await bash(`pnpm install -g cloudron`);
logger.log('ok', 'cloudron cli installed');
// lets set the version in the CloudronManifest file
await this.prepareCloudronManifest(this.npmciRef.npmciConfig.getConfig().projectInfo.npm.version);
logger.log('ok', 'CloudronManifest prepared');
// lets figure out the docker image tag
const dockerImageTag = await this.npmciRef.npmciConfig.kvStorage.readKey('latestPushedDockerTag');
const appName = this.npmciRef.npmciConfig.getConfig().cloudronAppName;
const cloudronEnvVar = process.env.NPMCI_LOGIN_CLOUDRON;
const cloudronServer = cloudronEnvVar.split('|')[0];
const cloudronToken = cloudronEnvVar.split('|')[1];
await bash(`cloudron update --server ${cloudronServer} --token ${cloudronToken} --image ${dockerImageTag} --app ${appName}`);
};
private prepareCloudronManifest = async (versionArg: string) => {
const manifestPath = plugins.path.join(paths.cwd, 'CloudronManifest.json');
let manifestFile = plugins.smartfile.fs.toStringSync(manifestPath);
manifestFile = manifestFile.replace(/##version##/g, versionArg);
plugins.smartfile.memory.toFsSync(manifestFile, manifestPath);
logger.log('info', 'Version replaced in CloudronManifest file');
}
}

View File

@@ -0,0 +1 @@
export * from '../npmci.plugins.js';

View File

@@ -77,20 +77,23 @@ export class NpmciDockerManager {
*/
public prepare = async () => {
// Always login to GitLab Registry
if (!process.env.CI_JOB_TOKEN || process.env.CI_JOB_TOKEN === '') {
logger.log('error', 'No registry token specified by gitlab!');
process.exit(1);
if (process.env.GITLAB_CI) {
console.log('gitlab ci detected');
if (!process.env.CI_JOB_TOKEN || process.env.CI_JOB_TOKEN === '') {
logger.log('error', 'Running in Gitlab CI, but no registry token specified by gitlab!');
process.exit(1);
}
this.npmciRegistryStorage.addRegistry(
new DockerRegistry({
registryUrl: 'registry.gitlab.com',
username: 'gitlab-ci-token',
password: process.env.CI_JOB_TOKEN,
})
);
}
this.npmciRegistryStorage.addRegistry(
new DockerRegistry({
registryUrl: 'registry.gitlab.com',
username: 'gitlab-ci-token',
password: process.env.CI_JOB_TOKEN,
})
);
// handle registries
await plugins.smartparam.forEachMinimatch(
await plugins.smartobject.forEachMinimatch(
process.env,
'NPMCI_LOGIN_DOCKER*',
async (envString: string) => {
@@ -176,4 +179,12 @@ export class NpmciDockerManager {
await this.prepare();
return await Dockerfile.readDockerfiles(this).then(Dockerfile.testDockerfiles);
};
/**
* can be used to get the Dockerfiles in the directory
*/
getDockerfiles = async () => {
const dockerfiles = await Dockerfile.readDockerfiles(this);
return dockerfiles;
}
}

View File

@@ -120,15 +120,19 @@ export class Dockerfile {
* returns a version for a docker file
* @execution SYNC
*/
public static dockerFileVersion(dockerfileNameArg: string): string {
public static dockerFileVersion(dockerfileInstanceArg: Dockerfile, dockerfileNameArg: string): string {
let versionString: string;
const versionRegex = /Dockerfile_([a-zA-Z0-9\.]*)$/;
const versionRegex = /Dockerfile_([^:_]*)$/;
const regexResultArray = versionRegex.exec(dockerfileNameArg);
if (regexResultArray && regexResultArray.length === 2) {
versionString = regexResultArray[1];
} else {
versionString = 'latest';
}
versionString = versionString.replace(
'##version##',
dockerfileInstanceArg.npmciDockerManagerRef.npmciRef.npmciConfig.getConfig().projectInfo.npm.version
);
return versionString;
}
@@ -233,7 +237,7 @@ export class Dockerfile {
this.npmciDockerManagerRef.npmciRef.npmciEnv.repo.user +
'/' +
this.npmciDockerManagerRef.npmciRef.npmciEnv.repo.repo;
this.version = Dockerfile.dockerFileVersion(plugins.path.parse(options.filePath).base);
this.version = Dockerfile.dockerFileVersion(this, plugins.path.parse(options.filePath).base);
this.cleanTag = this.repo + ':' + this.version;
this.buildTag = this.cleanTag;
@@ -281,6 +285,7 @@ export class Dockerfile {
labels: [],
version: this.npmciDockerManagerRef.npmciRef.npmciConfig.getConfig().projectInfo.npm.version,
});
await this.npmciDockerManagerRef.npmciRef.npmciConfig.kvStorage.writeKey('latestPushedDockerTag', this.pushTag)
}
/**

View File

@@ -26,7 +26,7 @@ export class DockerRegistry {
process.exit(1);
return;
}
const registryUrl = dockerRegexResultArray[0];
const registryUrl = dockerRegexResultArray[0].replace('https://', '').replace('http://', '');
const username = dockerRegexResultArray[1];
const password = dockerRegexResultArray[2];
return new DockerRegistry({

View File

@@ -1,11 +1,10 @@
import { logger } from '../npmci.logging.js';
import * as plugins from './mod.plugins.js';
import { ObjectMap } from '@pushrocks/lik';
import { DockerRegistry } from './mod.classes.dockerregistry.js';
export class RegistryStorage {
objectMap = new ObjectMap<DockerRegistry>();
objectMap = new plugins.lik.ObjectMap<DockerRegistry>();
constructor() {
// Nothing here
}

View File

@@ -54,7 +54,7 @@ export class NpmciNpmManager {
public async prepare() {
const config = this.npmciRef.npmciConfig.getConfig();
let npmrcFileString: string = '';
await plugins.smartparam.forEachMinimatch(
await plugins.smartobject.forEachMinimatch(
process.env,
'NPMCI_TOKEN_NPM*',
(npmEnvArg: string) => {
@@ -100,7 +100,7 @@ export class NpmciNpmManager {
let publishVerdaccioAsWell = false;
const config = this.npmciRef.npmciConfig.getConfig();
const availableRegistries: string[] = [];
await plugins.smartparam.forEachMinimatch(
await plugins.smartobject.forEachMinimatch(
process.env,
'NPMCI_TOKEN_NPM*',
(npmEnvArg: string) => {

View File

@@ -31,7 +31,7 @@ const notUndefined = (stringArg: string) => {
*/
export let prepare = async () => {
sshInstance = new plugins.smartssh.SshInstance(); // init ssh instance
plugins.smartparam.forEachMinimatch(process.env, 'NPMCI_SSHKEY_*', evaluateSshEnv);
plugins.smartobject.forEachMinimatch(process.env, 'NPMCI_SSHKEY_*', evaluateSshEnv);
if (!process.env.NPMTS_TEST) {
sshInstance.writeToDisk();
} else {

View File

@@ -7,7 +7,7 @@ const triggerValueRegex =
export let trigger = async () => {
logger.log('info', 'now running triggers');
await plugins.smartparam.forEachMinimatch(process.env, 'NPMCI_TRIGGER_*', evaluateTrigger);
await plugins.smartobject.forEachMinimatch(process.env, 'NPMCI_TRIGGER_*', evaluateTrigger);
};
const evaluateTrigger = async (triggerEnvVarArg) => {

View File

@@ -2,12 +2,10 @@ import { logger } from './npmci.logging.js';
import * as plugins from './npmci.plugins.js';
import * as paths from './npmci.paths.js';
import * as smartpromise from '@pushrocks/smartpromise';
/**
* wether nvm is available or not
*/
export let nvmAvailable = smartpromise.defer<boolean>();
export let nvmAvailable = plugins.smartpromise.defer<boolean>();
/**
* the smartshell instance for npmci
*/

View File

@@ -1,17 +1,21 @@
import * as plugins from './npmci.plugins.js';
import { CloudlyConnector } from './connector.cloudly/cloudlyconnector.js';
// env
import { NpmciEnv } from './npmci.classes.npmcienv.js';
import { NpmciInfo } from './npmci.classes.npmciinfo.js';
import { NpmciCli } from './npmci.classes.npmcicli.js';
import { NpmciConfig } from './npmci.classes.npmciconfig.js';
// mods
// connectors
import { CloudlyConnector } from './connector.cloudly/cloudlyconnector.js';
// managers
import { NpmciCloudronManager } from './manager.cloudron/index.js';
import { NpmciDockerManager } from './manager.docker/index.js';
import { NpmciGitManager } from './manager.git/index.js';
import { NpmciNodeJsManager } from './manager.nodejs/index.js';
import { NpmciNpmManager } from './manager.npm/index.js';
import { NpmciEnv } from './npmci.classes.npmcienv.js';
export class Npmci {
public analytics: plugins.smartanalytics.Analytics;
@@ -23,6 +27,7 @@ export class Npmci {
public npmciCli: NpmciCli;
// managers
public cloudronManager: NpmciCloudronManager;
public dockerManager: NpmciDockerManager;
public gitManager: NpmciGitManager;
public nodejsManager: NpmciNodeJsManager;
@@ -41,6 +46,7 @@ export class Npmci {
this.npmciConfig = new NpmciConfig(this);
// managers
this.cloudronManager = new NpmciCloudronManager(this);
this.dockerManager = new NpmciDockerManager(this);
this.gitManager = new NpmciGitManager(this);
this.nodejsManager = new NpmciNodeJsManager(this);

View File

@@ -24,6 +24,17 @@ export class NpmciCli {
}
);
// cloudron
this.smartcli.addCommand('cloudron').subscribe(
async (argv) => {
await this.npmciRef.cloudronManager.handleCli(argv);
},
(err) => {
console.log(err);
process.exit(1);
}
);
// command
this.smartcli.addCommand('command').subscribe(
async (argv) => {
@@ -36,7 +47,7 @@ export class NpmciCli {
}
);
// command
// git
this.smartcli.addCommand('git').subscribe(
async (argvArg) => {
await this.npmciRef.gitManager.handleCli(argvArg);

View File

@@ -25,6 +25,9 @@ export interface INpmciOptions {
// urls
urlCloudly: string;
// cloudron
cloudronAppName?: string;
}
/**

View File

@@ -9,7 +9,12 @@ export class NpmciEnv {
constructor(npmciRefArg: Npmci) {
this.npmciRef = npmciRefArg;
this.repoString = process.env.CI_REPOSITORY_URL;
if (process.env.GITLAB_CI) {
this.repoString = process.env.CI_REPOSITORY_URL;
}
if (process.env.NPMCI_COMPUTED_REPOURL) {
this.repoString = process.env.NPMCI_COMPUTED_REPOURL;
}
if (!this.repoString) {
this.repoString = 'https://undefined:undefined@github.com/undefined/undefined.git';
}

View File

@@ -13,27 +13,29 @@ import * as servezoneInterfaces from '@servezone/interfaces';
export { servezoneInterfaces };
// @pushrocks
import * as npmextra from '@pushrocks/npmextra';
import * as projectinfo from '@pushrocks/projectinfo';
import * as qenv from '@pushrocks/qenv';
import * as smartanalytics from '@pushrocks/smartanalytics';
import * as smartdelay from '@pushrocks/smartdelay';
import * as smartfile from '@pushrocks/smartfile';
import * as smartcli from '@pushrocks/smartcli';
import * as smartgit from '@pushrocks/smartgit';
import * as smartlog from '@pushrocks/smartlog';
import * as smartlogDestinationLocal from '@pushrocks/smartlog-destination-local';
import * as smartparam from '@pushrocks/smartparam';
import * as smartpath from '@pushrocks/smartpath';
import * as smartpromise from '@pushrocks/smartpromise';
import * as smartrequest from '@pushrocks/smartrequest';
import * as smartshell from '@pushrocks/smartshell';
import * as smartsocket from '@pushrocks/smartsocket';
import * as smartssh from '@pushrocks/smartssh';
import * as smartstring from '@pushrocks/smartstring';
// @push.rocks
import * as lik from '@push.rocks/lik';
import * as npmextra from '@push.rocks/npmextra';
import * as projectinfo from '@push.rocks/projectinfo';
import * as qenv from '@push.rocks/qenv';
import * as smartanalytics from '@push.rocks/smartanalytics';
import * as smartdelay from '@push.rocks/smartdelay';
import * as smartfile from '@push.rocks/smartfile';
import * as smartcli from '@push.rocks/smartcli';
import * as smartgit from '@push.rocks/smartgit';
import * as smartlog from '@push.rocks/smartlog';
import * as smartlogDestinationLocal from '@push.rocks/smartlog-destination-local';
import * as smartobject from '@push.rocks/smartobject';
import * as smartpath from '@push.rocks/smartpath';
import * as smartpromise from '@push.rocks/smartpromise';
import * as smartrequest from '@push.rocks/smartrequest';
import * as smartshell from '@push.rocks/smartshell';
import * as smartsocket from '@push.rocks/smartsocket';
import * as smartssh from '@push.rocks/smartssh';
import * as smartstring from '@push.rocks/smartstring';
export {
lik,
npmextra,
projectinfo,
qenv,
@@ -44,7 +46,7 @@ export {
smartcli,
smartlog,
smartlogDestinationLocal,
smartparam,
smartobject,
smartpath,
smartpromise,
smartrequest,