最近又把爛尾的開源項目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"
}
},