一篇文章入门 centos/redhat下 jenkins 实现自动化部署

Jenkins简介

jenkins是一个开源的持续集成工具,可以帮程序员或者运维的人员解放双手,让很多重复性的工作自动去完成。jenkins里面提供了很多插件与主流的开发工具集成。配置方便,使用方便。本文从安装到部署自动化构建全方位覆盖,一篇文章入门jenkisn, 绝不是虚言。

Jenkins 官网

https://www.jenkins.io/

image-20200707103155531

 

jenkins 下载

https://www.jenkins.io/download/

一般来说,生产环境会安装稳定版,长期支持版本

image-20200707103655606

点击进去,按照提示安装.

执行如下shell, 安装jekins yum源.

sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo
sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key

image-20200707110130257

安装 jekins

yum install jenkins

image-20200707140437148

jenkins yum默认安装位置

在centos总,jenkins 默认安装在 /usr/lib/jenkins/jenkins.war 这里,主要是这个 war包, 另外jenkins的配置文件默认安装在  /etc/init.d/jenkins , 在有必要的条件下,可能需要修改一些参数,比如java  路径,端口等.

修改jenksin 启动所需要的java 路径

image-20200707141927232

这里如果不修改的话,可能会出现: Starting Jenkins bash: /usr/bin/java: No such file or directory 这样的错误,因为jenkins默认的java路径是 /usr/bin/java.

修改jenkins 启动的端口

另外一个配置文件:/etc/sysconfig/jenkins, 这里面可以修改jenkins启动的端口等信息:

image-20200707142641075

为了避免与已经启动的应用端口冲突,我修改成了8888, 如果没有冲突的端口,就可以不修改.

jenkins的启动及状态查看

Centos下启动jenkins

第一种方法启动

sudo systemctl start jenkins

第二种方法启动

既然知道war包路径,其实直接就可以启动了, 同时还可以指定端口:

java -jar jenkins.war --httpPort=8888

jenkins 状态查看

sudo systemctl status jenkins

如果有防火墙,请注意,请不要拦截jekins及默认端口8080

image-20200707143216677

 

配置jenkins

首次登陆jenkins

输入地址: http://192.168.222.111:8888, 会出现登陆

image-20200707143925167

执行命令: cat /var/lib/jenkins/secrets/initialAdminPassword 获取初始密码

cat /var/lib/jenkins/secrets/initialAdminPassword

image-20200707144024043

输入查看到初始密码之后,继续下一步.

image-20200707144203348

点击安装推荐插件,之后,等待jenkins去下载安装。 另外即使安装之后,以后也还可以安装别的插件的, 等待安装完毕...

image-20200707145026709

然后输入管理用户资料

image-20200707151841444

继续下一步:

image-20200707151945517

最后点击 ”保存并完成“。jenkins 初始化基本完成.就可以使用jenkins了.

 

准备工作,安装MAVEN插件

因为很多java 服务端的应用,都还是用maven来管理的,所以在服务器上必须安装maven

在服务器上安装maven, 在测试的机器上,计划安装在: /opt/resources/maven 下面.

wget https://mirror.bit.edu.cn/apache/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz
tar -zxvf apache-maven-3.6.3-bin.tar.gz

修改maven 安装目录下 conf 下的settings.xml 文件, 在 mirrors 节点,配置阿里云的maven仓库,速度应该快点

<mirror>
        <id>alimaven</id>
        <mirrorOf>central</mirrorOf>
        <name>aliyun maven</name>
        <url>http://maven.aliyun.com/nexus/content/repositories/central/</url>
    </mirror>
	
	<!-- 中央仓库1 -->
    <mirror>
        <id>repo1</id>
        <mirrorOf>central</mirrorOf>
        <name>Human Readable Name for this Mirror.</name>
        <url>http://repo1.maven.org/maven2/</url>
    </mirror>
 
 
    <!-- 中央仓库2 -->
    <mirror>
        <id>repo2</id>
        <mirrorOf>central</mirrorOf>
        <name>Human Readable Name for this Mirror.</name>
        <url>http://repo2.maven.org/maven2/</url>
    </mirror>

