Мне нужно организовать публикацию пакетов NPM с помощью TeamCity. У меня есть несколько пакетов NPM внутри одного git-репо. Когда я нажимаю изменения, мне нужно определить, какие пакеты были изменены, обновить их версию, сделать commit & нажатием новой версии и опубликовать новый пакет. Есть ли какой-нибудь инструмент, который может это сделать?Как сделать автоматическую публикацию пакетов npm?
0
A
ответ
0
Вот код, который делает автозапуск, tou может использовать, создавая задачу в TeamCity, или вы можете использовать его самостоятельно. Не забудьте установить npm необходимые пакеты.
const gulp = require('gulp');
const NodeGit = require("nodegit");
const bump = require("gulp-bump");
const semverUtils = require('semver-utils');
const npm = require('npm');
const spork = require('spork');
gulp.task('publish', function (done) {
const pathToRepo = require("path").resolve("./");
const args = require('yargs').argv;
const nextVersion = args.version;
NodeGit.Repository
.open(pathToRepo)
.then(repo => repo.getBranchCommit("master"))
.then(lastCommit => {
const repo = lastCommit.repo;
const sign = NodeGit.Signature.default(repo);
if (lastCommit.author().email() == sign.email()) {
console.info('It looks like the last commit was done by CI');
done();
process.exit(0)
}
const currentVersion = require('./package.json').version;
const semver = semverUtils.parse(currentVersion);
if (nextVersion == null) {
semver.patch++;
} else {
semver.patch = nextVersion;
}
const version = semverUtils.stringify(semver)
return gulp.src('./package.json')
.pipe(bump({ version }))
.pipe(gulp.dest('./'))
.on('end',() => {
repo
.createCommitOnHead(['package.json'], sign, sign, `Update UI lib version to v${version}`)
.then(commit => repo.createTag(commit, `v${version}`, ''))
.then(() => pushGit())
.then(() => console.info('Made commit with changed package.json and made push'), err => console.error(err))
.then(() => publishNpm())
.then(() => done())
.then(() => process.exit(0))
});
})
});
function pushGit() {
console.info('Start commiting to GIT');
return new Promise((resolve, reject) =>
spork('git', ['push'], { exit: false })
.on('exit:code', function (code) {
if (code === 0) {
resolve();
} else {
reject();
}
})
)
}
function publishNpm() {
console.info('Start publishing to NPM');
return new Promise((resolve, reject) => {
npm.load({}, err => {
err && reject(err);
npm.publish(err => {
err && reject(err);
resolve();
});
});
})
}