基於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,有兩種方法可以獲取

  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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM