CICD实战——服务自动构建与部署

2020-09-30 15:21:36 浏览数 (1)

导语

随着微服务、容器、云计算的发展,近些年 DevOps、CI/CD 等概念越来越多地映入大家的眼帘。许多开发团队都希望应用这些理念来提高软件质量和开发效率,工欲善其事必先利其器,什么样的工具才能够满足开发者的需求?TARS 作为一套优秀的开源微服务开发运营一体化平台,拥有多语言、高性能、敏捷研发、高可用等特点。那么 TARS 是否能够完美支持 DevOps 理念呢?本文通过将开源 CI 工具 Jenkins 与 TARS 集成,进行一次完整的实践来展示如何实现 TARS 服务的自动化构建与部署的流程。

什么是 DevOps 和 CI/CD

随着微服务、容器、云计算的发展,近些年 DevOps、CI/CD 等概念越来越多地映入大家的眼帘。DevOps 是现在流行的一种软件开发方法,将持续开发、持续测试、持续集成、持续部署、持续监控等贯穿到软件开发的生命周期中,用于提高软件的开发质量,被当前几乎所有顶级公司采用。

CI/CD 是实现 DevOps 理念的重要一环,我们先来了解一下概念:CI 指持续集成(Continuous Integration),CD 指持续交付(Continuous Delivery)和持续部署(Continuous Deployment),意思是通过一系列自动化的脚本执行,实现开发过程中的代码的交付和部署,实现快速交付,提高团队开发的效率。

越来越多的开发团队都希望通过 DevOps 来提高软件质量和开发效率,工欲善其事必先利其器,TARS 作为一套优秀的开源微服务开发运营一体化平台,拥有多语言、高性能、敏捷研发、高可用等特点。通过将开源 CI 工具 Jenkins 与 TARS 集成即可实现针对TARS服务开发的 CI/CD 流程。

前期准备

环境

进行本文操作之前,需要提前部署一套 TARS 框架,TARS 框架的安装部署可以查阅官方文档中框架部署部分,要求是部署 Jenkins 的服务器节点能够访问到 TARS 的框架服务即可;也可以直接将 Jenkins 与 TARS 框架部署在同一节点上。

部署 Jenkins 的服务器节点需要能够被 GitHub 的 webhook 访问到,一般只要通外网并打开相应端口即可。

文中使用的操作系统、TARS 框架、TarsCpp 和 Jenkins 的版本如下

  • 操作系统: CentOS7
  • TarsFramework 版本: 2.4.5
  • TarsCpp 版本: 2.4.8
  • Jenkins 版本: 2.235.2 LTS

本文命令都以 CentOS7 为例,如果是其他 Linux 行版或其他操作系统,请自行查阅文档。

部署 TARS 开发环境

在 Jenkins 自动构建 TARS 项目的过程中需要对应的 TARS 开发环境,因此我们需要在构建的机器上部署相应的开发环境。

本文以 TarsCpp 为例,仅介绍 TarsCpp 开发环境的部署,其他语言 TARS 开发环境可以参照官方文档中的 开发入门 > 开发环境部署,安装对应的 TARS 开发环境。

TarsCpp 依赖安装

安装 TarsCpp 之前,需要安装相应的依赖组件,可以通过以下命令安装,更多依赖组件的详细信息可以看到官方文档中的 TarsCpp 开发环境搭建。

代码语言:txt复制
yum -y install glibc-devel gcc gcc-c   bison flex zlib-devel

接着安装 cmake,TarsCpp 需要 cmake 3.2 以上版本,可以使用源码安装或者 yum 安装,任选其一即可。

  • 源码安装(版本在 3.2 以上即可,这里以 3.10.0 为例)
代码语言:txt复制
wget https://cmake.org/files/v3.10/cmake-3.10.0-rc3.tar.gz
tar zxvf cmake-3.10.0-rc3.tar.gz
cd cmake-3.10.0-rc3/
./bootstrap
gmake
gmake install
  • yum 安装

在 CentOS7 中,yum install cmake 默认版本为 2.8,因此我使用 cmake3 ,再创建软连接到 cmake。(也可以不创建软连接,使用 cmake3 代替后续 cmake 命令即可)

