最近发了个 npm package (koa-flash-message) 用于 kails 的 flash message 管理,发现手动 publish 还是比较麻烦了,所以决定利用 github tag 和 travis ci 来构建基于 tag 的自动化 publish 系统。
个人原创,版权所有,转载请注明原文出处,并保留原文链接:
基于 github tag 与 travis 构建 npm 自动化 release 系统
https://www.embbnux.com/2017/05/09/auto_npm_publish_with_github_tag_and-travis/
一、原理
travis 和 github 相连后能在 github repo 有动作时执行相应的操作。这里当在 github repo 里创建 tag 里, travis 执行相应的脚本编译并 publish 代码到 npm 上。
二、实现
连接 travis, .travis.yml:
language: node_js node_js: - '6' - '7' install: - npm install script: - npm test deploy: provider: npm email: [email protected] api_key: secure: secure_token on: node: 6 skip_cleanup: true tags: true repo: embbnux/koa-flash-message condition: "$TRAVIS_TAG =~ ^[0-9]+.[0-9]+.[0-9]+"
这里配置在 github 新建 tag 时,并且 tag 格式为 1.0.0 这样的情况下执行 deploy, 而 deploy 执行 npm publish, 管理 怎么在 travis 配置 npm 看这里。
release.js 脚本:
源码是需要经过编译才能推到 npm 的,不然用户也用不了,所以 npm publish 以前应该先执行 release 脚本。这里在 package.json 里的 scripts 添加: “prepublish”: “node release.js” , 这样 publish 之前就会自行编译。
release 脚本主要功能为 compile 和修改 package.json 里的版本号。这里版本号改为 tag 号,这样就不用每个升级版本都要手动修改 package.json 文件了。
const fs = require('fs');
const execSync = require('child_process').execSync;
function cmd(command) {
try {
const result = execSync(command);
return result.toString()
} catch (error) {
throw(error);
}
}
function getVersion() {
try {
let tag = cmd('git describe --exact-match --tags $(git rev-parse HEAD)');
console.log('tag');
console.log(tag);
tag = tag.replace(/\r?\n|\r/g, '');
if (/^\d+.\d+.\d+/.test(tag)) {
return tag;
}
return null;
} catch (e) {
return null;
}
}
console.log('start release prepare');
const packageInfo = JSON.parse(fs.readFileSync('package.json'));
delete packageInfo.scripts;
console.log('start release compile');
cmd('npm run compile');
console.log('start release coverage');
cmd('npm run coverage');
packageInfo.main = 'lib/index.js';
const version = getVersion();
if (version) {
console.log('update release version');
packageInfo.version = version;
}
fs.writeFileSync('package.json', JSON.stringify(packageInfo, null, 2));
console.log('finish release prepare');
Contact GitHub API Training Shop Blog About