大家好,我是TJ
一个励志推荐10000款开源项目与工具的程序员
效率,是所有互联网公司追求的。新服务/产品上线之时,往往是全团队最紧张的时刻。一旦出现异常情况,大家熬通宵全网替换程序,一旦出现异常情况还得全部回滚。然后开发人员白天紧急改 bug,又到深夜来找运维升级。可以说是苦不堪言。那么有办法减少这样的痛苦,实现效率的提升呢?
DevOps 运动的兴起给业界提供了一个参考答案。其中CI 和 CD两个理念就是解决开发者和运维协同工作的一剂良方。CI 是 Continuous Integration 的缩写,表示持续集成。CD 是 Continuous Delivery 的缩写,表示持续交付,有时CD也表示持续部署(Continuous Deployment)。持续集成的要求是代码提交后,管理工具在检测到代码变更后,会自动拉取分支代码进行构建,包括编译与单元测试。有更高要求的,还要完成模块测试与集成测试。持续交付则是在持续集成的基础上,提交可用于生产环境部署的正式程序、代码与配置文件。在持续交付阶段,也要进行程序的自动化测试,并实现自动化发布。持续部署是在持续交付的基础上,将代码变更应用到生产环境中。它可以借助多种自动化的部署手段,实现程序的平滑升级/回滚。市场上已经有多款工具可供选择,包括GitLab CI/CD、Jenkins、Circle CI、Pipelines等。我们对最主流的两款工具进行介绍。Jenkins发布于2011年,因其丰富的插件生态、并行执行能力和活跃的社区,赢得了广泛的支持。但Jenkins也有不足,那就是其与代码托管仓库之间的数据交换。2015年,GitLab CI/CD发布,除了出色的CI/CD功能,还能够轻松管理git源码库,逐渐成为非常受欢迎的DevOps CI/CD工具。
GibLab CI/CD 与GitLab 无缝链接,只要开发者合并代码,就会触发GitLab CI/CD自动运行单元测试、构建、部署环境。开发者在GitLab内就能一站式体验CI/CD的自动化服务。GitLab CI/CD支持诸多优秀特性,包括安全部署、实时日志、流水线调试,以及实时校验等。它能够支持流水线在多个主流平台上执行,还支持多种复杂流水线并行运行。这都是GitLab CI/CD极受市场青睐的原因。GitLab CI/CD 的核心包括两个部分,一是 GitLab runner 服务,另一个则是定义流水线内容的配置文件.gitlab.ci.yml。还要掌握三个概念,分别是流水线(pipeline)、阶段(stages)、作业(job),在后面的章节里会对这三个概念详细说明。再遵循如下图的学习过程,就能实现从入门到精通啦。摩拳擦掌想要上手了吗?那就拿起《GitLab CI/CD 从入门到实战》这本书吧,所有你想知道的都在这本书里。
GitLab runner 是由 GitLab 官方用 Go 语言开发的软件包,用于运行 GitLab CI/CD 的流水线作业。这是一款开源软件,在主流操作系统上都可以运行,例如 Linux、MacOS、Windows等。接下来我们以 Linux 环境为例,说明安装与注册过程。注意:GitLab 与 GitLab runner 的版本必须保持一致。下面有通过 docker 和系统命令行两种安装方式,请根据自己的环境任选一种执行。 ▮ 首选 docker 方式安装。因为 docker 已经是运维自动化部署的标配,使用 docker 可以节省不少操作步骤。以下就是用一条命令行搞定: ▮ 其次可采用命令行方式安装,分为两步,下载 RPM 包,安装包:要为某个项目运行流水线,就要为项目注册一个 runner,实际上就是将 runner 与项目进行绑定。因为GitLab 与 GitLab runner 皆为同一家公司的产品,所以内部协议无缝连接,可以实现顺畅通信。一台机器上的 GitLab runner 服务支持多个 runner 实例,每个实例绑定一个项目。这样可以方便地实现分布式配置管理,运维工程师应当注意到这个优点。《GitLab CI/CD 从入门到实战》一书对上述命令行参数有详细解释。如果还有特殊需求要修改配置文件config.toml,也请查阅书中相关内容。至此,GitLab runner 已经在机器里从无到有建立起来了,接下来我们了解流水线的使用。
流水线,就是将 CI/CD 过程中要实现的操作步骤以成组的自动化方式实现。这和工业生产的流水线很类似,一端输入原材料,经过流水线加工之后,输出成型产品。GitLab CI/CD 实现流水线的配置都在.gitlab-ci.yml文件中。它默认保存在项目的根目录下,可以直接用 vim 这样的编辑器修改,也可以在 GitLab 中修改。推荐使用官方提供的 Pipeline Editor 去编辑。.gitlab-ci.yml使用 YAML 数据格式,在编辑的时候要遵循规范,其基本语法特点是:
▮ 大小写敏感;
▮ 使用缩进表示层次关系;
▮ 缩进只支持空格;
▮ 同层元素要左对齐;
▮ 只支持“#”字符的单行注释。
.gitlab-ci.yml的内容定义了一条完整的流水线,它由多个阶段组成,每个阶段包含若干作业。一个阶段内的全部作业执行完毕,才视为该阶段完成,然后开启下一个阶段的执行。作业是具体的任务,例如设置一个环境变量、编译项目源文件,或者打包二进制程序与配置文件等。
下面看一个简单流水线示例:
从上图可知,该流水线包含三个阶段,分别是 install、build、deploy。每个阶段内包含一条 echo 命令打印语句作为作业。在默认情况下,代码被推送到 GitLab 时,就会触发 GitLab runner 去执行流水线。在控制台会依次输出“hello xxx”的内容。 # hello install
# hello build
# hello deploy
不知道大家注意到没有,配置文件中有stages、stage、script等单词,它们就是驱动流水线工作的关键词。可以说,把关键词摸透了,就能将 GitLab CI/CD 的威力发挥出来。从上一节中的内容可以知道,关键词在 GitLab CI/CD 体系中驱动着自动化流程运转。《GitLab CI/CD 从入门到实战》基于 14.1.0 版本编写,涉及 35 个关键词,包括 5 个全局关键词和31 个作业关键词。其中 variables 既是全局关键词又是作业关键词。每个关键词都有其具体功能和意义,初学者要是挨个去看使用手册,可能很快就会迷失在细节里。《GitLab CI/CD 从入门到实战》按照使用频率、复杂程度进行分类,帮我们梳理出了初阶、中阶、高阶三个类别。可以循序渐进地学习,直至搞定复杂需求。我们现在来了解一下,本文中出现的三个关键词的功能与配置。用来声明当前流水线中总共包含多少阶段,值以 YAML 的数组形式保存。这部分一般定义在.gitlab-ci.yml文件顶部,阶段名称有 5 个可选默认值:.pre、build、test、deploy、.post。用户也可以根据实际情况,自定义阶段名称。这是对某一个具体阶段的定义,其值必须取自 stages 已定义值,它的默认值也与 stages 相同。相关的作业会在该阶段下展开,要注意的是,如果配置中没有定义 stages,作业也没有指定 stage,则该流水线全过程皆默认为 test。这是用来定义作业要执行的脚本,script 最终由 runner 来执行。在 Linux 环境下,通常用 shell 脚本语言来编写 script 内容。
往往一个作业会由多条 shell 命令组成,script 支持以 YAML 数组形式排列命令。数组每行以“-”开头,如下例中的“- npm intall”、“- npm build”。
如果命令行中包含复杂符号,例如双引号等,则可以使用单引号将 shell 命令行包括起来。这样在执行时就能保证完整性,不会出现与预期不符的情况。
上述三个关键词是最常用的,属于初阶分类。其他关键词也都可以从属性、功能、定义值等方面去学习掌握,结合实际工作进行摸索尝试,逐渐成长为 DevOps 应用的高手。需要再次强调的是,工具不能代替理念。互联网技术人首先要认同并接受 DevOps 对于信息开放共享、工作自动化的理念,然后通过使用工具去达成目标。GitLab CI/CD 为实现 DevOps 提供了很好的技术支持,在大家都统一认识的基础上,一定可以将工具的能力发挥到最大。同时在《GitLab CI/CD 从入门到实战》的指引下,可以缩短学习周期,降低实践成本,尽快形成生产力。想通过实践 DevOps 通往高效之路吗?那就掌握好 GitLab CI/CD 这款效率神器,给自己装上高速发动机,准备飞起吧!赠书!先到先得!
本次福利将送出《GItLab CI/CD 从入门到实战》 * 10本不抽奖,有积分就能换,杜绝撸羊毛,把福利送到真正需要的人手里,什么你还没积分?赶紧来社区发帖攒积分,有福利就能领!本次福利地址:http://spring4all.com/forum-post/2477.html还有一大波福利正在路上,一起来参与社区内容的建设,一起学习一起成长吧!
往期推荐
点击下方卡片,关注公众号“TJ君”
每天了解一个牛x、好用、有趣的东东