Jenkins介绍
Jenkins是一个独立的开源自动化服务器,可用于自动化与构建、测试、交付或部署软件相关的各种任务。
Jenkins可以通过本机系统包、Docker安装,甚至可以由任何安装了Java运行时环境 (JRE) 的机器独立运行。
SVN介绍
可通过下面链接认识下SVN,有助于整个环境的搭建:
Centos7下SVN服务端搭建以及hook应用_HDZGQ的博客-CSDN博客
目标
svn提交后,jenkins自动拉取最新代码更新到目标服务器,并且重启服务。
PS:使用真实的开发项目(服务端部分)模拟,项目是使用skynet框架(C + lua)开发的。
角色介绍
持续集成工具Jenkins:需要一台机器搭建Jenkins
svn服务端 :版本管理工具服务端,需要一台机器
中间工作站:Jenkins指定一台机器作为该项目发版工作站,负责拉取最新代码同步到目标服务器并重启服务等工作流
目标服务器:模拟线上服务端,需要一台机器
真实项目中,中间工作站可以独占一台机器,也可以在Jenkins所在机器。本文演示示例中,把中间工作站和SVN服务端搭建在同一台机器(因为楼主电脑配置一般,而SVN服务端所在机器负载最低)。
准备
1.三台装载Centos7的VM虚拟机(都是2H2G即可,下面统一称为vm1、vm2和vm3),尽量模拟真实使用场景。当然读者可以只使用一台搭建,效果一样,但配置弄高些,建议至少2H4G,根据实际情况适当增高配置。
2. subversion,包含svn服务端和客户端工具
3. Jenkins RPM安装包 + JDK
4. 了解SSH配置
5. 了解rsync命令
机器安排:
vm1 : 目标服务器
vm2 : svn服务端 和 中间工作站
vm3 : Jenkins
基础环境搭建
1.安装centos7。这里不多介绍,请自行百度或谷歌;
2. vm2安装subversion。请参照下面链接先行了解:
Centos7下SVN服务端搭建以及hook应用_HDZGQ的博客-CSDN博客
3.配置SSH(vm3连vm2,vm2连vm1):配置公钥方式登录,最好也配置下config,以简化登录手续。请参考下面链接先行配置:
ssh介绍和使用--SecureCRT工具和ssh命令使用,以及sshd配置_HDZGQ的博客-CSDN博客
4. rsync,一般不需要安装配置,它使用ssh协议作为传输通道。请参考下面链接先行了解:
rsync介绍,传输方式(ssh和指定rsync用户)以及和scp对比_HDZGQ的博客-CSDN博客_centos7配置rsync
PS:
1.第一次接触自动构建的读者可能会被这么多技术点难住,但实际生产环境的自动构建其实更加完善和复杂。而楼主演示的是真实项目自动构建工具的一个缩小版,个人觉得有一定实际参考价值。熟悉掌握运维的这些基础技术点,相信都会有所收获,本章的自动构建也就不在话下,最后你会发现,实现原理确实不难。此外,楼主会根据步骤,给出真实项目中的应用建议 。
2.本文主要介绍Jenkins和SVN,所以基础的技术点请根据链接先行了解。
一、SVN环境部署(在vm2机器中进行)
1.创建两个svn版本仓库(server和deploy):
yum -y install subversion
svnserve --version
mkdir -p /data/svn/server
mkdir -p /data/svn/deploy
svnadmin create /data/svn/server
svnadmin create /data/svn/deploy
2.修改配置:
分别修改/data/svn/deploy/conf和/data/svn/server/conf路径下的svnserve.conf、passwd和authz文件。以下楼主的修改,把这两个路径的配置配成一样,读者根据实际情况修改即可。
1)svnserve.conf修改
anon-access = none #匿名用户可读
auth-access = write #授权用户可写
password-db = passwd #使用哪个文件作为账号文件
authz-db = authz #使用哪个文件作为权限文件
2)passwd修改
3)authz修改
3.开启svn服务端并开放端口
svnserve -d -r /data/svn --listen-port=3690
firewall-cmd --zone=public --add-port=3690/tcp --permanent
firewall-cmd --reload
4.准备项目本地分支
把前面提到的服务端代码(skynet框架开发的)导入server仓库。提供两种方式,通过svn import PATH URL -m svn_server.log(注:有些文件类型import不成功,如so文件。需要和第二种方法补提交);另一种是先拉取server仓库到本地分支,然后把内容cp到该分支,最后使用svn add + svn commit提交到服务端仓库。
下面准备三个本地分支:
deploy : 模拟开发、运维等人员修改发版等脚本的本地分支,然后提交svn
server : 模拟开发等人员提交服务端代码到svn的本地分支
server_pub : 被工作站用于拉取最新代码的本地分支(同步到目标服务器的内容就是使用此分支)
mkdir -p /data/svnTest
cd /data/svnTest
svn co svn://127.0.0.1/deploy
svn co svn://127.0.0.1/server
svn co svn://127.0.0.1/server server_pub
二、Jenkins安装和界面初配置(除非特别提示,其余都在vm3中进行)
1.安装JDK
下载地址:Java Archive Downloads - Java SE 8 ,我选择的是jdk-8u202-linux-x64.tar.gz , jdk8或jdk11都行。
安装指导,请参考下面链接(其实就是解压,配置下环境变量):
CentOS7安装Java8_flyhaotian的博客-CSDN博客_centos java
vm2也需要JDK环境,中间工作站的运行需要java环境。读者先请自行安装。
2.下载Jenkins RPM包并安装
# 也可以通过游览器下载再上传
wget https://mirrors.tuna.tsinghua.edu.cn/jenkins/redhat/jenkins-2.275-1.1.noarch.rpm
# 安装
rpm -ivh jenkins-2.275-1.1.noarch.rpm
可通过rpm -ql jenkins查看安装目录:
# jenkins重要目录和文件说明
/usr/lib/jenkins/jenkins.war WAR包
/etc/sysconfig/jenkins 配置文件
/var/lib/jenkins/ 默认的JENKINS_HOME目录
/var/log/jenkins/jenkins.log Jenkins日志文件
另一种安装方式是通过yum命令安装,可以参考官网此链接(本人使用RPM包安装,是因为大部分网友使用此方式安装,更加成熟。而且,有网友提出,使用yum安装会有一些一般人解决不了的问题。后面有机会玩下yum方式,毕竟是官方推荐的):
https://www.jenkins.io/doc/book/installing/linux/
3.修改配置
1)修改/etc/sysconfig/jenkins配置
vim /etc/sysconfig/jenkins
# 修改工作目录
JENKINS_HOME="/var/lib/jenkins"
# 修改用户名,使用root是最方便。实际环境最好设置对应账号和权限
JENKINS_USER="root"
# 修改端口号
JENKINS_PORT="8080"
2)修改/etc/init.d/jenkins配置
通过whereis java找到java所在路径
vim /etc/init.d/jenkins
==>>然后在 candidates字段 后追加jdk安装路径
3)启动Jenkins和开放端口
# 修改以后必须使用此命令才能生效
systemctl daemon-reload
# 开启jenkins
systemctl start jenkins
# 开放8080端口
firewall-cmd --zone=public --add-port=8080/tcp --permanent
# 让端口生效
firewall-cmd --reload
--下面的命令有需要再使用------------------------------
# 关闭jenkins
systemctl stop jenkins
# 重启jenkins
systemctl restart jenkins
# 开机启动jenkins
/sbin/chkconfig jenkins on
----卸载----
# 卸载
rpm -e jenkins
#检查是否卸载成功
rpm -ql jenkins
#彻底删除残留文件
find / -iname jenkins | xargs -n 1000 rm -rf
PS:如果有报错,请检查JDK路径是否设置正确
4.Jenkins初配置
1)游览器输入ip:8080。按照提示,在vm3机器找到提示的文件,把管理员密码复制到输入框
2)选择 安装推荐的插件,等待安装完成
3)创建管理员账号(默认管理员账号是admin),后续还可以继续添加新管理员:
4)实例配置(有需要可以在jenkins里修改),默认即可:
5)默认没有安装subversion插件,可先行安装:
路径:Manage Jenkins -- System Configuration -- Manage Plugins
三、自动构建搭建
1.配置中间工作站结点
1)路径:Manage Jenkins -- System Configuration -- Manage Nodes and Clouds -- 新建结点
2)配置结点
3)添加Credentials(添加连接vm2机器的ssh配置):
4)启动代理:
PS: 如果启动不成功,请检查此结点配置vm2的jdk路径是否正确
5)楼主的最终中间工作站结点如下:
PS:读者也可以使用master结点(即默认结点,即Jenkins所在机器)。楼主配置新结点的目标,是因为在实际生产环境中,Jenkins会同时负责多种类型工作(比如前后端两大类,前端打包特耗时),而且为了适应复杂的环境,学习配置新工作结点必要性就很高了。
2.再添加一个用户(编写自动构建命令时使用)
路径:Manage Jenkins -- Security -- Manage Users -- 新建用户
楼主的最终用户列表如下:
3.创建构建任务item(最终支持自动构建和手动执行构建):
1)准备Credentials,用于更新发版脚本:
2)vm1机器准备服务端运行目录和控制脚本
mkdir -p /data/deploy/server
mkdir -p /data/deploy/work
vim /data/deploy/work/deploy.sh
/data/deploy/work/deploy.sh内容如下(主要是重启服务端的指令,读者需自行编写):
#!/bin/bash
/data/deploy/server/ops/restart.sh
3)vm2机器准备发版脚本(重要)
cd /data/svnTest/deploy
vim deploy.sh
/data/svnTest/deploy/deploy.sh内容如下:
#!/bin/bash
curpath=`pwd`
echo "cur path is : $curpath"
flag="--username pub --password 123456 --non-interactive"
cd /data/svnTest/server_pub
/usr/bin/svn revert ./* $flag
/usr/bin/svn up $flag
/usr/bin/rsync -avz --exclude="." --exclude=".." --exclude=".svn" --exclude=".log" ./ sys1://data/deploy/server/
ssh sys1 "/data/deploy/work/deploy.sh > /dev/null < /dev/null 2>&1"
通过svn add + svn commit 把deploy.sh提交svn仓库;
4)创建任务item(重要)
路径:主界面 -- 新建item
配置General:
配置源码管理(这里是管理发版脚本的svn仓库。服务端源码本地仓库的更新直接通过发版脚本控制,前面的发版脚本已贴出内容,即vm2上的/data/svnTest/deploy/deploy.sh):
构建触发器:
构造触发URL
Linux的curl命令:
-X 参数:指定请求方式
-v 参数:显示响应结果
-u 参数:携带用户名/密码
-H 参数:携带请求消息头信息
# AutoDeploy:123456 是jenkins的用户和密码
# 有乱码是因为项目名是中文,使用了urlencode
/usr/bin/curl -X post -v -u AutoDeploy:123456 http://192.168.1.16:8080/job/%E5%8F%91%E5%B8%83/build?token=jenkins-xxx-ok456123789
配置hooks(vm2机器)
cd /data/svn/server/hooks
cp post-commit.tmpl post-commit
chmod 755 post-commit
# 在post-commit最后加入以下内容
/usr/bin/curl -X post -v -u AutoDeploy:123456 http://192.168.1.16:8080/job/%E5%8F%91%E5%B8%83/build?token=jenkins-xxx-ok456123789
# 提示,注释掉 mailer.py commit "$REPOS" "$REV" /path/to/mailer.conf
构建(Jenkins触发的发版脚本,vm2机器上,脚本路径在该任务item的工作目录下 “/data/jenkins_work/workspace/发布”, 而/data/jenkins_work/ 则是test20的工作目录):
在test20结点工作目录(vm2机器 /data/jenkins_work)下,可找到该任务item的工作目录,:
测试:
切换目录到/data/svnTest/server,更改一些文件然后提交svn,观察是否触发运行。楼主的正常触发
手动构建(进入前面创建的item,点击Build Now):
四、Jenkins Pipeline
1.介绍
Pipeline是一套持续交付(CD)工作框架,Jenkins2.x的重要特性,使得Jenkins从持续集成到全面的CD转变。相比于“Freestyle project”模式,Pipeline不但支持在多个node下执行任务,而且更加流程化的管理构建和发布的各个步骤。
Pipeline提供了一组可扩展的工具,通过Pipeline Domain Specific Language(DSL)syntax可以达到Pipeline as Code的目的。即在jenkins item中通过编写特定的代码,却可以更加人性化的流程管理整个构建和发布流程。
Pipeline支持两种代码语法,即声明式和脚本式。可以详细参考官方文档:
https://www.jenkins.io/doc/book/pipeline/
2.搭建实例
1)在Jenkins主界面点击“新建Item“,然后根据截图操作:
2)配置General(根据需求配置,楼主只是填写了一个描述):
3)构建触发器(根据需要配置。若svn提交需触发CI/CD,设置方式和前一节类似):
4) 流水线(重要,控制CI/CD整个过程);
代码示例:
pipeline {
agent {
label 'test20'
}
stages {
stage('update shell') {
steps {
sh 'pwd'
checkout([$class: 'SubversionSCM', additionalCredentials: [], excludedCommitMessages: '', excludedRegions: '', excludedRevprop: '', excludedUsers: '', filterChangelog: false, ignoreDirPropChanges: false, includedRegions: '', locations: [[cancelProcessOnExternalsFail: true, credentialsId: '029e2048-7a22-4c0d-a79c-5244ad91f5e3', depthOption: 'infinity', ignoreExternalsOption: true, local: '.', remote: 'svn://192.168.1.15/deploy']], quietOperation: true, workspaceUpdater: [$class: 'UpdateUpdater']])
}
}
stage('deploy') {
steps {
sh './deploy.sh'
}
}
}
post{
success {
echo 'skynet项目发版成功'
sh 'echo [$JOB_NAME]在工作站[$NODE_NAME]构建[$BUILD_ID]成功!'
emailext body: 'skynet项目发版成功!!!', subject: '发版', to: '[email protected]'
}
failure {
echo 'skynet项目发版失败'
emailext body: 'skynet项目发版失败!!!', subject: '发版', to: '[email protected]'
}
}
}
上面脚本代码说明:在test20工作结点执行工作,第一步'update shell'主要是通过svn拉取发版脚本,第二步'deploy'执行编写好的发版脚本(在该Jenkins Item工作目录下执行,脚本其实和上一节的一样,都是从相同svn仓库拉取的)。如果所有步骤成功,触发发送成功内容邮件;反之,触发发送失败内容邮件。
该Jenkins Item在test20工作结点的工作目录:
5)辅助工具使用说明
Pipeline重点在于Pipeline Script的编写,需先行阅读官方文档,或者通过item配置最后的“链接”辅助编写和学习;
常使用工具(红色框优先学习使用,蓝色次之,其他了解下):
例如,配置svn拉取发版仓库内容的辅助用法:
6)效果图
建议:
1.如果想Jenkins获得更加强大运维能力,需要把目光移向python。
2.有兴趣的同学可以学习下fabric,python+fabric,fabric主要用于进行远程的管道式的(串行)分发命令。
3.建议多熟悉Jenkins Pipeline Script(有兴趣可以再玩下Blue Ocean,增强用户UI体验),它是流水线的精华所在,使用它可以适应更多复杂的运维需求。
参考文献:
Jenkins User Documentation
持续集成工具Jenkins结合SVN的安装和使用_scorpio的博客-CSDN博客_jenkins svn
linux centos7下安装jenkins(rpm安装) - dkn - 博客园
Pipeline
玩转Jenkins Pipeline_大宝鱼的博客-CSDN博客_jenkins pipeline
使用Jenkins+Pipline 持续构建自动化部署之安卓源码打包、测试、邮件通知 - 尘世风 - 博客园
文章推荐:
Blue Ocean
使用Jenkins+Blue Ocean 持续构建自动化部署之安卓源码打包、测试、邮件通知_shifengboy的博客-CSDN博客