每次把代码推到 gitlab ,jerkins 都会自动打包,但是每次都要执行 npm install ,总是反反复复的出问题,大佬们都是怎么解决这个问题的,这块的 shell 是怎么写的呢?
1
xingyuc 2022-10-28 09:34:32 +08:00
rm -rf node_modules
|
2
zhixiao 2022-10-28 09:35:11 +08:00
是不是网络问题?配置使用淘宝的源吧
|
3
chairuosen 2022-10-28 09:36:17 +08:00
jenkins 不是有固定的 workspace ,每次执行完不删的,第二次 install 没变化就很快。用 docker 的才有你这个问题
|
4
okrfuse OP @xingyuc 这一步会执行,我没有说清楚,我觉得如果 package.json 不变的话,没有必要 install ,还有国内网络问题导致 install 出错,就是不知道该怎么写,纯小白,莫怪
|
5
KickAssTonight 2022-10-28 09:37:12 +08:00
jerkins? jenkins?
|
6
cydysm 2022-10-28 09:37:33 +08:00 via iPhone
pkg.json 和 lock file 锁死版本 最好用 prefer online 模式 加上一楼的 rm -rf node_modules 可以试试
|
7
okrfuse OP @chairuosen 确实是 docker ,不管有没有变化,只要提交就就会 install ,很烦人
|
8
okrfuse OP @KickAssTonight 抱歉拼写错误了,大佬是怎么处理这块的呢
|
9
GentleFifth 2022-10-28 09:40:25 +08:00 via Android
@okrfuse docker 有缓存的,可以先把 package.json 拷贝进去安装依赖,再把业务代码拷进去编译,这样只要依赖没有变化 docker 就会复用之前的构建缓存
|
10
passon 2022-10-28 09:41:26 +08:00
换成 pnpm 能加快些速度
|
11
chairuosen 2022-10-28 09:43:41 +08:00
@okrfuse #7 内网搭一个私有源加速
|
13
dier 2022-10-28 09:57:58 +08:00
用分支来控制一下吧,如果只想保存代码不想打包,可以先提交到一个开发分支,等代码完成了再合并到主分支,jenkins 上配置只对主分支进行 install
|
14
yikyo 2022-10-28 10:02:54 +08:00
第一,必须锁版本,源代码提供 lock 文件
第二,上缓存,docker 、jenkins 应该都提供类似的功能,自己找点资料,节省编译时间。 |
15
Musong 2022-10-28 10:14:11 +08:00
npm install xxx --registry=https://mirrors.cloud.tencent.com/npm/
|
16
chenzi0103 2022-10-28 10:17:59 +08:00
docker 提前把相关的包和环境装好
|
17
qwertty01 2022-10-28 10:21:10 +08:00
大概率是 docker 缓存没有整好,有缓存的话就算 install 也很快的。而且不 install 的话,一旦 package 有变动就要调整编译打包流程了。
一个建议打包过程别用 docker ,直接使用 jenkins 原生打包就行。当然还有 v 友说的上 lock 之类的。 因为如果熟悉 docker 肯定会把缓存这块给搞好的,但既然搞不好,就说明 docker 不熟悉,还是别用 docker 了。 |
18
yaphets666 2022-10-28 10:31:50 +08:00
肯定是不每次都执行 install 没必要。 更新 20 次不见得有 1 次新增了包。在 jenkins 的命令里把 install 注释掉 需要再打开
|
19
wu00 2022-10-28 10:56:17 +08:00
install 很慢之前也折腾过一阵子
docker 的 layer cache 也是不错的选项,但是删除了镜像或者做了 prune 就没有了 最后选择模拟本地打包,核心就是挂载 node_modules 文件夹,临时容器进行打包便于隔离环境 gitlab-ci 供参考 ```yaml stages: - pack pack-dev: stage: pack tags: - global rules: - if: '$CI_COMMIT_BRANCH == "dev"' when: on_success script: - docker run --rm -v $PWD:/tmp/app -v /mnt/build-cache/$IMAGE_NAME/node_modules:/tmp/app/node_modules node:16-alpine /bin/sh -c "cd /tmp/app/; npm install --registry=https://registry.npm.taobao.org; npm run build" - docker build -t $REGISTRY/$IMAGE_NAME:$IMAGE_TAG . - docker push $REGISTRY/$IMAGE_NAME:$IMAGE_TAG ``` |
20
seekmyduck 2022-10-28 11:13:15 +08:00
看到 jerkins 就想到 jerk off
打个胶先? |
21
bittenbydog 2022-10-28 11:18:33 +08:00
Jenkins 步骤写脚本,用 git diff 或其他方法,判断 package.json 是否有更改,若无更改,跳过 install 步骤
|
22
brader 2022-10-28 11:21:03 +08:00
安装包挺烦的,我们受够了,最后就直接在本地安装了,安装完把包目录压缩,Jenkins 部署过程就是直接解压出来用
|
23
967182 2022-10-28 13:26:45 +08:00
判断如果有 node_modules 目录就不执行了啊
stage('编译'){ steps { echo "开始 install" script { if(!fileExists('node_modules')) { sh "npm install --registry=https://registry.npm.taobao.org" } else { echo "node_modules 已存在不执行 npm install" } } } } |
24
vishun 2022-10-28 14:43:24 +08:00
1 、首先需要版本控制上要有 lock 文件。
2 、然后用`npm ci`命令 |
25
kongkx 2022-10-28 14:55:56 +08:00 via iPhone
gitlab-ci.yml 上可以设置缓存策略。
1. 一般通过 package-lock.json 来判断是否需要更新缓存。 2. 执行 npm ci --cache <custom _dir> 来安装依赖,并且缓存整个 custom_dir 3. 再细点还可以分 npm 缓存 跟 构建缓存 我用的是用 gitlab ci runner + docker 来跑,jenkins 不知道有什么区别 |