centos7下Jenkins+SVN搭建自动构建和部署

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: 'xxxxxx@qq.com'
        }
        failure {
            echo 'skynet项目发版失败'
            emailext body: 'skynet项目发版失败!!!', subject: '发版', to: 'xxxxxx@qq.com'
        }
    }
}

上面脚本代码说明:在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博客

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值