前端代码 jerkins 自动打包部署的小白问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
okrfuse
0.05D
V2EX    程序员

前端代码 jerkins 自动打包部署的小白问题

  •  
  •   okrfuse 2022-10-28 09:30:22 +08:00 3272 次点击
    这是一个创建于 1158 天前的主题,其中的信息可能已经有所发展或是发生改变。

    每次把代码推到 gitlab ,jerkins 都会自动打包,但是每次都要执行 npm install ,总是反反复复的出问题,大佬们都是怎么解决这个问题的,这块的 shell 是怎么写的呢?

    25 条回复    2022-10-28 14:55:56 +08:00
    xingyuc
        1
    xingyuc  
       2022-10-28 09:34:32 +08:00
    rm -rf node_modules
    zhixiao
        2
    zhixiao  
       2022-10-28 09:35:11 +08:00
    是不是网络问题?配置使用淘宝的源吧
    chairuosen
        3
    chairuosen  
       2022-10-28 09:36:17 +08:00
    jenkins 不是有固定的 workspace ,每次执行完不删的,第二次 install 没变化就很快。用 docker 的才有你这个问题
    okrfuse
        4
    okrfuse  
    OP
       2022-10-28 09:36:34 +08:00
    @xingyuc 这一步会执行,我没有说清楚,我觉得如果 package.json 不变的话,没有必要 install ,还有国内网络问题导致 install 出错,就是不知道该怎么写,纯小白,莫怪
    KickAssTonight
        5
    KickAssTonight  
       2022-10-28 09:37:12 +08:00
    jerkins? jenkins?
    cydysm
        6
    cydysm  
       2022-10-28 09:37:33 +08:00 via iPhone
    pkg.json 和 lock file 锁死版本 最好用 prefer online 模式 加上一楼的 rm -rf node_modules 可以试试
    okrfuse
        7
    okrfuse  
    OP
       2022-10-28 09:38:03 +08:00
    @chairuosen 确实是 docker ,不管有没有变化,只要提交就就会 install ,很烦人
    okrfuse
        8
    okrfuse  
    OP
       2022-10-28 09:38:53 +08:00
    @KickAssTonight 抱歉拼写错误了,大佬是怎么处理这块的呢
    GentleFifth
        9
    GentleFifth  
       2022-10-28 09:40:25 +08:00 via Android
    @okrfuse docker 有缓存的,可以先把 package.json 拷贝进去安装依赖,再把业务代码拷进去编译,这样只要依赖没有变化 docker 就会复用之前的构建缓存
    passon
        10
    passon  
       2022-10-28 09:41:26 +08:00
    换成 pnpm 能加快些速度
    chairuosen
        11
    chairuosen  
       2022-10-28 09:43:41 +08:00
    @okrfuse #7 内网搭一个私有源加速
    wu00
        12
    wu00  
       2022-10-28 09:43:52 +08:00
    @okrfuse 挂载宿主机目录作为 node_modules 缓存,每次 install 没问题,问题在于不能每次从远端拉包
    dier
        13
    dier  
       2022-10-28 09:57:58 +08:00
    用分支来控制一下吧,如果只想保存代码不想打包,可以先提交到一个开发分支,等代码完成了再合并到主分支,jenkins 上配置只对主分支进行 install
    yikyo
        14
    yikyo  
       2022-10-28 10:02:54 +08:00
    第一,必须锁版本,源代码提供 lock 文件
    第二,上缓存,docker 、jenkins 应该都提供类似的功能,自己找点资料,节省编译时间。
    Musong
        15
    Musong  
       2022-10-28 10:14:11 +08:00
    npm install xxx --registry=https://mirrors.cloud.tencent.com/npm/
    chenzi0103
        16
    chenzi0103  
       2022-10-28 10:17:59 +08:00
    docker 提前把相关的包和环境装好
    qwertty01
        17
    qwertty01  
       2022-10-28 10:21:10 +08:00
    大概率是 docker 缓存没有整好,有缓存的话就算 install 也很快的。而且不 install 的话,一旦 package 有变动就要调整编译打包流程了。
    一个建议打包过程别用 docker ,直接使用 jenkins 原生打包就行。当然还有 v 友说的上 lock 之类的。
    因为如果熟悉 docker 肯定会把缓存这块给搞好的,但既然搞不好,就说明 docker 不熟悉,还是别用 docker 了。
    yaphets666
        18
    yaphets666  
       2022-10-28 10:31:50 +08:00
    肯定是不每次都执行 install 没必要。 更新 20 次不见得有 1 次新增了包。在 jenkins 的命令里把 install 注释掉 需要再打开
    wu00
        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
    ```
    seekmyduck
        20
    seekmyduck  
       2022-10-28 11:13:15 +08:00
    看到 jerkins 就想到 jerk off
    打个胶先?
    x3byg9oyv27Wlx
        21
    x3byg9oyv27Wlx  
       2022-10-28 11:18:33 +08:00
    Jenkins 步骤写脚本,用 git diff 或其他方法,判断 package.json 是否有更改,若无更改,跳过 install 步骤
    brader
        22
    brader  
       2022-10-28 11:21:03 +08:00
    安装包挺烦的,我们受够了,最后就直接在本地安装了,安装完把包目录压缩,Jenkins 部署过程就是直接解压出来用
    967182
        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"
    }
    }
    }
    }
    vishun
        24
    vishun  
       2022-10-28 14:43:24 +08:00
    1 、首先需要版本控制上要有 lock 文件。
    2 、然后用`npm ci`命令
    kongkx
        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 不知道有什么区别
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     942 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 22:42 PVG 06:42 LAX 14:42 JFK 17:42
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86