在滴滴云上使用 Jenkins 搭建基于 GitHub 的持续集成环境

简介

Jenkins 是一个可扩展的持续集成引擎,主要用于持续、自动地构建/测试软件项目,还可用于监控一些定时执行的任务。

本文将介绍如何在滴滴云上,使用 Jenkins 作为持续集成服务器,Git 仓库作为代码存储库,实现工程的自动构建、部署等过程。

安装

以下均基于滴滴云 CentOS 7.4 镜像进行安装。

yum install -y java-1.8.0-openjdk   //首先安装jdk1.8或以上版本
sudo wget -O /etc/yum.repos.d/jenkins.repo http://jenkins-ci.org/redhat/jenkins.repo  //需要添加jenkins的yum源
sudo rpm --import http://pkg.jenkins-ci.org/redhat/jenkins-ci.org.key
yum install -y jenkins               //安装jenkins

运行

执行以下命令,启动 Jenkins 进程:

systemctl start jenkins

服务启动后,查看 /var/log/jenkins/jenkins.log 得到管理员密码。

Jenkins initial setup is required. An admin user has been created and a password generated.
Please use the following password to proceed to installation:

9811815bdf454944aea7a505de2c1d30

This may also be found at: /var/lib/jenkins/secrets/initialAdminPassword //也可以在这个目录下找到管理员密码

Jenkins 默认监听 8080 端口,也可通过修改配置 vim /etc/sysconfig/jenkins 更换。
通过 http://公网IP:8080 来访问。

这里出现了无法访问的情况:netstat -anp | grep 8080
查看进程存在,原来是被安全组拦住了,在滴滴云界面上添加一条安全组规则允许 8080 端口访问。
在这里插入图片描述

再次访问,可以登录,输入之前获得的管理员密码进入 Jenkins 的 web 页面。
在这里插入图片描述

安装插件、设置用户信息、设置 Jenkins URL 后,终于登陆到 Jenkins 主界面。
在这里插入图片描述
安装完成后,接下来开始自动部署的配置。

使用 Webhook 方式实现自动部署

生成 GitHub Access Token

首先,为了使 Jenkins 能够正确访问 GitHub 的 API,在 GitHub 页面上依次点击 Setting ->Developer Settings -> Personal Access Token -> Generate new token
在这里插入图片描述
在这里插入图片描述

选择 repo 和 admin:repo_hook 两种权限,第一个是为了正确访问GitHub 仓库,第二个是为了使用 GitHub 的 hook 机制来实现对代码更新的感知。
在这里插入图片描述

生成好的 Token 如图所示,此 Token 只能在生成时看到,如果关闭页面就无法再看到了,所以要谨慎保存。
在这里插入图片描述

配置 Jenkins 的 GitHub 插件

对于 Jenkins 的 GitHub plugin,之前在初始化 Jenkins 进入界面之前一般会默认勾选,并自动安装这个插件。如果没有安装也可以在 Jenkins 的 系统管理->插件管理->可选插件 中找到 GitHub plugin 这个插件。

安装完毕后,需要在 系统管理->系统设置->GitHub 选项卡中添加一个GitHub Server,点击 Add GitHub Server
在这里插入图片描述

选择添加凭据,选择 Secret Text 类型,并把刚才在 GitHub 上获取的 Access Token 填入,点击添加。
在这里插入图片描述

添加完毕后,在 Git Server 一栏选择刚才添加的 Secret Text,然后点击连接测试,提示: Credentials verified for user xxx, rate limit 4998 ,表示连接成功。
在这里插入图片描述

添加构建任务

在 Jenkins 界面上,选择新建任务,选择构建一个自由风格的软件项目。
在这里插入图片描述

勾选 GitHub 项目,填入需要自动构建的 GitHub 项目地址。
在这里插入图片描述

在源码管理一项,勾选 Git。填入项目地址,并在 Credentials 项添加一个有访问权限的账户。在 源码库浏览器 一项选择 githubweb,并依旧填入项目地址。
在这里插入图片描述

为了实现 push 自动构建,还需要在构建触发器中选择 GitHub hook trigger for GITScm polling ,并在构建环境中选择 Use secret text(s) or file(s) 添加之前编辑的 Secret Text(Access Token) 。
在这里插入图片描述

接下来编辑具体项目的构建命令。我在这里使用的示例代码是基于 Go 语言的,向页面发起请求会返回当前 IP 以及版本号。

