最近又把烂尾的开源项目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,有两种方法可以获取

  1. 登录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"
}
},



参考

npm Releasing

基于travis和git tag 实现npm自动化发版的更多相关文章

  1. CICD自动化发版系统设计简介

    第一篇. 版本迭代是每一个互联网公司必须经历的,尤其是中小型公司,相信不少人踩到过很多坑.接下来的一系列文章将介绍我设计的自动化发版系统! 很多公司没有把配置独立出去,代码的构建.发版通过一个Jenk ...

  2. CI/CD自动化发版系统设计简介

    转载自:https://www.cnblogs.com/wellful/archive/2004/01/13/10604151.html 版本迭代是每一个互联网公司必须经历的,尤其是中小型公司,相信不 ...

  3. 博客 | 基于Travis CI实现Hexo在Github和Coding的同步自动化部署

    文章目录 完成Hexo主题安装和配置 基于Travis CI实现同步部署 参考内容 相关链接 待补充 完成Hexo主题安装和配置 如果您还没有安装Hexo环境,请参考Hexo文档安装,也给出这样两篇博 ...

  4. Jenkins自动化部署服务器及git 提交及git tag标签版本更新流程,超详细!

    工作中部署的项目和服务器较多时就用上了Jenkins进行自动部署 优点 不用在连接单独的服务器进行更新项目,再启动项目服务的操作了 更新部署都是自动的,比较方便.适合大批量的部署 一.git流程部分 ...

  5. 基于Travis CI实现 Gitbook在 Github 和 Coding 的同步部署

    前言 最近发现自己的博客在使用vpn的情况下打开很慢,百度站点也抓取失败,于是将自己的博客借助hexo-deploy 插件很容易同步部署到了coding上.只需要在你的hexo配置文件_config. ...

  6. 利用Travis IC实现Hexo博客自动化部署

    1.Hexo博客的利与弊 Hexo中文 我就默认为看到这篇文章的人都比较了解Hexo博客,也都能够成功手动部署吧.所以第一部分推荐两篇文章一笔带过,让我们快速进入本文的重点内容.实在不知道也不要方先看 ...

  7. repo 导出本地 git tag 给他人

    背景 使用 repo 管理了多个 git 仓库,有时需要将本地仓库的tag同步给其他人,但又不能直接推到远程(例如权限问题). 实际场景举例 本地复现了一个问题,需要让其他人回退到相同环境来排查. 本 ...

  8. 基于 Jenkins+Docker+Git 的CI流程初探

    在如今的互联网时代,随着软件开发复杂度的不断提高,软件开发和发布管理也越来越重要.目前已经形成一套标准的流程,最重要的组成部分就是持续集成(Continuous Integration,CI)及持续部 ...

  9. idea git tag 管理

    项目release 之后一般都会打一个tag 做记录.本人使用idea管理tag的时候,遇到的问题做一些记录. 1:idea 创建tag idea 创建tag ,我们可以右键项目,然后按照下图操作创建 ...

随机推荐

  1. LeetCode 741. Cherry Pickup

    原题链接在这里:https://leetcode.com/problems/cherry-pickup/ 题目: In a N x N grid representing a field of che ...

  2. Clickhouse 性能瓶颈排查 IO过高

    前几天公司clickhouse 有个查询很慢.经理一直追问为什么慢 是cpu 不够 还是IO 占用太高,还是其他的原因.于是有了以下的排查 执行该条,在不考虑优化sql 的情况下 进行性能排查 1.首 ...

  3. presto docker简单试用

    starburstdata 团队提供了一个docker 版本的presto,其中已经内置了几个connectors tpch tpcds memory backhole jmx system pull ...

  4. Cogs 732. [网络流24题] 试题库(二分图)

    [网络流24题] 试题库 ★★ 输入文件:testlib.in 输出文件:testlib.out 评测插件 时间限制:1 s 内存限制:128 MB «问题描述: 假设一个试题库中有n道试题.每道试题 ...

  5. 洛谷 P4017 最大食物链计数 题解

    P4017 最大食物链计数 题目背景 你知道食物链吗?Delia生物考试的时候,数食物链条数的题目全都错了,因为她总是重复数了几条或漏掉了几条.于是她来就来求助你,然而你也不会啊!写一个程序来帮帮她吧 ...

  6. Python 企业面试题集锦之Python基础

    △字符串.列表.元组.字典每个常用的5个方法? 字符串: 字符串用单引号(')或双引号(")括起来,不可变. s.strip(c):去除空格或指定的字符c:lstrip/rstrip: s. ...

  7. mysql sin() 函数

    mysql> ); +---------------------+ | sin(PI()/) | +---------------------+ | 0.49999999999999994 | ...

  8. Linux 文件系统磁盘空间与连接文件

    磁盘与目录的容量 我们知道磁盘的整体数据hi在superblock块中,但是各文件的容量则在inode中记载. df:列出文件系统的整体磁盘使用量 由于df主要读取的数据几乎都是针对整个文件系统,因此 ...

  9. updateprimarykey 和updateprimaryKeySelective

    updateprimarykey 会对左右的字段都进行更新,updateprimaryKeySelective 只会对不为null的字段进行更新..所以在填表的web项目需要注意这个两个方法的选择,因 ...

  10. Java-Maven(十一):Maven 项目出现pom.xml错误:Plugin execution not covered by lifecycle configuration: org.apache.maven.plugins:maven-compiler-plugin

    Maven项目出现ERROR: eclipse更新了Maven插件后,让后就出现了以下错误: Description Resource Path Location Type Conflicting l ...