编辑  /etc/profile, 增加如下内容:

export M2_HOME=/opt/resources/maven/apache-maven-3.6.3
export PATH=$PATH:$M2_HOME/bin

使配置生效

source /etc/profile

检测 maven 是否正常.

mvn -version

image-20200707154225626

 

jenkins的使用

maven 插件安装

image-20200707154442937

进入插件安装见面,在可选插件中,搜索maven, 然后选择  maven integreation 安装.

image-20200707154559933

然后在页面的末尾,可以看到 jenkins 在安装插件.

image-20200707154802710

通过类似的方式,可以安装很多插件, 比如下面是我安装的:

  1. Maven Integration plugin

  2. Maven Release Plug-in Plug-in

  3. Publish Over SSH

jenkins 全局工具配置

安装完毕后,进入 jenkins-系统设置-全局工具配置 中设置maven,jdk 等相关路径。

image-20200707212401118

不勾选自动安装,否则有可能卡死,很慢,毕竟在国外下载,自己先装好,然后配置路径就好了,maven配置类似。

image-20200707212509143

当然,如果还需要用到git等,配置方法类似,需要在服务器上先安装好git, 会方便很多.

配置credentials

在这里有个地方要注意,如果是需要密码或者其他方式认证的话,这里需要创建一个 credentials.  进入jenkins-系统管理中

image-20200708105754570

进入之后,添加域:

image-20200708105857049

输入域的名称及描述:

image-20200708110028345

然后在这个域中添加凭据

image-20200708111102469

添加的这个凭据,在后面配置SVN或者 GIT的时候会用到这个配置, 这里可以配置SVN的登陆用户名和密码,也可以通过其他方式,比如private key等方式。

创建jenkins 任务

通常java服务端应用采用maven来管理,所以前面安装了maven插件,一旦安装maven之后,创建任务的时候就可以选择“构建一个maven项目”

image-20200707212948246

下面主要的几个地方是,配置SVN或者GIT, 我这里用SVN, 而且需要账户和密码.

image-20200707214306511

在这里选择Credentials的时候, 有可能需要参考前面"配置credentials"选项. 需要配置svn登陆用户名及密码.

构建触发器,默认配置

image-20200707214438492

配置Pre step, 简单配置一下,让maven 可以正常工作就可以

image-20200707214659126

然后点击保存

构建项目

在任务的主界面, 点击立即构建,并可以在控制台查看.

image-20200707215059077

查看构建的项目日志,及控制台输出

image-20200707215139659

可以看到控制台的输出.

image-20200707215213174

如果没有任何错误的话,可以看到成功的编译,打包。

image-20200707215317641

到此为止,jenkins的基本用法都介绍了。

自动构建项目

到目前为止,利用jenkins可以顺利的构建项目,是基于我们自己手动点击 立即构建 来实现的。 但实际工作中,应该是自动构建的,自动构建也就是每当有代码提交的时候,会自动触发jenkins去构建。其实我们在点击立即构建的时候,是有一个URL的, 比如我的测试环境为:http://192.168.222.111:8888/job/yihaomen_framework/build?delay=0sec , 那么当有新代码提交的时候,触发这个URL 就实现了自动构建.

给用户增加 API TOKEN

远程调用jenkins 的API, 最好采用TOKEN方式。在jenkins的用户管理中,找到你想用作远程调用的用户,点击进去,并进入设置界面. 找到 API Token, 并“添加新Token”

image-20200708143144450

生成一个新的TOKEN, 然后保存下来,比如我测试生成的token为:111bc93e3a77a1fa77295f25d73cc0e861, 后面的应用会用到这个TOKEN.

测试远程调用这个构建的API是否可以正常工作

为了方便,我在另一台Linux 机器上,直接用CURL 命令调用jenkins服务器上的构建API.