export GOPATH=/home/dc2-user/gopath     //设置GOPATH
rm -rf $GOPATH/src/github.com/songtm93/deployExample
ln -s $JENKINS_HOME/workspace/deployExample $GOPATH/src/github.com/songtm93/deployExample   //链接
cd $GOPATH/src/github.com/songtm93/deployExample
rm -rf ./output/*   //删除上次编译输出
go build -v -o output/deployExample main.go //编译
make stop   //停止上次进程
./output/deployExample &    //运行

选择 构建步骤->执行shell ,编辑构建命令。
在这里插入图片描述

Jenkins 的工作空间为 JENKINS_HOME ,默认为 /var/lib/jenkins ,可以在 系统管理->系统设置->主目录 下看到。
Jenkins 储存所有的数据文件在这个目录下,可以通过设置 JENKINS_HOME 环境变量或者更改 Jenkins.war 内的 web.xml 设置文件来修改。这个值在 Jenkins 运行时是不能更改的,这里不做修改,将 Jenkins pull 下来的代码作软链到 $GOPATH 目录下确保程序能够正常编译。

执行构建

至此一个简单的自动构建项目已经配置完毕。点击自动构建进行第一次构建。
在这里插入图片描述

这里普遍会遇到一个问题,在 Jenkins 的构建过程中,使用 shell 启动 web 服务进程后,在构建任务完成时,Jenkins 会把构建中启动的所有子进程杀掉,导致 web 进程也 down 掉了。这个问题可以通过在运行 web 进程的命令前临时更改构建任务的 $BUILD_ID 来解决。

OLD_BUILD_ID=$BUILD_ID  //记录当前BUILD_ID
BUILD_ID=DONTKILLME     //更改当前BUILD_ID
make run                //启动web进程
BUILD_ID=$OLD_BUILD_ID  //改回BUILD_ID

提示构建成功后,访问对应的滴滴云主机 IP+ 端口,终于得到正确的返回值。

{"ip":"10.255.20.171","version":"1.0"}

更改当前版本号为"2.0",并 Git push,成功触发了自动构建。
在这里插入图片描述

使用 Publish Over Ssh Plugin 实现批量自动部署

安装 Publish Over Ssh Plugin 插件

在 Jenkins 执行构建完毕后,可以使用插件实现批量自动部署到多台服务器。首先,在 系统管理->插件管理->可选插件 中找到 Publish Over SSH 插件直接安装并重启 Jenkins。

配置 Publish Over SSH

首先在控制台创建两台 DC2,作为代码发布的目标节点,由于是内网访问,可以使用内网 IP,以之前创建的那台 DC2 为跳板,因此不创建 EIP 实例。
在这里插入图片描述

然后在 系统管理->系统设置 中找到 Publish Over SSH 的配置项,选择添加 SSH Server。这里 Passphrase 为目标服务器的登录密码, Path to key 和 key 为可用于登录目标服务器的 sshkey 私钥。但要注意在密码和私钥两项中,如果填了私钥就会默认优先使用私钥登录,若没有事先拷贝公钥到目标服务器,则会一直导致登录失败,笔者就遇到了这个问题。

配置完毕后,点击 Test Configuration 可以测试是否可以连接目标服务器。
在这里插入图片描述

另外,也可以在具体的 SSH Server 下添加对应其的密码或私钥。注意 Remote Directory 里必须填此用户有权限的目录。
在这里插入图片描述

配置自动构建任务

更改好配置后,回到刚才的构建任务, 更改配置->构建后操作->增加构建后操作步骤->Send build artifacts over SSH
在这里插入图片描述

这里选择刚才添加的目标服务器,并编辑配置。
在这里插入图片描述

运行

配置好服务后,之后就可以验证自动部署的集群是否可以正常工作了。使用 SLB 能够方便的进行节点间的负载均衡,在控制台创建一个 SLB 实例。
在这里插入图片描述

创建好 SLB 之后,多次请求 SLB 的 EIP,看是否能够将请求分发到不同服务器上,以及不同服务器是否均部署完毕:

curl http://117.51.157.199/
{"ip":"10.255.20.171","version":"2.0"}
curl http://117.51.157.199/
{"ip":"10.255.20.47","version":"2.0"}
curl http://117.51.157.199/
{"ip":"10.255.20.154","version":"2.0"}
curl http://117.51.157.199/
{"ip":"10.255.20.171","version":"2.0"}
curl http://117.51.157.199/
{"ip":"10.255.20.47","version":"2.0"}
curl http://117.51.157.199/
{"ip":"10.255.20.154","version":"2.0"}

证明集群的自动部署均已成功。

参考

  1. Jenkins 使用 Publish Over SSH 插件实现远程自动部署

  2. Jenkins linux 操作系统一键部署多节点

  3. 构建基于 Jenkins + GitHub 的持续集成环境

  4. 实战:向 GitHub 提交代码时触发 Jenkins 自动构建

  5. 解决 Jenkins 自动杀掉进程大坑

猜你喜欢

转载自blog.csdn.net/java060515/article/details/84582472