Как сделать автоматическую публикацию пакетов npm?

#npm #continuous-integration #teamcity

#npm #непрерывная интеграция #teamcity

Вопрос:

Мне нужно организовать автоматическую публикацию пакетов NPM с помощью TeamCity. У меня есть несколько пакетов NPM внутри одного репозитория git. Когда я нажимаю изменения, мне нужно определить, какие пакеты были изменены, обновить их версию, выполнить фиксацию и нажать с новой версией и опубликовать новый пакет. Есть ли какой-нибудь инструмент, который может это сделать?

Ответ №1:

Вот код, который делает автоматическую публикацию, который вы можете использовать, создав задачу в 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 amp;amp; reject(err);

            npm.publish(err => {
                err amp;amp; reject(err);
                resolve();
            });
        });
    })
}