导语
随着微服务、容器、云计算的发展,近些年 DevOps、CI/CD 等概念越来越多地映入大家的眼帘。许多开发团队都希望应用这些理念来提高软件质量和开发效率,工欲善其事必先利其器,什么样的工具才能够满足开发者的需求?TARS 作为一套优秀的开源微服务开发运营一体化平台,拥有多语言、高性能、敏捷研发、高可用等特点。那么 TARS 是否能够完美支持 DevOps 理念呢?本文通过将开源 CI 工具 Jenkins 与 TARS 集成,进行一次完整的实践来展示如何实现 TARS 服务的自动化构建与部署的流程。
目录
- 什么是 DevOps 和 CI/CD
- 前期准备
- 环境
- 部署 TARS 开发环境
- 安装 Jenkins
- 配置 Jenkins
- 访问 Jenkins
- 插件安装
- 创建 admin 用户
- 关联代码仓库
- 生成 secret text
- 设置 GitHub Webhooks
- 配置 GitHub Plugin
- 自动化构建
- 创建任务
- 新建 TarsCpp 项目
- push 到 GitHub
- 自动构建触发
- 自动化部署
- 修改项目 Webhook 配置
- 获取 TarsWeb 接口 Token
- 创建任务
- 部署服务
- 自动部署触发
什么是 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 开发环境搭建。
yum -y install glibc-devel gcc gcc-c++ bison flex zlib-devel
接着安装 cmake
,TarsCpp 需要 cmake 3.2
以上版本,可以使用源码安装或者 yum
安装,任选其一即可。
- 源码安装(版本在
3.2
以上即可,这里以3.10.0
为例)
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
命令即可)
yum -y install cmake3
cd /usr/bin
ln -s cmake3 cmake
安装 TarsCpp 开发环境
通过以下命令安装 TarsCpp 开发环境
git clone https://github.com/TarsCloud/TarsCpp.git --recursive
cd TarsCpp
mkdir build
cd build
cmake ..
make
make install
安装 Jenkins
Jenkins 依赖安装
Jenkins是用Java编写的,需要安装JDK
yum -y install java-1.8.0-openjdk-devel
另外Jenkins还需要从 GitLab 或 GitHub 拉取代码,需要安装 Git
yum -y install git
进阶:为了不让环境过于复杂,可以使用开发编译容器进行服务的构建,读者可以自行探索。
安装
Jenkins 有多种安装方式,这里介绍通过 yum
和 rpm 包安装两种方式,选择其中一种进行安装即可。
yum 安装
可以通过以下命令安装 Jenkins,如果安装过程中资源包下载较慢,可以看到下一节使用 rpm 包安装
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 镜像源
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 服务
systemctl start jenkins
可以通过以下命令查看 Jenkins 的运行状态
systemctl status jenkins
配置 Jenkins
访问 Jenkins
在浏览器输入 http://${IP}:8080
来访问Jenkins,其中 IP
为服务器公网 IP
第一次访问需要使用 Administrator password
解锁,在日志和服务器文件 /var/lib/jenkins/secrets/initialAdminPassword
中可以找到,我们使用 cat
命令输出密码
cat /var/lib/jenkins/secrets/initialAdminPassword
插件安装
可以点击安装推荐插件,默认安装的插件足够满足后续的使用。由于还没有更改插件更新中心的地址,安装过程会比较慢,也可以先选择跳过,后续修改更新中心地址为国内源后再下载需要的插件。
更新中心即 Jenkins 插件的下载源,默认为官方下载源,国内访问较慢,具体替换方式和国内镜像源可以查看 Jenkins 中文社区
创建 admin 用户
安装完插件后,会跳转到 admin 用户创建页面,按照页面提示完成即可。
关联代码仓库
Jenkins 可以关联 git
或 svn
仓库,也可以是代码托管平台,当仓库有新的 push
或 merge
操作时,可以从仓库拉取代码进行构建等操作。这里我们选择的 GitHub 作为关联仓库,其他代码托管平台操作相似。
本文中,我关联了 https://github.com/ETZhangSX/TarsCppCIDemo.git 这个仓库。
生成 secret text
在 GitHub 上称为 token。在 GitHub 主页,进入 右上角头像->Settings->Developer settings->Personal access tokens
点击 Generate new token
,Scopes
中我们勾选 repo
和 admin: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 Text
,Secret
填入之前 GitHub 上生成的 token,填写描述,其他默认即可,最后点击 添加
。
然后在凭据下拉栏选择刚刚添加的凭据即可,点击 连接测试
可以测试是否有效。
自动化构建
创建任务
在Jenkins主页点击 新建任务
,输入名字后,这里我们选择构建自由风格(free style)的项目,点击 确定
进入任务配置,在 General
中,填写任务的描述,勾选 GitHub项目
,填写你的项目构建地址,这里我新建了一个测试仓库 TarsCppCIDemo
.
源码管理
中我们选择 Git
,Repository URL
中填写项目的 git 地址,Credentials
中先点击 添加
,添加你的 GitHub 账号,添加过程需要填写 GitHub 账号用户名和密码,最后在下拉列表中选中添加的账号。
指定分支
中可以选择你需要操作的分支,比如只对 dev
分支执行构建操作。这里不推荐使用master
分支,可新建 dev
分支用于代码提交。
说明:master
分支为主分支,一般作为稳定版分支,可以直接用来发布产品,因此需要保证代码的正确性,构建成功后并确定没有问题后再合入该分支;日常开发一般会创建如dev
的开发分支,多人协作开发则会创建多个开发分支,并以各自的名字或昵称命名来区分。
源码库浏览器
选择 githubweb
,URL
填写项目地址,这样每次构建生成的 changes 可以链接到 GitHub,查看变更的详情。
构建触发器
中我们勾选 GitHub hook trigger for GITScm polling
,这样每次获取到 GitHub 的 webhook都会触发构建。
构建环境
中选择 Use secret text(s) or file(s)
,然后在 绑定
的 新增
中选中 Secret text
,凭据
选择 指定凭据
,下拉栏选中之前保存的 webhook token。
构建
中可根据自己的需求编写构建的脚本了,在本文生成的测试项目中使用了 TarsCpp,因此构建步骤选择了 执行 shell
,然后通过以下简单的 shell 脚本即可完成项目的构建。
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 环境的机器上拉取项目,例如
git clone https://github.com/ETZhangSX/TarsCppCIDemo.git
然后通过 TarsCpp 的服务创建脚本创建服务项目
/usr/local/tars/cpp/script/cmake_tars_server.sh TarsCppCIDemo HelloServer Hello
此时,脚本已经默认生成了 TarsCpp 服务的 HelloServer 项目。
push 到 GitHub
我们 commit 刚刚创建的项目,然后 push。
这些涉及 git
的使用,具体请查阅 Git 官方文档
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 项目 TarsCppCIDemo
的 Webhooks
设置,点击对应 webhook
的 Edit
修改 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 构建脚本为
#!/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/bu...
获取《TARS官方培训电子书》:https://wj.qq.com/s2/6570357/...
或扫码获取:
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。