前言
- 平时有些小项目单独部署的没有加到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