代码语言:txt复制
yum -y install cmake3
cd /usr/bin
ln -s cmake3 cmake
安装 TarsCpp 开发环境

通过以下命令安装 TarsCpp 开发环境

代码语言:txt复制
git clone https://github.com/TarsCloud/TarsCpp.git --recursive
cd TarsCpp
mkdir build
cd build
cmake ..
make
make install

安装 Jenkins

Jenkins 依赖安装

Jenkins是用Java编写的,需要安装JDK

代码语言:txt复制
yum -y install java-1.8.0-openjdk-devel

另外Jenkins还需要从 GitLab 或 GitHub 拉取代码,需要安装 Git

代码语言:txt复制
yum -y install git

进阶:为了不让环境过于复杂,可以使用开发编译容器进行服务的构建,读者可以自行探索。

安装

Jenkins 有多种安装方式,这里介绍通过 yum 和 rpm 包安装两种方式,选择其中一种进行安装即可。

  • yum 安装

可以通过以下命令安装 Jenkins,如果安装过程中资源包下载较慢,可以看到下一节使用 rpm 包安装

代码语言:txt复制
wget -O /etc/yum.repos.d/jenkins.repo 
    https://pkg.jenkins.io/redhat-stable/jenkins.repo
rpm --import http://pkg.jenkins.io/redhat/jenkins.io.key
yum install -y jenkins
  • rpm 包安装

多数情况下,国内网络访问外网资源较慢,通过 yum 安装时间会比较长,此时可以通过国内镜像源下载 rpm 包进行安装,这里我们使用清华 tuna 镜像源

代码语言:txt复制
wget https://mirrors.tuna.tsinghua.edu.cn/jenkins/redhat-stable/jenkins-2.235.2-1.1.noarch.rpm
rpm --import http://pkg.jenkins.io/redhat/jenkins.io.key
rpm -ivh jenkins-2.235.2-1.1.noarch.rpm
启动 Jenkins

安装完成后即可通过以下命令运行 jenkins 服务

代码语言:txt复制
systemctl start jenkins

可以通过以下命令查看 Jenkins 的运行状态

代码语言:txt复制
systemctl status jenkins

配置 Jenkins

访问 Jenkins

在浏览器输入 http://${IP}:8080 来访问Jenkins,其中 IP 为服务器公网 IP

第一次访问需要使用 Administrator password 解锁,在日志和服务器文件 /var/lib/jenkins/secrets/initialAdminPassword 中可以找到,我们使用 cat 命令输出密码

代码语言:txt复制
cat /var/lib/jenkins/secrets/initialAdminPassword

插件安装

可以点击安装推荐插件,默认安装的插件足够满足后续的使用。由于还没有更改插件更新中心的地址,安装过程会比较慢,也可以先选择跳过,后续修改更新中心地址为国内源后再下载需要的插件。

更新中心即 Jenkins 插件的下载源,默认为官方下载源,国内访问较慢,具体替换方式和国内镜像源可以查看 Jenkins 中文社区

创建 admin 用户

安装完插件后,会跳转到 admin 用户创建页面,按照页面提示完成即可。

关联代码仓库

Jenkins 可以关联 gitsvn 仓库,也可以是代码托管平台,当仓库有新的 pushmerge 操作时,可以从仓库拉取代码进行构建等操作。这里我们选择的 GitHub 作为关联仓库,其他代码托管平台操作相似。

本文中,我关联了 https://github.com/ETZhangSX/TarsCppCIDemo.git 这个仓库。

生成 secret text

在 GitHub 上称为 token。在 GitHub 主页,进入 右上角头像->Settings->Developer settings->Personal access tokens

点击 Generate new tokenScopes 中我们勾选 repoadmin:repo_hook ,然后点击 Generate token 即可生成 token。在生成页面我们需要复制 token 并保存,因为 token 只会显示一次。

设置 GitHub Webhooks

选择自己在 GitHub 上的 TARS 项目,点击 Settings->Webhooks->Add Webhook

