semantic-release 集成

December 20, 20184分钟阅读

背景

最近由于公司需求, 需要向 npm 推送不少包, 但是包的版本管理很麻烦。于是就寻找有没有什么高级一点的办法,首选是自己写脚本, 然后发现了 semantic-release

semantic-release automates the whole package release workflow including: determining the next version number, generating the release notes and publishing the package. 自动化发布 package 包括: 决定迭代版本, 生产 release 日志, 以及推送 package 到服务器

初看正好符合我的需求, 故就尝试将它集成到我的mogul

安装

项目根目录:

yarn add semantic-release --dev

然后在目录下创建文件.releaserc, 配置方式和 .babelrc类似, 就是一个 json 文件

{
  "branch": "master",
  "dryRun": false,
  "debug": false,
  "plugins": [
    "@semantic-release/commit-analyzer",
    "@semantic-release/release-notes-generator",
    [
      "@semantic-release/npm",
      {
        "tarballDir": "dist"
      }
    ],
    [
      "@semantic-release/git",
      {
        "assets": ["package.json"],
        "message": "chore(🤖):${nextRelease.version} [skip ci]\n\n${nextRelease.notes}"
      }
    ],
    [
      "@semantic-release/github",
      {
        "assets": "dist/*.tgz"
      }
    ]
  ],
  "preset": "angular"
}
字段 描述
branch 发布 git 分支名字, 我的需求是只对 master 起作用
dryRun 是否空跑, 用于测试, false
debug 是否打印更多信息, 便于调试, 用于测试, false
preset 默认就是angular, react 没有对应的 preset, 所以选了angular
plugins 一系列的配置, 注意, 这些和 babel 不同, 不需要安装这些依赖

至此,安装完成! Easy!

circleci 构建

21 世纪的项目不走 CI 构建就显得 out 了, 新增 .circleci/config.yml。更多配置请见 circleci

version: 2
jobs:
  test:
    docker:
      - image: circleci/node

    working_directory: ~/repo

    steps:
      - checkout
      - restore_cache:
          keys:
            - v1-dependencies-{{ checksum "package.json" }}
            - v1-dependencies-

      - run: yarn install

      - save_cache:
          paths:
            - node_modules
          key: v1-dependencies-{{ checksum "package.json" }}

      - run: yarn run test
  release:
    docker:
      - image: circleci/node
    steps:
      - checkout
      - run: yarn install
      - run: yarn run build
      - run: npx semantic-release # 使用 npx semantic-release 替代npm publish
workflows:
  version: 2
  test_and_release:
    jobs:
      - test      - release:          requires:            - test # 只有测试完成, 才能执行release          filters:            branches:              only: master # 设置 release只对master生效

同样的, 需要在 circleci 中设置全局环境变量:

我的包都是基于 npm 的, 故其他的仓库需要对应仓库的token

CI 配置结束。

如果不用 ci, 那么在项目根目录下执行 npx semantic-release 即可。当然 GH_TOKEN, NPM_TOKEN 也都是要的

其他

1 : 花了这么多时间加的高大上插件, 一定要让别人知道, 在 readme.md 下加入如下内容

[![semantic-release](https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg)](https://github.com/semantic-release/semantic-release)

效果如下: semantic-release

2 : 默认 semantic-release 不会重新 commit 新版本的代码, 所以你 npm install 的包版本永远不会更新, 如何解决 使用插件 @semantic-release/git, 在 .releaserc加入

[
  "@semantic-release/git",
  {
    "assets": ["package.json"],
    "message": "chore(🤖):${nextRelease.version} [skip ci]\n\n${nextRelease.notes}"
  }
]

3 : preset: angular是什么? angular Commit Message Conventions就是一套 git 生成 release 日志的约定, 如果是开源项目, 使用效果不错,能减少很多工作量, 但是似乎不适合生成业务逻辑的 changelog

效果如下: 是不是效果还凑活

semantic-release-tag-version
semantic-release-tag-version

结论

相比于用脚本的方式自动发布, semantic-release 更简单、高大上。但也有缺点, 对于内部项目, 不适合, 缺少相关插件,还不如自己写脚本效率和实用

缺陷

不支持多分支工作流, 例如 pre-release, 这对复杂项目及其不友好。幸好release-workflows正在开发, 也许将来某个版本就能支持多分支工作流了,我拭目以待。

未经许可, 不可转载