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

大家发布项目,从部署到上线,一般花多长时间?

  •  
  •   wtfedc · 13 天前 · 1825 次点击

    我们这边小公司,没有用公有云流水线和仓库。 用的是一个 4 核 8G 的机器跑 gitlab runner ,专门拉代码 做 docker build ,然后把 image push 到私有仓库。感觉时间用的有点长,不同的前端项目 14 分钟~ 30 分钟,后端项目 5 分钟左右

    今天看了一个前端部署流水线,docker build 时的 copy 操作,用了 660s ,没想明白为啥这么慢,代码仓库大小是 23M ,按道理代码仓库和 runner 机器都在一个内网网段,也没有网络瓶颈,ECS 监控看部署的时候,IOPS 才 200 次 /s ,远远没到机器云盘的上限 2400 次 /s 。不知道和 inode 快满了是不是有关系。

    前端项目占用了很多 inode ,而且所有项目的 CI 没有做清理 image 的操作,有个 linux 定时任务,1 天清一次,但是同一天部署前端次数太多的话,inode 就满了,就得手动清理,也是很醉🐶

    24 条回复
    wtfedc
        1
    wtfedc  
    OP
       13 天前
    排版乱了,尴尬
    yurong333333
        2
    yurong333333  
       13 天前
    我哭了,前公司采用的是刀耕火种的方式。
    darksword21
        3
    darksword21  
       13 天前 via iPhone
    1 分钟,主要是 ci cd 的机器非常快
    colatea
        4
    colatea  
       13 天前
    试试 gogs,gitlab 比较耗资源
    wtfedc
        5
    wtfedc  
    OP
       13 天前
    @yurong333333 刀耕火种,一秒上线 :) 就是版本回退,麻烦点
    Jooooooooo
        6
    Jooooooooo  
       13 天前
    后端咋这么快...不一批一批机器分开发的吗?
    duke807
        7
    duke807  
       13 天前 via Android
    幾秒鐘吧

    裸跑,不用 docker
    wtfedc
        8
    wtfedc  
    OP
       13 天前
    @Jooooooooo 后端用的基础系统镜像和前端不太一样,是 14M 的 alpine linux ,装上一些依赖,只跑 go 的二进制,分发的 image 大小就 30 多 M ,k8s 集群拉的话也比较快
    sujin190
        9
    sujin190  
       13 天前   ❤️ 1
    如果是前端如果已经编译完成之后 docker build 镜像慢的话,我们之前发现个问题,就是一般 docker build 会在项目根目录执行,npm 安装后的 node_modules 也会在根目录,docker build 的时候好像会 copy 文件到 docker domen context ,看日志特点就是 docker build 启动花了非常长的时间,启动之后开发 build 很快就完成了,这个问题就是 node_modules 文件太多,所以可以试试把编译出的文件 copy 到一个单独的目录,然后 docker build 就可以快非常多了

    如果也是用 docker 编译的话,其实可以把项目目录和 node_modules 映射进去,估计能快不少吧
    hccsoul
        10
    hccsoul  
       13 天前   ❤️ 1
    nohup java -jar 🐶
    estk
        11
    estk  
       13 天前 via Android
    push 到 git ,服务器自动拉取编译发布
    MineDog
        12
    MineDog  
       13 天前
    9 楼说的有点道理,可以看看每个阶段时间,分析一下耗时集中在哪里
    ScepterZ
        13
    ScepterZ  
       13 天前
    前公司的有些项目跑编译耗时要按小时计算,主要是编译机没做缓存,项目依赖实在是太多了,当时公司的源好像性能也不太行
    ss098
        14
    ss098  
       13 天前
    @sujin190 正确的做法是配置 .dockerignore 文件以忽略 node_modules 。
    yhxx
        15
    yhxx  
       13 天前
    前端半分钟左右,后端半天左右
    linchengzzz
        16
    linchengzzz  
       13 天前
    试试加上 --production 来安装依赖,这样 node_modules 体积比较小
    Hstar
        17
    Hstar  
       13 天前   ❤️ 1
    无论是前后端项目,打包镜像都可以大致分为两步:安装依赖,编译项目代码,第二步的时间开销难以避免,但第一步是可以通过本地缓存、镜像分层等手段来加速的。
    至于具体的时间,部署的时间因为集群的原因不太可控,有时 1 分钟有时 5 分钟,但是构筑的时间都很稳定。一般前端 1~3 分钟看项目大小,后端不会超过 1 分钟,像 Python 项目没有编译过程的只用十秒,都是上传下载镜像花的时间。只有项目升级了依赖文件,构筑时间才会到 15 分钟以上。
    缺点就是镜像机挂载的 10PB 硬盘过几个月就会满一遍,之前出了一次事故就是这个硬盘满了还没告警,全司的部署都卡死了。
    suyuyu
        18
    suyuyu  
       13 天前
    用啥 docker 问就是不会 doge
    NNNNzs
        19
    NNNNzs  
       12 天前
    是不是 build 得时候把 node_modules 这些也 copy 过去了?碎文件确实会很慢
    如果是可以尝试先在外面打包成压缩包 再在容器里面解压
    还可以把 node_modules/.cache 文件夹删除在压缩
    wtfedc
        20
    wtfedc  
    OP
       12 天前
    add 操作下一步才是 npm run build ,进行 webpack 打包,看 CPU 占用不到整体( 4 个核)的 50%。前端项目流水线部分日志:
    #6 [initial 2/6] COPY --chown=node:node package.json package-lock.json /hom...
    #6 CACHED
    #7 [initial 3/6] COPY --chown=node:node script/ /home/node/code/script/
    #7 CACHED
    #8 [initial 4/6] RUN cd /home/node/code && npm --registry https://registry-...
    #8 CACHED
    #9 [initial 5/6] ADD --chown=node:node . /home/node/code
    #9 DONE 662.5s
    ------手动切割线----------------
    docker build 用的是下边的命令:
    DOCKER_BUILDKIT=1 docker build . -f ./deploy/Dockerfile-production --output type=local,dest=$OUTPUT_DIR
    确实大多项目都在同一个目录 build ,等会尝试一下 9 楼老兄的方法,换一个目录进行 build ,再给大家反馈
    flighter
        21
    flighter  
       12 天前
    安装依赖,编译打包镜像 5 到 10 分钟吧,部署集群 1 到 5 分钟吧
    wtfedc
        22
    wtfedc  
    OP
       12 天前
    @NNNNzs node_modules 是在 docker copy 之后,再进行 npm install 生成的,压缩的话莫非在 git pre commit 这一步进行
    wtfedc
        23
    wtfedc  
    OP
       12 天前
    不好意思 20 楼说错, 是在 docker add 命令前进行的 npm install ,node_modules 也用到了 cache
    wtfedc
        24
    wtfedc  
    OP
       12 天前
    自己把自己绕糊涂了,我把整个 dockfile 贴出来:
    +
    FROM --私有库地址--/public/alpine-streamline-node:14.10.1 as initial

    USER node
    COPY --chown=node:node package.json package-lock.json /home/node/code/
    COPY --chown=node:node script/ /home/node/code/script/

    RUN cd /home/node/code && npm --registry https://--私有库地址--/ install

    ENV NODE_ENV production

    ADD --chown=node:node . /home/node/code

    RUN cd /home/node/code \
    && cp consul.config.json.example consul.config.json \
    && sed -i "/host/c \"host\": \"confsrv.smartstudy.com\"\," consul.config.json \
    && sed -i "/env/c \"env\": \"production\"" consul.config.json \
    && npm run gen:config \
    && npm run build:pre

    FROM scratch as server
    COPY --from=initial /home/node/code/build /
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   3250 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 01:03 · PVG 09:03 · LAX 18:03 · JFK 21:03
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.