让一切自动化,干掉所有人肉操作。对于 npm 包的作者来说,利用 semantic-release 就能解放双手,只需要提交代码,让发包自动进行。
如果代码托管在 GitHub 上,而且 npm 包最后是要发布到官方仓库里的话,那么可以配合 TravisCI 来完成。这样就非常简单,只需要运行一下: bash semantic-release-cli setup

就能自动完成相关的配置(GitHub 和 TravisCI 的 token 创建等等),而你只需要在项目里添加一个 .travis.yml 文件即可。具体实例可见:https://github.com/Jeff-Tian/wechat-oauth-ts

但是对于其他代码托管服务,或者是将包发布到自己的模块仓库,就没这么方便了。不过虽然用不了 semantic-release-cli ,但是 semantic-release 本身还是可以用的。
这里给一个具体的例子,代码托管在 Coding.Net 上,模块仓库在阿里云,利用 Jenkinsfile 来完成自动化。

在 package.json 里添加 semantic-release 相关依赖

json { ... devDependencies: { ... @semantic-release/npm: ^5.3.1, semantic-release: ^15.13.28 } ... }

在项目中添加 .releaserc 

json { branch: master, repositoryUrl: [email protected]:xxx/yyy.git, plugins: [ [@semantic-release/npm, { npmPublish: true }] ] }

在项目中创建 Jenkinsfile

groovy pipeline { agent any stages {

    stage(检出) {
        steps {
            checkout(
                [$class: GitSCM, branches: [[name: env.GIT_BUILD_REF]],
                userRemoteConfigs: [[url: env.GIT_REPO_URL, credentialsId: env.CREDENTIALS_ID]]]
            )
        }
    }

    stage(安装) {
        steps {
            echo 构建中...
            sh docker version
            sh npm i
            sh npm rebuild
            echo 构建完成.
        }
    }

    stage(测试) {
        steps {
            echo 单元测试中...
            // 请在这里放置您项目代码的单元测试调用过程,例如:
            // sh mvn test // mvn 示例
            // sh make test // make 示例
            sh npm test
            echo 单元测试完成.
        }
    }

    stage(发包) {
        steps {
            sh echo registry=https://registry-node.aliyun.com/org/xxx/registry/yyy/ >> .npmrc
            sh echo //registry-node.aliyun.com/org/xxx/registry/yyy/:_password=${npm_password} >> .npmrc
            sh echo //registry-node.aliyun.com/org/xxx/registry/yyy/:username=${npm_username} >> .npmrc
            sh echo //registry-node.aliyun.com/org/xxx/registry/yyy/:email=${npm_email} >> .npmrc
            sh echo //registry-node.aliyun.com/org/xxx/registry/yyy/:always-auth=false >> .npmrc
            sh echo grpc_node_binary_host_mirror=https://npm.taobao.org/mirrors >> .npmrc
            sh NODE_ENV=production npm run build
            sh npx semantic-release --debug --no-dry-run --no-ci --unsafe-perm
        }
    }
}
environment {
    GIT_CREDENTIALS = your-coding-user-name:${coding_token}
    NPM_CONFIG_REGISTRY = https://registry-node.aliyun.com/org/xxx/registry/yyy/
}

}

创建 Coding.Net 访问令牌

这是用来让 Jenkinsfile 读取代码用的,后面会通过环境变量形式注入到 Jenksinfile:
image.png
image.png
image.png
将访问令牌复制下来。一旦你关闭这个页面就再也看不到明文令牌了,如果你没有及时复制就关闭了,可以重新再创建一个。

配置 Coding.Net 持续集成 Jobs

image.png
image.png
image.png
注意,在最后一步需要用相关的环境变量形式把阿里 npm 模块仓库的认证信息填写上去:
image.png

配置完成,手动触发第一次构建吧:

image.pngimage.png

后续自动发布

只要代码提交,都会触发一次构建。但是会不会发布新的版本,就看提交历史是怎么写的了:
image.png
如果有新的版本发布成功,就会自动同步一个版本号到代码版本的标签栏中:
image.png