构建神器之Earthly

前言

  • 平时有些小项目单独部署的没有加到CI/CD中,之前都是docker+.bat进行构建推送,后来偶然间看到了EARTHLY,一个号称超级简单的CI/CD工具,他是makefile+docker的结合,但是功能是超越二者之和的,我尝试了一下,确实要方便、快速不少,后期我准备接入到drone中试试
  • 我们一起来了解一下

EARTHLY

简介

-官方文档,目前最新的版本是0.8 -超强的功能: 一个ERATHLY可以代替 Dockerfile、Makefile、Bash等工具

  • 语法简单:earthly只有一个配置文件就是Earthfile这个文件,它语法和Dockerfile很像,熟悉dockerfile的朋友上手没什么难度
  • 多向兼容:除了本地构建外也兼容各种CI/CD工具,如Jenkins、Github Actions等
  • 快速构建:earthly构建的时候会最大限度使用缓存使构建速度更快,还支持共享缓存可以加快在团队中频繁构建的速度
  • Cloud云:允许在云中运行earthly构建,使构建速度更快
  • 丰富的插件:在主流的vscode、sublime、ide等中都有插件

实践

安装

  • 注意:安装earthly是需要预先安装Docker和Git
  • 官方安装教程
  • 官方安装分登录和不登录安装指引,等于的账号每月免费6000分钟的云端构建,更快速度的构建
  • Github上也有编译好的程序下载github下载地址
  • 下图是注册账号的安装步骤
  • 安装完会生成一个容器
  • 跟随一步步还有测试教程

构建

  • Github上有官方的demodemo地址
  • 运行指令
bash 复制代码
earthly +docker  #会执行docker阶段,然后docker阶段又引用了build,build又引用了deps所以就会从deps一步步执行,最终打包推送
  • 特别注意的是demo docker构建阶段有--push,这个默认不会推送要加上--push也就是
bash 复制代码
    earthly --push +docker
  • 下面是我结合自己的微服务写的打包脚本,打包完推送到自己的仓库
yaml 复制代码
VERSION 0.8
FROM xxxxx:9043/public/golang:1.20-alpine
WORKDIR /go-build

deps:
    COPY go.mod go.sum ./
    RUN go mod download
    SAVE ARTIFACT go.mod AS LOCAL go.mod
    SAVE ARTIFACT go.sum AS LOCAL go.sum

build:
    FROM +deps
    COPY . .
    RUN export GO111MODULE=on
    RUN export GOPROXY=https://goproxy.cn,direct
    RUN go build -ldflags "-s -w" -o build/digital-copyright ./cmd
    SAVE ARTIFACT build/digital-copyright /digital-copyright AS LOCAL build/digital-copyright

docker:
    FROM xxxx:9043/public/self-alpine
    COPY +build/digital-copyright .
    COPY conf ./conf
    ENV MODE_ENV=dev
    ENTRYPOINT ["/digital-copyright"]
    SAVE IMAGE --push xxxxxx:9043/test/digital-copyright:2

常见命令

  • earthly +xxx xxx 就是Earthfile中定义的阶段
bash 复制代码
earthly +docker

变量

  • 定义参数,参数可以是常量或者动态的
yaml 复制代码
VERSION 0.8
FROM alpine
WORKDIR /go-build
hello:
   ARG time=$(date +%H:%M)
   ARG name=壹砂木木
   RUN echo "hello $name, it is $time"
  • 动态参数,参数可以是执行指令的时候传入的自定义,也可以是系统环境变量
yaml 复制代码
VERSION 0.8
FROM alpine
WORKDIR /go-build
hello:
   ARG name
   RUN echo "hello $name"
  • 命令行方式传入定义
  • 环境变量传入

使用docker命令

  • earthly 可以使用docker的命令
  • 为了使用 Docker 命令(例如 docker run ),Earthly 提供了可按需启动和停止的隔离 Docker 守护进程。
yaml 复制代码
VERSION 0.8
FROM xxxxx/public/golang:1.20-alpine
WORKDIR /go-build
hello:
    FROM xxxxx/test/main-server
    WITH DOCKER --pull xxxxx/test/main-server
        RUN docker run -d xxxxx/test/main-server
    END

缓存

  • earthly 构建的时候默认是有缓存的,如果不想使用缓存或者有时候改了配置文件还是走的缓存最新的没生效可以在指令加上--no-cahce
yaml 复制代码
earthly --no-cache +build
  • Earthly 允许您在某些情况下通过earthly --auto-skip 跳过构建的大部分内容,如下入我什么都没有改动再次构建,直接success
  • 重置本地缓存
yaml 复制代码
earthly prune

保存神器 SAVE ARTIFACT

  • 功能:将文件、目录或由通配符表示的一系列文件和目录从构建环境复制到目标的工件环境中
  • 将项目目录下的go.mod go.sun 复制到工作目录
bash 复制代码
SAVE ARTIFACT go.mod AS LOCAL go.mod
  • 如果还指定了 AS LOCAL,一旦构建被视为成功,它还会标记要复制到 <local-path> 指定位置
  • 我是在build中使用的,意思是build完成之后将编译好的程序保存到工作区根目录并且同时保存到本地项目/build下
yaml 复制代码
SAVE ARTIFACT build/digital-copyright /digital-copyright AS LOCAL build/digital-copyright

保存镜像

  • 这个是写在docker阶段的,将打包的镜像取名为my-image:latest、my-image:1.0.0等多个镜像
yaml 复制代码
SAVE IMAGE my-image:latest my-image:1.0.0 my-example-registry.com/another-image:latest
  • 保存的同时推送到仓库,这个要结合指令--push 如:earthly --push +docker才能生效,不然是不会推送的
yaml 复制代码
SAVE IMAGE --push xxxx:9043/test/digital-copyright:2
相关推荐
Gopher_HBo1 分钟前
HTTP2传输层与流控
后端
Bazingga2 分钟前
同一个脑子,不同的身体:桌面办公智能体全景拆解
后端
用户302822530686 分钟前
你的 API 只返回 30 条,为什么数据库还是被打满了?
数据库·后端·架构
Hespethorn8 分钟前
MQTT 的四个工程暗礁:遗嘱、保留消息、ACL 与主题设计
后端·物联网
打工仔折腾 AI9 分钟前
Spring AI + Qwen 周报生成实战:从原始日志到人工确认卡
人工智能·后端·python·spring·elasticsearch·ai agent 实战
杨文说AI与数字化13 分钟前
分时预约系统的库存模型:为什么'加个预约功能'必然出现超卖与假满
后端
Darling噜啦啦14 分钟前
# MySQL + Milvus = PostgreSQL?一张表搞定 AI Agent 的长时记忆(附完整代码)
后端·postgresql·orm
用户7138742290014 分钟前
在 .NET 中使用 AWS Secrets Manager:Config 与 Client 详解
后端
福大大架构师每日一题15 分钟前
2026-10-16:交替数列的最大元素。用go语言,给定三个整数 n、s、m。现在要构造一个包含 n 个整数的序列,其中第一个数必须等于 s。序列中相邻数字的
后端
yunwei3715 分钟前
eBPF 入门实践教程:BPF Token,安全的委托式权限与程序加载
linux·后端·性能优化