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