Payload URL 中输入 http://${IP}:8080/github-webhook/ ,其中 IP 为部署 Jenkins 的服务器 IP 或者域名。

接下来要配置插件 GitHub Plugin,如果之前没有安装的话需要安装。

配置 GitHub Plugin

回到 Jenkins 主页,进入 系统管理->系统设置->GitHub->添加GitHub服务器

API URL 中输入 https://api.github.com,凭据点击 添加,类型选择 Secret TextSecret 填入之前 GitHub 上生成的 token,填写描述,其他默认即可,最后点击 添加

然后在凭据下拉栏选择刚刚添加的凭据即可,点击 连接测试 可以测试是否有效。

自动化构建

创建任务

在Jenkins主页点击 新建任务,输入名字后,这里我们选择构建自由风格(free style)的项目,点击 确定

进入任务配置,在 General 中,填写任务的描述,勾选 GitHub项目,填写你的项目构建地址,这里我新建了一个测试仓库 TarsCppCIDemo.

源码管理 中我们选择 GitRepository URL 中填写项目的 git 地址,Credentials 中先点击 添加,添加你的 GitHub 账号,添加过程需要填写 GitHub 账号用户名和密码,最后在下拉列表中选中添加的账号。

指定分支 中可以选择你需要操作的分支,比如只对 dev 分支执行构建操作。这里不推荐使用master 分支,可新建 dev 分支用于代码提交。

说明:master 分支为主分支,一般作为稳定版分支,可以直接用来发布产品,因此需要保证代码的正确性,构建成功后并确定没有问题后再合入该分支;日常开发一般会创建如 dev 的开发分支,多人协作开发则会创建多个开发分支,并以各自的名字或昵称命名来区分。

源码库浏览器 选择 githubwebURL 填写项目地址,这样每次构建生成的 changes 可以链接到 GitHub,查看变更的详情。

构建触发器 中我们勾选 GitHub hook trigger for GITScm polling,这样每次获取到 GitHub 的 webhook都会触发构建。

构建环境 中选择 Use secret text(s) or file(s),然后在 绑定新增 中选中 Secret text凭据 选择 指定凭据,下拉栏选中之前保存的 webhook token。

构建 中可根据自己的需求编写构建的脚本了,在本文生成的测试项目中使用了 TarsCpp,因此构建步骤选择了 执行 shell ,然后通过以下简单的 shell 脚本即可完成项目的构建。

代码语言:txt复制
mkdir -p HelloServer/build
cd HelloServer/build
cmake ..
make -j4
make HelloServer-tar

构建后操作 用于指定构建完成后进行的操作,这里我选择了 Set build status on GitHub commit [deprecated],这表示我能够在构建结束时设置本次 commit 的构建状态,直观体现为 GitHub 对应仓库的 commit 记录中会显示 表示此次 commit 的构建成功或失败。

最后点击 保存,任务就创建好了。

新建 TarsCpp 项目

我们在已经安装 TarsCpp 环境的机器上拉取项目,例如

代码语言:txt复制
git clone https://github.com/ETZhangSX/TarsCppCIDemo.git

然后通过 TarsCpp 的服务创建脚本创建服务项目

代码语言:txt复制
/usr/local/tars/cpp/script/cmake_tars_server.sh TarsCppCIDemo HelloServer Hello

此时,脚本已经默认生成了 TarsCpp 服务的 HelloServer 项目。

push 到 GitHub

我们 commit 刚刚创建的项目,然后 push。

这些涉及 git 的使用,具体请查阅 Git 官方文档

代码语言:txt复制
git add .
git commit -m "helloworld"
git push origin master

自动构建触发

Jenkins 获取到 GitHub 的 webhook 事件后(我们前面已经关联好了),会自动启动构建流程。它会自动通过 git 下载项目,进入项目目录,执行构建操作,构建操作即为我们之前在 构建 中添加的 构建步骤 ,执行 shell 脚本。

我们打开 Jenkins 的页面,可以看到正在运行的构建任务或者已完成的构建,代表 Jenkins 的自动构建配置已经成功了

点击编号,图中为 #8 ,可以查看本次构建的详细信息,包括 shell 构建过程的日志输出。

