构建神器之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
相关推荐
小蜗牛慢慢爬行18 分钟前
有关异步场景的 10 大 Spring Boot 面试问题
java·开发语言·网络·spring boot·后端·spring·面试
A小白590840 分钟前
Docker部署实践:构建可扩展的AI图像/视频分析平台 (脱敏版)
后端
goTsHgo1 小时前
在 Spring Boot 的 MVC 框架中 路径匹配的实现 详解
spring boot·后端·mvc
waicsdn_haha1 小时前
Java/JDK下载、安装及环境配置超详细教程【Windows10、macOS和Linux图文详解】
java·运维·服务器·开发语言·windows·后端·jdk
Q_19284999061 小时前
基于Spring Boot的摄影器材租赁回收系统
java·spring boot·后端
良许Linux1 小时前
0.96寸OLED显示屏详解
linux·服务器·后端·互联网
求知若饥1 小时前
NestJS 项目实战-权限管理系统开发(六)
后端·node.js·nestjs
左羊2 小时前
【代码备忘录】复杂SQL写法案例(一)
后端
gb42152872 小时前
springboot中Jackson库和jsonpath库的区别和联系。
java·spring boot·后端
程序猿进阶2 小时前
深入解析 Spring WebFlux:原理与应用
java·开发语言·后端·spring·面试·架构·springboot