V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
okrfuse
V2EX  ›  程序员

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

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

    每次把代码推到 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
    打个胶先?
    bittenbydog
        21
    bittenbydog  
       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   ·   实用小工具   ·   1190 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 23:36 · PVG 07:36 · LAX 15:36 · JFK 18:36
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.