使用go mod结合docker分层缓存进行自动CI/CD详解

8 min read

Go mod是Go v1.11及以后版本引入的一种包管理机制,能够自动下载和管理项目所需的所有依赖包。同时,Docker分层缓存是一种利用Docker镜像的特性,缓存每一层的结果以加快镜像构建速度的方法。结合这两个工具,可以实现自动化的CI/CD流程。

下面是使用Go mod和Docker分层缓存实现自动CI/CD的详细步骤。

  1. 编写Dockerfile

在项目根目录下创建一个Dockerfile文件,用于构建Docker镜像。

# 基于 alpine 镜像
FROM alpine:latest

# 安装Git和Go
RUN apk update && \
    apk upgrade && \
    apk add --no-cache git go

# 设置工作目录
WORKDIR /app

# 复制代码到容器中
COPY . .

# 获取所有依赖项
RUN go mod download

# 构建程序
RUN go build -v -o /app/app

# 运行程序
CMD ["/app/app"]
  1. 设置Git钩子

在项目中添加一个Git钩子,以便在推送到远程仓库时触发自动构建。

在项目的.git/hooks目录中创建一个名为post-receive的文件,并添加以下代码:

#!/bin/bash

# 设置镜像名称和版本号
IMAGE_NAME=my-image
IMAGE_VERSION=$(git rev-parse --short HEAD)

# 构建 Docker 镜像
docker build -t $IMAGE_NAME:$IMAGE_VERSION .

# 推送 Docker 镜像到 registry
docker push $IMAGE_NAME:$IMAGE_VERSION

添加执行权限:

chmod +x .git/hooks/post-receive
  1. 推送代码并构建Docker镜像

向Git仓库推送代码,Git钩子会自动触发Docker镜像的构建。Docker会自动下载Go模块并构建应用程序。

为了查看Docker是否正确执行了层缓存,可以在第一次构建镜像之后,再次进行构建镜像。如果Docker正确利用了分层缓存,那么第二次构建的时间会大大缩短。

  1. 部署Docker容器

从Docker仓库中拉取最新的镜像,并运行容器。

docker pull my-image:latest
docker run -d -p 8080:8080 my-image:latest

至此,整个自动CI/CD流程已经完成。每当新代码被推送到Git仓库时,它将被自动编译、构建和部署。通过结合Go mod和Docker的分层缓存,可以显著加快自动化构建流程的速度。