基于 github tag 与 travis 构建 npm 自动化 release 系统

最近发了个 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

整体效果和代码看 https://github.com/embbnux/koa-flash-message

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

Time limit is exhausted. Please reload the CAPTCHA.

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据