混合部署 GitHub Actions Runner: Multi Arch 镜像构建速度飙升 10 倍! - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
n0vad3v
V2EX    程序员

混合部署 GitHub Actions Runner: Multi Arch 镜像构建速度飙升 10 倍!

  •  1
     
  •   n0vad3v
    n0vad3v 2023-07-31 20:52:26 +08:00 1494 次点击
    这是一个创建于 808 天前的主题,其中的信息可能已经有所发展或是发生改变。

    TL ; DR

    在 WebP Cloud Services ,我们所有的组件都是容器化部署的,代码托管和 CI/CD 都是在 GitHub 和 GitHub Actions 上面完成,这套比较 “现代” 的工作流让我们的工作量节省了很多时间和成本。

    但是在之前的文章 Hetzner CAX 系列 ARM64 服务器性能简评以及 WebP Cloud Services 在其上的实践 中我们测试发现 Hetzner ARM64 的机器性价比非常不错之后我们便将基础设施全部迁移到了 Hetzner 上。

    由于开始使用 ARM64 的机器,我们便需要支持 Multi-Arch 的 Docker 镜像,一开始我们继续沿用了 GitHub Actions 的 Job ,用 QEMU 直接构建镜像:

    - name: Build and push tagged images if: startsWith(github.ref, 'refs/tags/') uses: docker/build-push-action@v3 with: context: . platforms: linux/amd64, linux/arm64 push: true tags: | ghcr.io/${{ github.event.repository.full_name }}:${{ steps.imageTag.outputs.tag }} 

    然后便发现这么做会导致我们镜像构建速度从之前的 2min 不到变为了 20+min

    为了解决这个问题,我们尝试使用 GitHub Actions 官方 Runner 和我们在 Hetzner 上的 Self-hosted runner 分别原生构建对应架构的镜像并通过一个额外 Job 缝合两个镜像的方式制作 Multi-Arch 镜像,将时间缩短到了 2min 左右

    为此,我们写了一篇博客记录了我们的完整的改造步骤和其中遇到的坑:「混合部署 GitHub Actions Runner:Multi Arch 镜像构建速度飙升 10 倍!」: https://blog.webp.se/github-actions-hybrid-runner-zh/

    3 条回复    2023-08-01 12:36:52 +08:00
    winterpotato
        1
    winterpotato  
       2023-07-31 21:09:20 +08:00
    优秀,就等谁给我赞助一个 arm 机器了!
    crsmk01
        2
    crsmk01  
       2023-08-01 11:55:04 +08:00
    LZ Project 的 Dockerfile 里面有 CPU 密集型任务(编译等) ?我之前也遇到过,如果用 QEMU 模拟器,在 macOS M1 芯片的主机上用 docker buildx build --platform linux/arm64,linux/amd64 ... 构建双架构镜像时,2 分钟+ 的构建任务,时间拉长到 20 分钟+ ,后来把 linux/amd64 镜像的构建单独找了一台 x86-64 架构的主机去构建,速度嗖嗖的提升。

    不过这还不够,还可以通过交叉编译,构建速度有 100 倍的提升。
    https://medium.com/@tonistiigi/faster-multi-platform-builds-dockerfile-cross-compilation-guide-part-1-ec087c719eaf
    n0vad3v
        3
    n0vad3v  
    OP
       2023-08-01 12:36:52 +08:00
    @tdy218 是的,如我们文章中所描述,这里的任务主要是 CI 测试 + 构建镜像(包括了编译 Binary ),相比较我们直接拆分机器原生构建,我们还多了个通过操作 manifest 缝合镜像的动作。

    我们这里没有使用交叉编译的原因是因为有个 `vips` 库的存在不方便交叉编译,关于这个问题我们之前踩了一堆坑,并写了一篇文章分享: [libvips, CGO 与 purego如何让 Go 应用跨平台编译运行]( https://blog.webp.se/golang-libvips-cgo-zh/)
    div class="fr">
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1219 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 23:49 PVG 07:49 LAX 16:49 JFK 19:49
    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