基于travis和git tag 实现npm自动化发版
最近又把烂尾的开源项目alfred-femine拾起来了,这个项目旨在开发一系列前端常用的alfred workflow,提供前端开发的查询效率.时隔这么久,再次搞起,希望自己能够一直维护下去,也欢迎志同道合的同学一起完善这个工具链。

为了便于项目的维护,我觉得用上传说中的“持续集成”的思想,本人不才,虽然看过很多持续集成的文章,但是连这种npm发包这种简单的“持续集成”都没实践过,这次下定决心要用上它,早就听说过Github和Travis是天生的组合,就使用它了
需要注意的是,目前Travis维护了两套系统,之前travis-ci.com是给私人付费用户使用的,travis-ci.org是给免费开源项目使用的,但是2018年某个时候,官方统一了到travis-ci.com一个平台下,逐步迁移travis-ci.org的项目到travis-ci.com,并且对于开源项目仍然免费.
travis-ci.com
travis-ci.org
目前网上的教程基本上还是以travis-ci.org为例,官方还是建议新项目直接对接到travis-ci.com,如果使用的是travis-ci.org按照官方教程可能会遇到一些坑
使用travis非常简单,使用github授权登录travis平台,打开需要build的项目。

在项目根目录下,添加一个配置文件.travis.yml
,大体如下,后面会一一解释其中的字段。
language: node_js
node_js:
- '8'
deploy:
provider: npm
email: YOUR_EMAIL
api_key: YOUR_AUTH
skip_cleanup: true
on:
tags: true
branch: master
tag: latest
condition: '$TRAVIS_TAG =~ ^v[0-9]+.[0-9]+.[0-9]+$'
language: 项目语言
node_js
node_js: - '8'指定node版本
deploy:字段配置部署选项npm:指定包管理工具
email:是你在npm注册的账户邮箱
api_key:是授权travis平台发布包到npm的令牌,该选项后面会介绍如何生成
skip_cleanup:配置travis平台是否清理生成的额外文件,为true
则跳过
on:tags:一般情况下,只有需要版本更新时,才需要发布到npm平台,通常我们通过打tag来实现,指定
tags: true
这样travis只会在我们向git仓库提交tag时才会发布到npm
branch:指定代码分支tag: latest指定npm发布的包的tag,这里指定为最新版
condition:'$TRAVIS_TAG =~ ^v[0-9]+.[0-9]+.[0-9]+$'
指定只有当tag的为vx.x.x(如v1.0.0)才发包
上面的一些字段中,api_key的生成比较麻烦,首先我们需要获取npm平台的授权token,有两种方法可以获取
- 登录npm平台,到Profile Settings页面可以生成token,注意需要publish权限

2.使用NPM CLI command npm adduser
to 添加你的npm账户, 然后打开 ~/.npmrc
文件:里面有个authToken
的字段就是需要的token
$ npm adduser
Username: xxxx
Password:
Email: (this IS public) xxxxx
Logged in as feminer on https://registry.npmjs.org/.
这里我也踩了一个坑,我在使用nrm管理npm源,在登录npm时,需要把源切换回
https://registry.npmjs.org/.
通过上面两种方法获取的token不能直接放到.travis.yml
的配置中,因为你的代码是开源的,别人直接拿到你的token就不安全了,travis提供了加密的方法,需要先安装命令行工具
sudo gem install travis
安装好后需要在项目根目录下
travis encrypt YOUR_AUTH_TOKEN --add deploy.api_key
直接执行上面的命令可以会出现not logged in, please run travis login --pro
的错误
$ travis login --pro
We need your GitHub login to identify you.
This information will not be sent to Travis CI, only to api.github.com.
The password will not be displayed.
Try running with --github-token or --auto if you don't want to enter your password anyway.
Username: xxxxx
Password for xxxx: ***********
Bad credentials
for a full error report, run travis report --pro
上面的命令需要输入github的账户,但是我在执行命令的时候还是报错了,查找资料才发现我原来对接到了travis-ci.org,需要执行下面的命令才能登录成功
$ travis login --org
最后再加密
$ travis encrypt TOKRN --add deploy.api_key --org
该命令执行完后会自动修改.travis.yml
文件
这里我还踩了一个坑,为了快速安装npm包,我在项目根目录添加了一个.npmrc
文件规定了npm源,我改成了淘宝源,发现后面travis发包时token错误,应该制定为官方源
//registry=https://registry.npm.taobao.org/
registry=https://registry.npmjs.org/
另一个需要解决的问题是npm包版本的问题,当然我们可以直接修改package.json里的版本号,再打一个tag提交代码和tag
git push origin --tags
但是这样每次修改很麻烦,还有可以导致版本号和tag不一致,我写了一个release脚本自动做这件事如下:
const fs = require('fs')
const { execSync } = require('child_process')
function cmd(command) {
try {
const output = execSync(command)
return output.toString()
} catch (error) {
return ''
}
}
function getVersion() {
try {
const tag = cmd('git describe --tags')
.split('-')
.filter(Boolean)[0]
if (tag && /^v\d+.\d+.\d+$/.test(tag)) {
return tag.slice(1)
}
return ''
} catch (error) {
return ''
}
}
const packageInfo = JSON.parse(fs.readFileSync('package.json'))
const version = getVersion()
if (version && version !== packageInfo.version) {
packageInfo.version = version
fs.writeFileSync('package.json', JSON.stringify(packageInfo, null, 2) + '\r')
}
走package.json中添加下面的命令,prepublishOnly
前检查一下版本,同时使用husky走代码pre-commit
阶段检查一下tag来更新版本.这样可以始终保持最新的tag和包的版本一致
"scripts": {
"prepublishOnly": "node release.js"
},
"husky": {
"hooks": {
"pre-commit": "npm run prepublishOnly"
}
},

