背景
前端的开源我的项目公布的步骤:
- 将代码提交到
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
来实现,这样整个公布流程须要手动实现的就只剩下提交代码了。