Недавно библиотека, используемая в компании, была выпущена на частный сервер npm в интрасети. Опубликовать ее относительно просто, но эта библиотека поддерживается несколькими людьми, и существует только один набор частных серверов npm, поэтому производство среда и разработка Используется одна и та же среда, поэтому возникает наше требование: как спроектировать процесс разработки и автоматизированный процесс выпуска пакетов npm. Этот набор процессов мы хотим достичь следующих целей
- Поддержка совместной работы команды: когда разработчики отправляют код, другие могут вовремя синхронизироваться с последним кодом.
- Способен поддерживать регулярную итерацию и исправление онлайн
- Номера версий эталонных пакетов в средах разработки, тестирования и производства одной и той же версии совпадают.
- Автоматизированная публикация, сокращение ручного труда
Давайте поговорим о том, как собрать приватный сервер npm и как отправлять пакеты, но это не является предметом этой статьи, поэтому мы кратко представим
сборка приватного сервера npm
В настоящее время наиболее популярными являютсяnexus
а такжеVerdaccio
,потому чтоVerdaccio
Чтобы быть легче, а также удовлетворить наши потребности, поэтому мы выбираем его.Verdaccio
Конструкция очень проста, просто используйте конфигурацию по умолчанию.
npm install -g verdaccio
or
yarn global add verdaccio
verdaccio
Таким образом создается частный сервер.
выпуск пакета npm
С частным сервером мы сначала регистрируемся на локальном npm.npm set registry http://localhost:4873
Затем добавьте пользователя, если это первый раз, будет создан новый пользователь.npm adduser --registry http://localhost:4873
наконец опубликоватьnpm publish
Есть два способа установить номер версии, один из них — ручная модификация.package.json
серединаversion
// package.json
{
"name": "project",
"version": "1.0.0",
}
Другой черезnpm version
Для изменения номера версии предоставляются следующие параметры
npm version [<newversion> | major | minor | patch | premajor | preminor | prepatch | prerelease [--preid=<prerelease-id>] | from-git]
Подробное объяснение выглядит следующим образом:
newversion:自定义版本号,除了已经发布的版本号,想写啥写啥
major:升级主版本号 1.0.0 -> 2.0.0
minor:升级次版本号 1.0.0 -> 1.1.0
patch:升级补丁号 1.0.0 -> 1.0.1
premajor:预备主版本
preminor:预备次版本
prerelease:预发布版本
в исполненииnpm version
После этого будет сгенерирована новая запись коммита, например, выполнениеnpm version 2.0.0
После этого проверьте журнал, вы найдете сообщение фиксации как2.0.0
Запись представления , почему создается эта запись? просто потому чтоnpm version
Эта строка команды фактически изменяет версию в package.json и отправляет ее после модификации, поэтому есть эта новая запись об отправке. Если вы хотите настроить запись отправки, вы можете написать такnpm version 2.0.0 -m "Upgrade to %s for reasons"
в%s
это исправленный номер версии.
gitlab CI
Мы планируем использовать gitlab CI для автоматического выпуска, а также кратко расскажем о некоторых шагах и элементах конфигурации gitlab CI.
- Проект запускает CI и выбирает публичный раннер, если нет, то вы можете получить его только сами.
- Новый корневой каталог проекта
.gitlab-ci.yml
, напишите конфигурацию, подробную конфигурацию можно посмотретьофициальный сайт гитлаб
# 定义 stages
stages:
- build
定义 job
job1:
stage: build
script:
- echo 'xxx'
- Конфигурация завершена
этап проектирования
Ключевой момент, о котором мы хотим поговорить, здесь, мы познакомим вас с нашими дизайнерскими идеями посредством рисования. Давайте установим некоторые соглашения
отраслевая конвенция
Планирование ветки проекта, задать три ветки
-
feature
Разветвление: регулярная формация -
master
Филиал: стабильная ветвь -
hotfix
Ветка: При наличии аварийной модификации эта ветка создается как временная ремонтная ветка, чтобы не влиять на развитие штатных функций
Соглашение о номере версии
Мы используем大版本:小版本:次版本号
Таким образом, каждая фиксация в каждой функциональной ветке запускает обновление этого номера версии.Например, номер версии текущей функциональной ветки1.1.5
то следующая фиксация будет эскалирована до1.1.6
И выпустите npm, младший номер версии итеративно обновляется с помощью обычных требований, например, текущий1.1.8
, то завтра будет запущен периодический спрос, то после запуска номер версии будет повышен до1.2.0
И опубликовать npm, все нашли1.1.8
а также1.2.0
Это один и тот же код, да, причина в том, что минорный номер версии соответствует обычной модификации цикла, тогда обновленный1.2.0
Это номер версии, используемый в качестве следующего общего требования. Таким образом, этот номер версии соответствует каждой отправке, а дополнительный номер версии соответствует текущему этапу разработки. Мы оба можем инициировать модификацию через CI, нет необходимости С ручным участием , по-прежнему существует большой номер версии. Его можно изменить вручную только в случае основной версии. Вообще говоря, частота обновления большого номера версии относительно низка, и его изменение вручную вполне допустимо.
Вы обнаружите, что каждое представление запускаетnpm version patch & npm publish
Это кажется слишком частым, но чтобы удовлетворить командную работу, ему приходится идти на небольшие уступки. Таким образом, функция этого номера версии здесь не в том, чтобы отличить версию, маленький номер версии действительно используется для различения версии, поэтому, когда мы ссылаемся на этот npm, нам нужно контролировать номер версии таким образом, например
"my-package": "~1.2.0"
Заблокируйте основные и дополнительные номера версий, чтобы наши ссылки были актуальными, независимо от того, сколько коммитов мы сделали во время разработки.
Временная диаграмма
Нарисуйте диаграмму последовательности разработки и выпуска следующим образом.
Диаграмма последовательности процесса разработки
Схема последовательности разработки выглядит следующим образом
Диаграмма последовательности процесса выпуска
Реализация кодирования
В основном кодирование CI, как показано ниже
# .gitlab-ci.yml
# 定义 stages
stages:
- publish
# 定义 job
job2:
stage: publish
before_script:
- cd /home/node/MY #进到项目目录
- git checkout .
- git checkout $CI_COMMIT_REF_NAME || git checkout -b $CI_COMMIT_REF_NAME
- git pull -f -X theirs origin $CI_COMMIT_REF_NAME
- yarn
script:
- node publish.js
// publish.js
var shell = require('shelljs');
var git = require('git-last-commit');
var featureBranchName = 'feature-npm';
// 判断文本是否是版本号格式
function checkCommitMessage(subject) {
return /^\d+.\d+.\d+$/g.test(subject)
}
// 获取最近一次提交,判断是否是版本号格式,若不是,则进行发布,
git.getLastCommit(function(err, commit) {
console.log(commit);
const { subject, sanitizedSubject } = commit;
shell.exec('echo $CI_COMMIT_REF_NAME');
if (!checkCommitMessage(subject)) {
if (sanitizedSubject.indexOf(`Merge-branch-${featureBranchName}-into-master`) > -1) {
shell.exec('git checkout .');
shell.exec(`git checkout ${featureBranchName} || git checkout -b ${featureBranchName}`);
shell.exec(`git pull -f -X theirs origin ${featureBranchName}`);
shell.exec('npm version minor');
shell.exec('npm publish');
shell.exec(`git push origin ${featureBranchName}`);
} else {
shell.exec('npm version patch');
shell.exec('npm publish');
shell.exec('git push origin $CI_COMMIT_REF_NAME');
}
}
});
// package.json
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"prepublish": "build script"
},
В скрипте публикации есть функцияcheckCommitMessage
Он используется для определения того, имеет ли последнее отправленное сообщение формат номера версии, потому что в конце у нас будет операция отправки, и CI будет снова запущен после отправки, поэтому, чтобы предотвратить бесконечный цикл, мы используем отправленное сообщение в качестве основы для запуска CI, поэтому, как только мы придем к стандартизации формата сообщения, я предлагаю следовать этому формату.U ${修改的具体的内容}
.
резюме
Это решение не является универсальным, ведь процесс разработки у каждой команды разный, и на данный момент это решение подходит для нашего текущего сценария. Если есть сцена друга, которая соответствует нашей, можете попробовать, если у вас есть план получше, добро пожаловать на общение~