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

本文地址:https://www.cnblogs.com/likeli/p/10521941.html

喜大奔的go mod

官方背书的go mod拯救了我的代码洁癖症!

环境

  • go v1.12
  • docker ce 18.09.0
  • gitlab ce latest

godep

写go程序,若是仅仅是你一个人写,或者就是写个小工具玩儿玩儿,依赖管理对你来说可能没那么重要。

但是在商业的工程项目里,多人协同,go的依赖管理就尤为重要了,之前可选的其实不太多,社区提供的实现方式大多差不多的思路,比如我之前使用的godep。所以项目中会有一个vendor文件夹来存放外部的依赖,这样:

这样的实现方式,每次更新了外部依赖,其他人就得拉下来一大坨。。。

go mod

来看看使用官方的module来管理依赖的工程结构:

是不是,清爽无比,项目也整个瘦身了!

简单的说一下go mod help,至于开启go mod的步骤,其他网文一大堆,就不复制了。毕竟本文是说go工程CI/CD的。

在目前go v1.12版本下,命令go mod help结果如下:

The commands are:

    download    download modules to local cache
    edit        edit go.mod from tools or scripts
    graph       print module requirement graph
    init        initialize new module in current directory
    tidy        add missing and remove unused modules
    vendor      make vendored copy of dependencies
    verify      verify dependencies have expected content
    why         explain why packages or modules are needed

后面CI/CD需要用到的是download指令。

dockerfile

来看看我这个工程的dockerfile:

FROM golang:1.12 as build

ENV GOPROXY https://go.likeli.top
ENV GO111MODULE on

WORKDIR /go/cache

ADD go.mod .
ADD go.sum .
RUN go mod download

WORKDIR /go/release

ADD . .

RUN GOOS=linux CGO_ENABLED=0 go build -ldflags="-s -w" -installsuffix cgo -o app main.go

FROM scratch as prod

COPY --from=build /etc/localtime /etc/localtime
COPY --from=build /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ca-certificates.crt
COPY --from=build /go/release/app /
COPY --from=build /go/release/conf.yaml /

CMD ["/app"]

我这个项目有一些外部依赖,在本地开发的时候都已调整好,并且编译通过,在本地开发环境已经生成了两个文件go.modgo.sum

在dockerfile的第一步骤中,先启动module模式,且配置代理,因为有些墙外的包服务没有梯子的情况下也是无法下载回来的,这里的代理域名是我自己的,有需要的也可以用。

指令RUN go mod download执行的时候,会构建一层缓存,包含了该项所有的依赖。之后再次提交的代码中,若是go.modgo.sum没有变化,就会直接使用该缓存,起到加速构建的作用,也不用重复的去外网下载依赖了。若是这两个文件发生了变化,就会重新构建这个缓存分层。

使用缓存构建的效果:

这个加速效果是很明显的。

减小体积

go构建命令使用-ldflags="-s -w"

在官方文档:Command_Line里面说名了-s -w参数的意义,按需选择即可。

  • -s: 省略符号表和调试信息
  • -w: 省略DWARF符号表

看起来效果不错??

使用scratch镜像

使用golang:1.12开发镜像构建好应用后,在使用scratch来包裹生成二进制程序。

关于最小基础镜像,docker里面有这几类:

  • scratch: 空的基础镜像,最小的基础镜像
  • busybox: 带一些常用的工具,方便调试, 以及它的一些扩展busybox:glibc
  • alpine: 另一个常用的基础镜像,带包管理功能,方便下载其它依赖的包

镜像瘦身最终效果

好了,看看最终构建的应用的效果:

构建的镜像大小为: 16.4MB

CI/CD

基于gitlab的runner来进行CI/CD,看看我的.gitlab-ci.yml配置:

before_script:
- if [[ $(whereis docker-compose | wc -l) -eq 0 ]]; then curl -L "https://github.com/docker/compose/releases/download/1.23.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose && chmod +x /usr/local/bin/docker-compose; fi

# ******************************************************************************************************
# ************************************** 测试环境配置 ****************************************************
# ******************************************************************************************************

deploy-test-tour:
  stage: deploy
  tags:
    - build
  only:
    - release/v2.0
  script:
    - export PRODUCTION=false
    - docker-compose stop
    - docker-compose up -d --build

# ******************************************************************************************************
# ************************************** 生产环境配置 ****************************************************
# ******************************************************************************************************

deploy-prod-tour:
  stage: deploy
  tags:
    - release
  only:
    - master
  script:
    - export PRODUCTION=true
    - docker-compose stop
    - docker-compose up -d --build

我使用docker-compose来进行容器控制,所以在before_script过程里面增加了这一步,方便新机器的全自动化嘛。

我这个项目做了点儿工程化,所以稍微正规点儿,分出了两个环境,测试和生产环境。分别绑定到不同的分支上。

正主就是下面执行的这三行:

export PRODUCTION=false
docker-compose stop
docker-compose up -d --build
  • export控制一下临时环境变量,方便发布不同的环境。
  • docker-compose stop停止旧的容器
  • docker-compose up -d --build编排新的容器并启动,会使用之前的缓存分层镜像,所以除了第一次构建,后面的速度都是杠杠的。

看实际的发布截图:

首次执行,总共:1 minute 22 seconds

使用缓存构建,总共:33 seconds

原文地址:https://www.cnblogs.com/likeli/p/10521941.html

时间: 2024-08-29 19:16:06