curl -X POST -I -u admin:111bc93e3a77a1fa77295f25d73cc0e861 http://192.168.222.111:8888/job/yihaomen_framework/build

image-20200708144905344

这是一个POST请求, 后面的参数就是用户:TOKEN, 请求的任务地址, 调用成功之后,就可以在jenkens的管理界面看到一个新的正在运行的构建

image-20200708145110739

上面红色框选中的,就是远程触发的构建。到现在为止,一个基本能够触发自动化构建的雏形就出现了。但是我们的代码是提交到SVN上面的呀。SVN才知道代码有没有变更。所以 远程调用jenkins 构建的角色,应该就是SVN. 当然,SVN 也为我们提供了这个机制,就是 webhook, SVN下有 hook 目录.

配置SVN 的hook, 远程触发jenkins 构建项目.

以我自己的SVN, 部署在阿里云上面的,登陆上去,先看看SVN 目录结构,找到hook 目录.

image-20200708150031803

hook 目录下的每一个模板都对应了一个事件, (下图来源于网上)

image-20200708150147733

以post-commit 举例, 当我们提交代码完成之后,触发jenkins自动构建. 先根据模板拷贝一份出来,并修改权限.

cp post-commit.tmpl post-commit
chmod a+x post-commit

然后编辑 post-commit 文件,在中间加入上面curl 远程调用jenkins构建的命令, 在这里需要注意的时,要确保SVN服务能够访问jenkins服务器,至少要能ping通,如果无法访问,是调不通的。 但通常在一个局域网内部的系统是可以访问的, 我这里是阿里云调我本地,所以我用了内网穿透做测试。如果是内网的,就不用这么麻烦了.

其实,post-commit 就是一个shell脚本。

image-20200708151259864

到此为止利用jenkins搭建的完全自动化构建项目就完成了。当然,如果是用git的话,也是类似处理。自动构建之后怎么处理呢?

构建项目之后的后续事项

项目构建之后,会生成相应的war包或者 jar包,那么这些war包,jar 可能还需要再次分发,比如我需要拷贝到机器的某个地方去,需要一次性自动分发到几十台机器上去,然后自动重启应用。这些应该怎么处理呢。前面我们安装了一个jenkins插件: Publish Over SSH,通过这个插件是能完成一部分功能的,但我现在不推荐了。

如果是大量的机器,我建议是通过shell脚本结合ansible一起来处理,自动分发到几十台机器,并重启服务。

image-20200708152154368

关于这方面的处理,有时间再写一篇笔记.

上一篇: django 'dict' object has no attribute get_absolute_url or other attribute
下一篇: 简单写了一个基于spring boot mosquitto 的starter

Avatar

zxd 评论于: 2020-08-28

感谢教程,带领我操作完了,但是有些步骤是不是繁琐了? 比如添加域,可能是我自己没弄明白,不过如果不添加域在添加仓库的时候再输入git账号密码是不是也可以? 我太理解jenkins用户与linux用户有没有什么联系。 我最后用的是gitee仓库,没能参考到svn的自动上传不过方法类似,仍旧感谢!谢谢

Avatar

zxd 评论于: 2020-08-28

感谢教程,带领我操作完了,但是有些步骤是不是反锁了? 比如添加域,可能是我自己没弄明白,不过如果不添加域在添加仓库的时候再输入git账号密码是不是也可以?
我太理解jenkins用户与linux用户有没有什么联系。
仍旧感谢!谢谢
 评论 ( What Do You Think )
名称
邮箱
网址
评论
验证
   
 

 


  • 微信公众号

  • 我的微信

站点声明:

1、一号门博客CMS,由Python, MySQL, Nginx, Wsgi 强力驱动

2、部分文章来源于互联网, 若有侵权, 联系邮箱:summer@yihaomen.com, 同时欢迎大家注册用户,主动发布文章.

3、鄂ICP备14001754号-3, 鄂公网安备 42280202422812号