This commit is contained in:
Timo Hocker 2020-04-18 19:00:27 +02:00
parent 168fc577d9
commit dde41c085e
14 changed files with 156 additions and 67 deletions

View File

@ -13,9 +13,11 @@ async function apply_template (
destination: string destination: string
): Promise<void> { ): Promise<void> {
const dst = path.join (process.cwd (), destination); const dst = path.join (process.cwd (), destination);
if (!await fs.pathExists (dst)) if (!await fs.pathExists (dst)) {
await fs.mkdirp (path.dirname (dst));
await fs.writeFile (dst, contents); await fs.writeFile (dst, contents);
} }
}
type JSONMutator = { type JSONMutator = {
// eslint-disable-next-line @typescript-eslint/no-explicit-any // eslint-disable-next-line @typescript-eslint/no-explicit-any
@ -43,22 +45,13 @@ async function modify_json (
* *
* @param {string} command command to run * @param {string} command command to run
* @param {string} folder folder to run in * @param {string} folder folder to run in
* @returns {Promise<void>} promise
*/ */
function run_command (command: string, folder = ''): Promise<void> { function run_command (command: string, folder = ''): void {
return new Promise ((res) => { // eslint-disable-next-line no-sync
child_process.exec ( child_process.execSync (
command, command,
{ cwd: path.join (process.cwd (), folder) }, { cwd: path.join (process.cwd (), folder), stdio: 'inherit' }
(err, stdout, stderr) => {
if (err)
throw err;
// eslint-disable-next-line no-console
console.log (stdout + stderr);
res ();
}
); );
});
} }
export { modify_json, apply_template, run_command }; export { modify_json, apply_template, run_command };

11
lib/asset.d.ts vendored
View File

@ -1,11 +0,0 @@
/*
* Copyright (C) SapphireCode - All Rights Reserved
* This file is part of Snippeteer which is released under BSD-3-Clause.
* See file 'LICENSE' for full license details.
* Created by Timo Hocker <timo@scode.ovh>, April 2020
*/
declare module '*.asset' {
const content: any;
export default content;
}

View File

@ -0,0 +1,102 @@
/* eslint-disable max-len */
const general = { jenkinsfile: '' };
const node = { jenkinsfile: '', js: '' };
general.jenkinsfile = `pipeline {
agent any
environment {
VERSION = VersionNumber([
versionNumberString:
'\${BUILDS_ALL_TIME}',
versionPrefix: '1.0.',
worstResultForIncrement: 'SUCCESS'
])
publish = 0
}
stages {
stage('Setup') {
steps {
script {
currentBuild.displayName = env.VERSION
}
echo 'Setting up test environment'
sh 'echo setup'
}
}
}
post {
success {
script {
publish = sh script: "git log -1 | grep '\\\\[no publish\\\\]'", returnStatus: true
if (publish != 0) {
echo 'Deploying'
sh 'echo deploy'
} else {
echo 'Build successful, Commit not marked for deploying'
currentBuild.result = "UNSTABLE"
}
}
}
}
}
`;
node.jenkinsfile = `pipeline {
agent any
environment {
VERSION = VersionNumber([
versionNumberString:
'\${BUILDS_ALL_TIME}',
versionPrefix: '1.0.',
worstResultForIncrement: 'SUCCESS'
])
}
stages {
stage('Building') {
steps {
script {
currentBuild.displayName = env.VERSION
}
sh 'yarn ci \${VERSION}'
}
}
}
}
`;
node.js = `/* eslint-disable no-process-exit */
/* eslint-disable no-console */
/* eslint-disable no-sync */
'use strict';
const fs = require ('fs');
const child_process = require ('child_process');
const pkg = JSON.parse (fs.readFileSync ('package.json', 'utf-8'));
[
,, pkg.version
] = process.argv;
fs.writeFileSync ('package.json', JSON.stringify (pkg, null, 2));
child_process.execSync ('yarn lint', { stdio: 'inherit' });
if (typeof pkg.scripts !== 'undefined' && typeof pkg.scripts.test === 'string')
child_process.execSync ('yarn test', { stdio: 'inherit' });
if (typeof pkg.scripts !== 'undefined' && typeof pkg.scripts.compile === 'string')
child_process.execSync ('yarn compile', { stdio: 'inherit' });
child_process.exec ('git log -1 | grep \\'\\\\[no publish\\\\]\\'')
.addListener ('exit', (code) => {
if (code === 0) {
console.log ('build not marked for deployment');
process.exit (1);
}
else { child_process.execSync ('yarn publish'); }
});
`;
export { general, node };

View File

@ -9,11 +9,9 @@ import { Confirm } from 'enquirer';
import { Snippet } from '../../Snippet'; import { Snippet } from '../../Snippet';
import { apply_template, modify_json } from '../../Helper'; import { apply_template, modify_json } from '../../Helper';
import node_js from './template/node/jenkins.js.asset'; import { general, node } from './Assets';
import node_jenkinsfile from './template/node/Jenkinsfile.asset';
import general_jenkinsfile from './template/general/Jenkinsfile.asset';
export class Jenkins implements Snippet { export default class Jenkins implements Snippet {
public async start (): Promise<void> { public async start (): Promise<void> {
const is_node = await new Confirm ({ const is_node = await new Confirm ({
message: 'is the current project using nodejs?', message: 'is the current project using nodejs?',
@ -22,8 +20,8 @@ export class Jenkins implements Snippet {
.run (); .run ();
if (is_node) { if (is_node) {
await apply_template (node_js, 'jenkins.js'); await apply_template (node.js, 'jenkins.js');
await apply_template (node_jenkinsfile, 'Jenkinsfile'); await apply_template (node.jenkinsfile, 'Jenkinsfile');
// eslint-disable-next-line @typescript-eslint/no-explicit-any // eslint-disable-next-line @typescript-eslint/no-explicit-any
await modify_json ((obj: any): any => { await modify_json ((obj: any): any => {
obj.scripts.ci = 'yarn && node jenkins.js'; obj.scripts.ci = 'yarn && node jenkins.js';
@ -31,7 +29,7 @@ export class Jenkins implements Snippet {
}); });
} }
else { else {
await apply_template (general_jenkinsfile, 'Jenkinsfile'); await apply_template (general.jenkinsfile, 'Jenkinsfile');
} }
} }
} }

View File

@ -0,0 +1,31 @@
const eslintrc = `module.exports = {
env: {
commonjs: true,
es6: true,
node: true
},
extends: [
'@scode'
],
globals: {
Atomics: 'readonly',
SharedArrayBuffer: 'readonly'
},
parserOptions: {
ecmaVersion: 2018
}
}
`;
const gitignore = `/node_modules/
/dist/
/.nyc_output/
/coverage/
`;
const index = '';
const npmrc = `@scode:registry=https://npm.scode.ovh
`;
export { eslintrc, gitignore, index, npmrc };

View File

@ -11,12 +11,9 @@ import { Snippet } from '../../Snippet';
import { apply_template, modify_json, run_command } from '../../Helper'; import { apply_template, modify_json, run_command } from '../../Helper';
import eslintrc from './template/eslintrc.asset'; import { eslintrc, gitignore, index, npmrc } from './Assets';
import npmrc from './template/npmrc.asset';
import index from './template/index.asset';
import gitignore from './template/gitignore.asset';
export class Node implements Snippet { export default class Node implements Snippet {
public async start (): Promise<void> { public async start (): Promise<void> {
const folder = await new Input ( const folder = await new Input (
{ message: 'project name (leave empty for current folder):' } { message: 'project name (leave empty for current folder):' }
@ -28,9 +25,9 @@ export class Node implements Snippet {
await apply_template (index, path.join (folder, 'index.js')); await apply_template (index, path.join (folder, 'index.js'));
await apply_template (gitignore, path.join (folder, '.gitignore')); await apply_template (gitignore, path.join (folder, '.gitignore'));
await run_command ('git init', folder); run_command ('git init', folder);
await run_command ('yarn init -y', folder); run_command ('yarn init -y', folder);
await run_command ( run_command (
'yarn add --dev @scode/eslint-config eslint nyc ava', 'yarn add --dev @scode/eslint-config eslint nyc ava',
folder folder
); );

View File

@ -1,17 +0,0 @@
module.exports = {
env: {
commonjs: true,
es6: true,
node: true
},
extends: [
'@scode'
],
globals: {
Atomics: 'readonly',
SharedArrayBuffer: 'readonly'
},
parserOptions: {
ecmaVersion: 2018
}
}

View File

@ -1,4 +0,0 @@
/node_modules/
/dist/
/.nyc_output/
/coverage/

View File

@ -1 +0,0 @@
@scode:registry=https://npm.scode.ovh

View File

@ -16,15 +16,16 @@
"url": "git@git.scode.ovh:timo/snippeteer" "url": "git@git.scode.ovh:timo/snippeteer"
}, },
"files": [ "files": [
"/snippets/", "/dist/",
"/assets/",
"LICENSE" "LICENSE"
], ],
"author": "Timo Hocker", "author": "Timo Hocker",
"license": "BSD-3-Clause", "license": "BSD-3-Clause",
"devDependencies": { "devDependencies": {
"@scode/eslint-config-ts": "^1.0.19", "@scode/eslint-config-ts": "^1.0.21",
"@types/fs-extra": "^8.1.0", "@types/fs-extra": "^8.1.0",
"@types/node": "^13.11.1", "@types/node": "^13.13.0",
"eslint": "^6.8.0", "eslint": "^6.8.0",
"typescript": "^3.8.3" "typescript": "^3.8.3"
}, },