使用go mod结合docker分层缓存进行自动CI/CD的相关文章

docker与jenkins的自动化CI/CD流水线实战

docker与jenkins的自动化CI/CD流水线实战 在互联网时代,对于每一家公司,软件开发和发布的重要性不言而喻,目前已经形成一套标准的流程,最重要的组成部分就是持续集成(CI)及持续部署.交付(CD).本文基于Jenkins+Docker+Git实现一套CI自动化发布流程. 高效的CI/CD环境可以获得: ? 及时发现问题 ? 大幅度减少故障率 ? 加快迭代速度 ? 减少时间成本 一.发布流程设计 总结:开发===>提交代码到Git/Svn===>推送到Jenkins====>通

docker与jenkins的自动化CI/CD流水线实战(php-svn)

环境需求 编写dockerfile 备注:内容太长,写在自己的电脑上了流程:1.yum安装基础服务,如gcc,make,openssl2.nginx1.14.0安装3.php-7.1.19安装4.supervisord监听nginx,php服务5.#docker防止中文乱码6.安装crontabs 服务echo "/1 * bash /data/shell/check_supervisord.sh >> /root/check_supervisord.log" >&g

docker与jenkins的自动化CI/CD流水线实战(svn)

准备 安装完成以下环境:1.svn2.jdk3.maven4.tomcat5.jenkins 项目代码测试(php/java):https://github.com/lizhenliang 配置svn 1.查看结构 trunk:主干分支branches:其他分支tags:打标记 将代码最终打到tags目录下,打成版本号标记,然后再jenkins上发布 配置jenkins 1.新建任务 2.如果保留多个,会占用主机的磁盘空间 3.参数化构建过程,就是让你构建时选择 4.填写Pipeline若是不知

基于OpenStack+Docker设计与实现CI/CD

基于Docker容器技术的OpenStack研发.测试.运维及其相关的CI/CD.DevOps等活动.思想是相通的,读者可以取其可用部分用于自己的业务需求中. IaaS云和容器云不是可有可无.相互竞争的关系,而是相互弥补彼此缺陷的关系.容器改变了应用部署和管理的模式,众所周知,IaaS云通过提供基本的计算.存储和网络来运行虚拟机(VM),在IaaS(基础设施即服务)之上,还有PaaS(平台即服务).SaaS(软件即服务).CaaS(容器即服务).OpenStack作为一个IaaS云的基础设施管理

如何使用Docker实现PHP命令行程序的CI/CD?

本文标签: Docker PHP命令行程序的CI/CD Codeship 内容要点: - 使用Jet设置环境并在本地运行测试 - 配置CodeshipPro每次新代码提交时,自动运行测试 - 上一步的测试通过后,自动将更新部署到服务器 持续集成 应用程序和测试套件已经在本地运行,下一步要做的是建立一些持续集成系统.虽然可以设置服务器来执行此操作,但这个过程工作量略大,因此推荐一个像CodeshipPro的服务. 使用Jet进行本地测试 代码提交到Codeship测试前,建议先安装其本地版本的持续

阿里CI/CD、DevOps、分层自动化技术

原文地址:http://www.infoq.com/cn/news/2017/01/alibaba-yunxiao-cicd-devops 在互联网时代,产品快速迭代的重要性不言而喻.不管是传统企业还是初创企业,在提升研发效能方面都有很强的需求,如果能使用一套对项目流程管理和专项自动化提效工具,来支持项目的快速迭代发布,实现24小时持续集成.持续交付整个流程,不但可以提高研发效率,还能增强产品的竞争力! 1月12日,阿里巴巴旗下一站式研发提效平台——云效联手 InfoQ 在阿里巴巴西溪园区举办了

iHealth基于Docker的DevOps CI/CD实践

本文由1月31日晚iHealth运维技术负责人郭拓在Rancher官方技术交流群内所做分享的内容整理而成,分享了iHealth从最初的服务器端直接部署,到现在实现全自动CI/CD的实践经验. 作者简介 郭拓,北京爱和健康科技有限公司(iHealth).负责公司基础服务构建与研发流程定制,曾供职于乐视.21vianet,高龄攻城狮活跃在一线研发工作中,乐此不疲. 前言 相信我,一切事情的发生都是赶鸭子上架,没有例外.人类所有伟大的变革都是迫不得已,可又是那么顺其自然.比如容器(docker)技术的

Jenkins与Docker/Kubernetes的自动化CI/CD流水线实践--免费直播课等你来约

直播老师简介: 李振良·奇虎360-高级运维工程师,主要负责360浏览器业务运维.7年互联网运维工作经验,具备丰富的运维实战经验,曾主导容器云平台建设并将业务容器化部署 老师博客专栏地址:基于Kubernetes企业级容器云平台落地与实践 直播课内容大纲: 1.什么是CI/CD?2.Jenkins Pipeline2.Jenkins与Docker发布JAVA项目3.Jenkins与Kubernetes发布JAVA项目 直播时间: 2018年7月26日(本周四)晚8点30分--9点30分 QQ群直

Docker和CI/CD实战

一.CICD和DevOps 前面已经了解了CI/CD,其实CI/CD已经存在多年了,只是最近软件工程方面又提出了敏捷开发.DevOps,又把CI/CD炒火了. 那么什么是DevOps?DevOps和CI/CD有又什么关系呢? 以下内容摘自https://en.wikipedia.org/wiki/DevOps DevOps (a clipped compound of "development" and "operations") is a software dev