为什么会探讨这个主题
在我司现有web前端项目构建过程中,一直使用gulp + rjs的方案进行项目打包,由于整站项目过于庞大,即使是以相当好的机器多核打包,也需要4分钟+的时间,遂产生了将模块全部使用npm管理,并拆分子项目,达到每个通用模块都可自动构建,单元测试,保证质量并稳步迭代的目的。
项目其余细节
公司内部内容,略过
cnpm与cnpmjs.org的部署
cnpm原理
为npm原有的一些命令设置了代理,让你可以方便的连接到自己的私有服务,并同时使用npm上的资源包,您可以选择使用命令直接同步npm官方包(实质是向您的cnpmjs.org私有服务发送命令,并同步线上资源,存储下来),也可以直接通过cnpm接洽的原生npm直接下载,取决于您的需求
部署
cnpm官方通过开源项目cnpmjs.org整合了cnpm.registry和cnpm.web两个服务,让用户可以通过cnpm指定registry使用私有服务。
这里只介绍使用sqlite3作为存储私有包的记录数据库,即官方wiki中的5分钟部署cnpmjs。
Deploy-a-private-npm-registry-in-5-minutes
直接根据以上链接阐述内容,您可以立刻配置起一个cnpmjs.org服务.
配置cnpmjs.org
值得注意的是,您如果没有配置云存储服务器,将会默认使用fs-cnpm的配置,默认将publish的包存放在~/.cnpmjs.org/downloads下
默认的sqlite数据库位于~/.cnpmjs.org/data.sqlite
cnpmjs.org相关配置位于cnpmjs.org的包的config/index.js中
注意:bindingHost默认为127.0.0.1,请置空字符串或已注册的具名地址或内网可访问的ip地址,以便在内网其他机器上访问该服务
如果需使用其他云存储配置,已有数据库,请按照官方wiki修改相应配置。
# 后台启动cnpmjs.org服务,如有需要,可使用其他守护进程
nohup cnpmjs.org start --admins='myname,othername' \
--scopes='@my-company-name,@other-name' &
当安装好cnpmjs.org并配置好后,需要使用命令写入或者直接配置(至少运行一次)私有仓库作用域(scopes)以及私有仓库管理员名称。不明白的可以去npm官方文档了解一下
cnpmjs.org的registry服务和web服务默认位于7001,7002两个端口,7002即是cnpmjs.org的web网页,可以查看发布的相关私有包或同步的包
配置cnpm
cnpm set registry http://bindingHost:7001
将registry服务地址设置为你启动的cnpmjs.org registry服务地址
第一次登录
也就是注册。
原因是调用cnpm login的时候,走到cnpmjs.org服务,会通过以下路由
app.put('/-/user/org.couchdb.user::name', addUser);
输入下面内容开始创建
cnpm login myname
测试私有npm是否畅通
新建一个项目,cnpm init之
name设置为'@my-company-name/test'
cnpm publish尝试,上传成功
数据备份
相应包如果由于宕机或其他原因消失了是一件很麻烦的事情,请定时去默认数据存储文件夹备份一份(如果使用了其他已有的数据库,云存储,请自行备份),以便恢复。
gitlab的部署
这里使用的是ce-11.0.3版本,按照官方傻瓜式部署,直接可以部署上
请区分ce和ee两个不同版本
EXTERNAL_URL配置与上步骤配置bindingHost类似
其余邮件配置,其他数据库配置(如不用默认数据库),以及其他配置,请自行搜索或寻找官方文档。
gitlab首次启动
使用10 11等版本,首次启动的默认管理员用户密码不再如同以前一样是root 5iveL!fe了,
在新版本中,gitlab-rails web服务于auth中间件中判断了用户是否为第一次登陆,如果为第一次登陆,将会跳转到修改密码页,只需简单进入布置好的网页服务设置root密码即可。
gitlab首次进入修改不了密码?
。。。虽然我是个低级前端工程师,并且我chrome打开了f12,但是我没看到报错,查看了各种权限是否分配错误,查看了是不是编译出错,查看了web服务的auth中间件以及 changepassword服务,查看了数据库,各种可能都找了一遍,就差没直接改数据库,没找到原因。。。
然后我看到了这篇文章修改GitLab Web服务默认端口和初次登录密码报错问题
尝试换了个浏览器,好了。。。没有继续深究为什么
安装gitlab-runner
请直接参考官方文档 在任意一台机器上无脑安装即可
配置gitlab-runner
也请直接参考官方文档
或参考我的渣文档最底部的资料链接
重头戏
gitlab-ci cnpm配合做到一键发布。
gitlab-ci cnpm配合前情提要
首先,用户需要保证runner机器上也装了cnpm,至于怎么装就随便了。
cnpm登录后并不会直接颁布给你一个_authtoken,所以想直接通过在gitlab中的ci配置里写入_authtoken私密变量并进行私有包的发布是不现实的。
cnpm的源码中将publish命令直接拿给原生npm执行了,自己只是对参数进行了一些包装,最终执行 npm publish argv命令
cnpm可以做到的就是修改配置路径(--userconfig参数配置项),读取用户cnpmrc配置。
在设置了--userconfig路径以后,cnpm会将一系列参数直接传递给npm , npm通过 core包中的Conf模块会将你的config文件解析掉,生成一个token并执行publish的put操作。
基于这点我们就可以做到测试完毕并且自动发布私有包了
具体实施步骤
如果您没有修改过指定的.cnpmrc客户配置,当您登陆过cnpm后,会在用户目录下,也就是~/下发现.cnpmrc配置文件。
他大概是这样的
registry=http://yourbindingRegistryServerHost
//yourbindingHost:always-auth=false
//yourbindingRegistryServiceHost:_password=加密过的密码串
//yourbindingRegistryServiceHost:username=myname
//yourbindingRegistryServiceHost:[email protected]
那么思路就很明白了,我们可以这样写我们的发布脚本脚本
// publish.js
const fs = require('fs');
const argv = process.argv;
const un = argv[2];
const pw = argv[3];
const em = argv[4];
const r = argv[5];
const exec = require('child_process').exec;
if (un && pw && em && r) {
const or = r.replace(/^https?:/, '')
const result = `
registry=${r}
${or}:always-auth=false
${or}:_password=${pw}
${or}:username=${un}
${or}:email=${em}
`;
fs.writeFileSync('./.cnpmrc', result);
exec('cnpm publish --userconfig=' + process.cwd() + '/.cnpmrc', (error, stdout, stderr) => {
console.log(`stdout: ${stdout}`);
console.log(`stderr: ${stderr}`);
if (error) {
console.error(`exec error: ${error}`);
process.exit(1);
}
})
}
这样写我们的ci配置
before_script:
- npm i
stages:
- test
- publish
job1:
stage: test
script:
- npm run test
only:
- master
tags:
- qie
job2:
stage: publish
script:
- 'node ./publish.js $CNPM_UN $CNPM_PW $CNPM_EM $CNPM_R'
$CNPM\_UN $CNPM_PW $CNPM\_EM $CNPM_R为在gitlab仓库中设置的CI私密变量
效果
结语
善