构建神器之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
相关推荐
coderWangbuer28 分钟前
基于springboot的高校招生系统(含源码+sql+视频导入教程+文档+PPT)
spring boot·后端·sql
攸攸太上34 分钟前
JMeter学习
java·后端·学习·jmeter·微服务
Kenny.志37 分钟前
2、Spring Boot 3.x 集成 Feign
java·spring boot·后端
sky丶Mamba1 小时前
Spring Boot中获取application.yml中属性的几种方式
java·spring boot·后端
千里码aicood2 小时前
【2025】springboot教学评价管理系统(源码+文档+调试+答疑)
java·spring boot·后端·教学管理系统
程序员-珍2 小时前
使用openapi生成前端请求文件报错 ‘Token “Integer“ does not exist.‘
java·前端·spring boot·后端·restful·个人开发
liuxin334455663 小时前
教育技术革新:SpringBoot在线教育系统开发
数据库·spring boot·后端
数字扫地僧3 小时前
HBase与Hive、Spark的集成应用案例
后端
架构师吕师傅3 小时前
性能优化实战(三):缓存为王-面向缓存的设计
后端·微服务·架构
bug菌4 小时前
Java GUI编程进阶:多线程与并发处理的实战指南
java·后端·java ee