背景
前端的开源项目发布的步骤:
- 将代码提交到
GitHub
; - 运行单元测试;
- 发布到
npm
上;
以上步骤每次发布都要做一边,不仅繁杂,而且人工完成容易出错,因此通过自动化来完成这些工作变得很有必要。
阅读本文需要你对使用jenkins + docker
来实现自动化部署有一定实践经验。
实现流程
- 将代码通过
git
提交至GitHub
; GitHub
的webhook
触发jenkins
的pipeline
任务;pipeline
任务执行测试命令;- 测试通过后,对比
npm
线上的包和当前package.json
中的版本号; - 版本号不同的情况下构建代码,登录
npm
,将包发布到npm
;
实现原理
本文不打算从零开始讲述每个实现的步骤和细节,只讲实现流程中一些比较有价值的方法和原理。
代码提交到GitHub
触发jenkins
的pipeline
任务
- 安装一个
jenkins
插件:multibranch-scan-webhook-trigger - 打开
pipeline
任务的配置,找到扫描 仓库 触发器
,勾选Scan by webhook
,并且在Trigger token
中填入一个随机的字符串。 - 打开
GitHub
代码仓库 -> 点击Settings
-> 点击Webhooks
-> 点击Add webhook
-> 在Payload URL
中填入:JENKINS_URL
/multibranch-webhook-trigger/invoke?token=Trigger token
,其中JENKINS_URL
是你的jenkins
服务地址,Trigger token
则对应步骤2填入的随机字符串。
完成以上配置,下次你提交代码就会自动触发对应的pipeline
任务。
如何通过shell
脚本登录npm
发布npm
包只需要执行:
npm publish --access public
但是前提是要先登录你的npm
账户,通常情况下可以通过执行npm login
,然后输入用户名
、密码
、邮箱
即可登录,但是在jenkins
中没法实现这种交互式输入的。解决办法是安装npm-cli-login,这样就可以通过以下脚本直接登录:
NPM_USER=testUser NPM_PASS=testPass NPM_EMAIL=test@example.com npm-cli-login
如何对比线上npm包的最新版本号和当前代码中的版本号
某些情况下你只是想提交内容到GitHub
上,并不想发布新的包到npm
上。所以不能每次一提交代码就发布npm
包的,需要先判断当前版本号是否和线上的一致,如果一致则不发布包,反之则发布。
1.获取线上npm
包的版本号,可以通过以下脚本获取
npm view <package name> version
2.获取当前项目代码的版本号
node -p "require('./package.json').version"
3.对比两个版本号
versionOnline=$(npm view <package name> version)
versionLocal=`node -p "require('./package.json').version"`
if [ "$versionOnline" != "$versionLocal" ]; then
// 发布
fi
完整的脚本
versionOnline=$(npm view <package name> version)
versionLocal=`node -p "require('./package.json').version"`
if [ "$versionOnline" != "$versionLocal" ]; then
npm install -g npm-cli-login --registry=https://registry.npm.taobao.org
NPM_USER=${NPM_USER} NPM_PASS=${NPM_PASS} NPM_EMAIL=${NPM_EMAIL} npm-cli-login
npm publish --access public
fi
其它
一些相对大型的开源库还需要部署文档等操作,也可以用jenkins
来完成,这样整个发布流程需要手动完成的就只剩下提交代码了。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。