• 基于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 && /^vd+.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) + '
    ')
    }
    

    走package.json中添加下面的命令,prepublishOnly前检查一下版本,同时使用husky走代码pre-commit阶段检查一下tag来更新版本.这样可以始终保持最新的tag和包的版本一致

      "scripts": {
        "prepublishOnly": "node release.js"
      },
      "husky": {
        "hooks": {
          "pre-commit": "npm run prepublishOnly"
        }
      },
    

    参考

    npm Releasing

  • 相关阅读:
    sdut 2413:n a^o7 !(第三届山东省省赛原题,水题,字符串处理)
    poj 2406:Power Strings(KMP算法,next[]数组的理解)
    hrbustoj 1551:基础数据结构——字符串2 病毒II(字符串匹配,BM算法练习)
    hrbustoj 1179:下山(DFS+剪枝)
    [Linux] 通过指令修改时区 tzselect
    Ubuntu 历史版本下载
    RK3288 USB UVC camera 摄像头 VIDIOC_DQBUF Failed!!! err[I/O error]
    Android Activity活动状态及生存周期
    Android 系统四大组件
    Android JNI访问Java成员
  • 原文地址:https://www.cnblogs.com/star91/p/ji-yutravis-hegit-tag-shi-xiannpm-zi-dong-hua-fa-b.html
Copyright © 2020-2023  润新知