Gitactions构建前后端项目二

针对后端项目构建的再次优化

上次构建示例中,后端的构建速度慢到令人冒火

在无数次搜索后,得到下面的一些经验之谈,希望可以帮到人

最开始的构建有很多提示,先升级了下依赖

优化分为 Dockerfilegithubpush.yml两部分

第一次尝试

首先是Dockerfile

FROM --platform=$BUILDPLATFORM golang:alpine as builder
WORKDIR /build
COPY go.mod go.sum ./
RUN go mod tidy
RUN go build -ldflags="-s -w" -o yourAppName main.go

FROM scratch
# 设置固定的项目路径
ENV WORKDIR /app

# 添加应用可执行文件,并设置执行权限
COPY --from=builder /build/yourAppName $WORKDIR/yourAppName

# 添加I18N多语言文件、静态文件、配置文件、模板文件
COPY --from=builder /build/resource     $WORKDIR/resource
# 指定暴露端口, 如果有的话
EXPOSE 8808

###############################################################################
#                                   运行
###############################################################################
WORKDIR $WORKDIR
CMD ["./yourAppName"]

这套组合拳下来,速度已经非常快了,从最初的20分钟左右缩短到了3分钟

接下来再看githubpush.yml

利用githubAPI可以直接加上cache-from,cache-to配置,这样下来时间到了2分钟左右

      - name: Build and push
        uses: docker/build-push-action@v5
        with:
          context: .
          file: ./Dockerfile
          cache-from: type=gha
          cache-to: type=gha,mode=max
          # 所需要的体系结构,可以在 Available platforms 步骤中获取所有的可用架构
          platforms: linux/amd64,linux/arm64
          # 镜像推送时间
          push: true

再次优化发现,可以挂在缓存,将go mod cache 和 go cache 全部缓存下来,方便后面的Dockerfile打包

再次优化

又经过一番搜索,发现可以在构建之前提取之前的缓存并且注入到构建的环境中,下面是一个简短的列子

RUN go env -w GOMODCACHE=/root/.cache/go-mod-cache
RUN --mount=type=cache,target=/root/.cache/go-mod-cache,sharing=locked,id=go-mod-cache \
	    go mod download
RUN --mount=type=cache,target=/root/.cache/go-mod-cache \
    go build  -mod=readonly -ldflags="-s -w" -o yourAppName main.go	    
      - name: Go Build Cache for Docker
        uses: actions/cache@v4
        with:
          path: |
            go-mod-cache            
          key: go-cache-multiarch-${{ hashFiles('go.mod') }}
          restore-keys: |
            go-cache-multiarch-            

      - name: inject go-build-cache into docker
          # v1 was composed of two actions: "inject" and "extract".
          # v2 is unified to a single action.
        uses: reproducible-containers/buildkit-cache-dance@v3.1.0
        with:
          cache-map: |
            {
              "go-mod-cache": {
                "target": "/root/.cache/go-mod-cache",
                "id": "go-mod-cache"
              }
            }            
          skip-extraction: true

总结

一番折腾后时间到了2分钟之内,但是还是跟本地缓存构建区别比较大,大部分时间都在构建和拉缓存上了,并且打包的时候 还会下载go mod 里面的依赖,怀疑可能缓存没有用上,下次有时间再研究

最后放一张构建的时间图,over!

image-20240424091431548