构建完成可以在 GitHub 上查看对应 commit 的构建状态。

自动化部署

前面讲完了自动化构建,本节讲述如何实现自动化部署。这里我们选择自动化构建类似的方式,使用 Jenkins 实现自动化部署,即通过获取 GitHub 分支状态的变化来进行相应的部署操作。两者主要区别在于操作的分支不同,自动化构建操作 dev 分支,自动化部署操作 master 分支。

修改项目 Webhook 配置

由于 master 分支用于 TARS 服务的自动化部署,一般不直接提交代码,而是通过其他分支合入,因此我们需要获取 master 分支的 Pull requests 事件。我们打开 GitHub 项目 TarsCppCIDemoWebhooks 设置,点击对应 webhookEdit

修改 webhook 的 trigger 方式为 Let me select individual events,即自定义事件,如下

然后新增勾选与 Pull requests 相关的事件,如下

然后点击 Update webhook 保存,GitHub项目的配置就完成了

获取 TarsWeb 接口 Token

在 TarsWeb 管理界面以外要部署服务,需要调用 TarsWeb 的 API 接口,接口需要传入有效的 Token 进行鉴权。因此需要生成可以用于接口调用的 Token。

首先,登录 TarsWeb 管理页面,点击页面右上角用户名下拉栏中的 用户中心 ,然后点击 Token管理--新增Token,选择失效日期和时间后点击 确定 即可成功生成 Token,复制保存 Token 备后续步骤使用。

创建任务

同自动化构建相似,新建任务选择构建自由风格(free style)的项目,名字自定义。

任务配置上大部分相同,仅需要修改两处:

  • 修改 源码管理 中的 指定分支master
  • 修改 构建 中的 shell 构建脚本为
代码语言:txt复制
#!/bin/sh
mkdir -p HelloServer/build
cd HelloServer/build
cmake .. -DTARS_WEB_HOST=http://123.123.123.123:3000 -DTARS_TOKEN=6b4e9****************************68d55a9
make -j4
make HelloServer-tar
make HelloServer-upload

TarsCpp 已经实现了服务直接发布的功能,在使用 cmake 构建项目时传入相应的参数即可。cmake 命令中通过 -D 传入参数,这里我们需要传入两个参数,参数 TARS_WEB_HOST 为自己部署 TarsWeb 的地址,TARS_TOKEN 为前面创建的 API TOKEN,如下。

最后点击 保存 即可生成构建任务。

部署服务

注意,在触发 Jenkins 进行自动部署之前,我们需要提前在 TarsWeb 上进行服务部署,相当于注册服务,后续才能正常发布服务,如下

如果对服务部署存在疑问,可以看到官方的服务开发介绍文档。

自动部署触发

将改动的新代码 push 到 dev 分支,打开 Jenkins 首页,会触发之前创建的自动构建任务,没有触发自动部署的任务。

构建成功后,打开项目的 GitHub 仓库,会出现以下提示,点击 Compare & pull request,提交 Pull request,接下来自动部署才会被触发。

回到 Jenkins 页面,我们可以看到自动部署任务被触发,如果显示构建成功,我们打开 TarsWeb 管理页面,可以看到服务已经发布运行。

总结

本文介绍了如何使用 Jenkins 实现 TARS 服务开发过程中的持续集成与持续部署能力,帮助提高软件的交付速度和构建质量,提升团队的协作效率。

TARS可以在考虑到易用性和高性能的同时快速构建系统并自动生成代码,帮助开发人员和企业以微服务的方式快速构建自己稳定可靠的分布式应用,从而令开发人员只关注业务逻辑,提高运营效率。多语言、敏捷研发、高可用和高效运营的特性使 TARS 成为企业级产品。

TARS微服务助您数字化转型,欢迎访问:

TARS官网:https://TarsCloud.org

TARS源码:https://github.com/TarsCloud

Linux基金会官方微服务免费课程:https://www.edx.org/course/building-microservice-platforms-with-tars

获取《TARS官方培训电子书》:https://wj.qq.com/s2/6570357/3adb/

或扫码获取:

QRQR

0 人点赞