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

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

  •  
  •   okrfuse · 96 天前 · 1978 次点击
    这是一个创建于 96 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    25 条回复    2022-10-28 14:55:56 +08:00
    xingyuc
        1
    xingyuc  
       96 天前
    rm -rf node_modules
    zhixiao
        2
    zhixiao  
       96 天前
    是不是网络问题?配置使用淘宝的源吧
    chairuosen
        3
    chairuosen  
       96 天前
    jenkins 不是有固定的 workspace ,每次执行完不删的,第二次 install 没变化就很快。用 docker 的才有你这个问题
    okrfuse
        4
    okrfuse  
    OP
       96 天前
    @xingyuc 这一步会执行,我没有说清楚,我觉得如果 package.json 不变的话,没有必要 install ,还有国内网络问题导致 install 出错,就是不知道该怎么写,纯小白,莫怪
    KickAssTonight
        5
    KickAssTonight  
       96 天前
    jerkins? jenkins?
    cydysm
        6
    cydysm  
       96 天前 via iPhone
    pkg.json 和 lock file 锁死版本 最好用 prefer online 模式 加上一楼的 rm -rf node_modules 可以试试
    okrfuse
        7
    okrfuse  
    OP
       96 天前
    @chairuosen 确实是 docker ,不管有没有变化,只要提交就就会 install ,很烦人
    okrfuse
        8
    okrfuse  
    OP
       96 天前
    @KickAssTonight 抱歉拼写错误了,大佬是怎么处理这块的呢
    GentleFifth
        9
    GentleFifth  
       96 天前 via Android
    @okrfuse docker 有缓存的,可以先把 package.json 拷贝进去安装依赖,再把业务代码拷进去编译,这样只要依赖没有变化 docker 就会复用之前的构建缓存
    passon
        10
    passon  
       96 天前
    换成 pnpm 能加快些速度
    chairuosen
        11
    chairuosen  
       96 天前
    @okrfuse #7 内网搭一个私有源加速
    wu00
        12
    wu00  
       96 天前
    @okrfuse 挂载宿主机目录作为 node_modules 缓存,每次 install 没问题,问题在于不能每次从远端拉包
    dier
        13
    dier  
       96 天前
    用分支来控制一下吧,如果只想保存代码不想打包,可以先提交到一个开发分支,等代码完成了再合并到主分支,jenkins 上配置只对主分支进行 install
    yikyo
        14
    yikyo  
       96 天前
    第一,必须锁版本,源代码提供 lock 文件
    第二,上缓存,docker 、jenkins 应该都提供类似的功能,自己找点资料,节省编译时间。
    Musong
        15
    Musong  
       96 天前
    npm install xxx --registry=https://mirrors.cloud.tencent.com/npm/
    chenzi0103
        16
    chenzi0103  
       96 天前
    docker 提前把相关的包和环境装好
    qwertty01
        17
    qwertty01  
       96 天前
    大概率是 docker 缓存没有整好,有缓存的话就算 install 也很快的。而且不 install 的话,一旦 package 有变动就要调整编译打包流程了。
    一个建议打包过程别用 docker ,直接使用 jenkins 原生打包就行。当然还有 v 友说的上 lock 之类的。
    因为如果熟悉 docker 肯定会把缓存这块给搞好的,但既然搞不好,就说明 docker 不熟悉,还是别用 docker 了。
    yaphets666
        18
    yaphets666  
       96 天前
    肯定是不每次都执行 install 没必要。 更新 20 次不见得有 1 次新增了包。在 jenkins 的命令里把 install 注释掉 需要再打开
    wu00
        19
    wu00  
       96 天前
    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  
       96 天前
    看到 jerkins 就想到 jerk off
    打个胶先?
    bittenbydog
        21
    bittenbydog  
       96 天前
    Jenkins 步骤写脚本,用 git diff 或其他方法,判断 package.json 是否有更改,若无更改,跳过 install 步骤
    brader
        22
    brader  
       96 天前
    安装包挺烦的,我们受够了,最后就直接在本地安装了,安装完把包目录压缩,Jenkins 部署过程就是直接解压出来用
    967182
        23
    967182  
       96 天前
    判断如果有 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  
       96 天前
    1 、首先需要版本控制上要有 lock 文件。
    2 、然后用`npm ci`命令
    kongkx
        25
    kongkx  
       96 天前 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   ·   我们的愿景   ·   广告投放   ·   实用小工具   ·   318 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 50ms · UTC 20:04 · PVG 04:04 · LAX 12:04 · JFK 15:04
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.