参考
基于travis和git tag 实现npm自动化发版的更多相关文章
- CICD自动化发版系统设计简介
第一篇. 版本迭代是每一个互联网公司必须经历的,尤其是中小型公司,相信不少人踩到过很多坑.接下来的一系列文章将介绍我设计的自动化发版系统! 很多公司没有把配置独立出去,代码的构建.发版通过一个Jenk ...
- CI/CD自动化发版系统设计简介
转载自:https://www.cnblogs.com/wellful/archive/2004/01/13/10604151.html 版本迭代是每一个互联网公司必须经历的,尤其是中小型公司,相信不 ...
- 博客 | 基于Travis CI实现Hexo在Github和Coding的同步自动化部署
文章目录 完成Hexo主题安装和配置 基于Travis CI实现同步部署 参考内容 相关链接 待补充 完成Hexo主题安装和配置 如果您还没有安装Hexo环境,请参考Hexo文档安装,也给出这样两篇博 ...
- Jenkins自动化部署服务器及git 提交及git tag标签版本更新流程,超详细!
工作中部署的项目和服务器较多时就用上了Jenkins进行自动部署 优点 不用在连接单独的服务器进行更新项目,再启动项目服务的操作了 更新部署都是自动的,比较方便.适合大批量的部署 一.git流程部分 ...
- 基于Travis CI实现 Gitbook在 Github 和 Coding 的同步部署
前言 最近发现自己的博客在使用vpn的情况下打开很慢,百度站点也抓取失败,于是将自己的博客借助hexo-deploy 插件很容易同步部署到了coding上.只需要在你的hexo配置文件_config. ...
- 利用Travis IC实现Hexo博客自动化部署
1.Hexo博客的利与弊 Hexo中文 我就默认为看到这篇文章的人都比较了解Hexo博客,也都能够成功手动部署吧.所以第一部分推荐两篇文章一笔带过,让我们快速进入本文的重点内容.实在不知道也不要方先看 ...
- repo 导出本地 git tag 给他人
背景 使用 repo 管理了多个 git 仓库,有时需要将本地仓库的tag同步给其他人,但又不能直接推到远程(例如权限问题). 实际场景举例 本地复现了一个问题,需要让其他人回退到相同环境来排查. 本 ...
- 基于 Jenkins+Docker+Git 的CI流程初探
在如今的互联网时代,随着软件开发复杂度的不断提高,软件开发和发布管理也越来越重要.目前已经形成一套标准的流程,最重要的组成部分就是持续集成(Continuous Integration,CI)及持续部 ...
- idea git tag 管理
项目release 之后一般都会打一个tag 做记录.本人使用idea管理tag的时候,遇到的问题做一些记录. 1:idea 创建tag idea 创建tag ,我们可以右键项目,然后按照下图操作创建 ...
随机推荐
- C define详解
1.简单的define定义 #define MAXTIME 1000 一个简单的MAXTIME就定义好了,它代表1000,如果在程序里面写 if(i<MAXTIME){.........} 编译 ...
- 自定义注解-aop实现日志记录
关于注解,平时接触的可不少,像是 @Controller.@Service.@Autowried 等等,不知道你是否有过这种疑惑,使用 @Service 注解的类成为我们的业务类,使用 @Contro ...
- 解决最新版fitnesse无法运行测试用例的问题
用fitnesse-standalone.jar这个jar包时 运行测试用例会报错,显示IOException:can not run program:”c:\program files\java\j ...
- Wideband Direction of Arrival Estimation Based on Multiple Virtual Extension Arrays
基于多重虚拟扩展阵列的宽带信号DOA估计[1]. 宽带DOA估计是阵列信号处理领域的一个重要研究方向.在DOAs估计的实际应用中,信号总是会被噪声破坏,在某些情况下,源信号的数量大于传感器的数量,因此 ...
- POJ P2251 Dungeon Master 题解
深搜,只不过是三维的. #include<iostream> #include<cstring> #include<cstdio> #include<algo ...
- 微信浏览器中清缓存的方法---- http://debugx5.qq.com/
http://debugx5.qq.com/ 点击上面网址,然后把底部的四个选项打钩,然后点清除,即可把可恶的缓存清掉!!!!!
- CLR内部异常(中)
不捕捉某一个异常 常常有这种情况,代码不需要捕捉异常,但需要执行一些清理或者修正操作.虽然不总是,支持物(holders)经常用在这种场景里.在支持物(holders)不适用的情况里,CLR提供了两个 ...
- THUPC&CTS 2019 游记
day ? 去THU报了个到. day? THUPC比赛日,三个人都没有智商,各种签到题不会做,被各路神仙吊着打.G题还猜了个假结论,做了好久都不对.最后顺利打铁了. 还顺便去看一下THUAC. da ...
- [bzoj1001]狼抓兔子 最小割
题意概述:给出一张无向图,每条边有一个权值,割掉这条边代价为它的权值,求使起点不能到达终点的最小代价. 显然能看出这是个最小割嘛,然后最小割=最大流,建图的时候特殊处理一下再跑个最大流就好了. #in ...
- 【NOIP2014】真题回顾
题目链接 生活大爆炸版石头剪刀布 就是个模拟,不说了 联合权值 枚举每个点,统计它任意两个儿子的联合权值,统计的时候维护sum和max就行了 飞扬的小鸟 比较好的DP题,不难想到用dp[i][j]表示 ...