一篇文章入门 centos/redhat下 jenkins 实现自动化部署
Jenkins简介
jenkins是一个开源的持续集成工具,可以帮程序员或者运维的人员解放双手,让很多重复性的工作自动去完成。jenkins里面提供了很多插件与主流的开发工具集成。配置方便,使用方便。本文从安装到部署自动化构建全方位覆盖,一篇文章入门jenkisn, 绝不是虚言。
Jenkins 官网
jenkins 下载
https://www.jenkins.io/download/
一般来说,生产环境会安装稳定版,长期支持版本
点击进去,按照提示安装.
执行如下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
安装 jekins
yum install jenkins
jenkins yum默认安装位置
在centos总,jenkins 默认安装在 /usr/lib/jenkins/jenkins.war 这里,主要是这个 war包, 另外jenkins的配置文件默认安装在 /etc/init.d/jenkins , 在有必要的条件下,可能需要修改一些参数,比如java 路径,端口等.
修改jenksin 启动所需要的java 路径
这里如果不修改的话,可能会出现: Starting Jenkins bash: /usr/bin/java: No such file or directory 这样的错误,因为jenkins默认的java路径是 /usr/bin/java.
修改jenkins 启动的端口
另外一个配置文件:/etc/sysconfig/jenkins, 这里面可以修改jenkins启动的端口等信息:
为了避免与已经启动的应用端口冲突,我修改成了8888, 如果没有冲突的端口,就可以不修改.
jenkins的启动及状态查看
Centos下启动jenkins
第一种方法启动
sudo systemctl start jenkins
第二种方法启动
既然知道war包路径,其实直接就可以启动了, 同时还可以指定端口:
java -jar jenkins.war --httpPort=8888
jenkins 状态查看
sudo systemctl status jenkins
如果有防火墙,请注意,请不要拦截jekins及默认端口8080
配置jenkins
首次登陆jenkins
输入地址: http://192.168.222.111:8888, 会出现登陆
执行命令: cat /var/lib/jenkins/secrets/initialAdminPassword 获取初始密码
cat /var/lib/jenkins/secrets/initialAdminPassword
输入查看到初始密码之后,继续下一步.
点击安装推荐插件,之后,等待jenkins去下载安装。 另外即使安装之后,以后也还可以安装别的插件的, 等待安装完毕...
然后输入管理用户资料
继续下一步:
最后点击 ”保存并完成“。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
jenkins的使用
maven 插件安装
进入插件安装见面,在可选插件中,搜索maven, 然后选择 maven integreation 安装.
然后在页面的末尾,可以看到 jenkins 在安装插件.
通过类似的方式,可以安装很多插件, 比如下面是我安装的:
Maven Integration plugin
Maven Release Plug-in Plug-in
Publish Over SSH
jenkins 全局工具配置
安装完毕后,进入 jenkins-系统设置-全局工具配置 中设置maven,jdk 等相关路径。
不勾选自动安装,否则有可能卡死,很慢,毕竟在国外下载,自己先装好,然后配置路径就好了,maven配置类似。
当然,如果还需要用到git等,配置方法类似,需要在服务器上先安装好git, 会方便很多.
配置credentials
在这里有个地方要注意,如果是需要密码或者其他方式认证的话,这里需要创建一个 credentials. 进入jenkins-系统管理中
进入之后,添加域:
输入域的名称及描述:
然后在这个域中添加凭据
添加的这个凭据,在后面配置SVN或者 GIT的时候会用到这个配置, 这里可以配置SVN的登陆用户名和密码,也可以通过其他方式,比如private key等方式。
创建jenkins 任务
通常java服务端应用采用maven来管理,所以前面安装了maven插件,一旦安装maven之后,创建任务的时候就可以选择“构建一个maven项目”
下面主要的几个地方是,配置SVN或者GIT, 我这里用SVN, 而且需要账户和密码.
在这里选择Credentials的时候, 有可能需要参考前面"配置credentials"选项. 需要配置svn登陆用户名及密码.
构建触发器,默认配置
配置Pre step, 简单配置一下,让maven 可以正常工作就可以
然后点击保存
构建项目
在任务的主界面, 点击立即构建,并可以在控制台查看.
查看构建的项目日志,及控制台输出
可以看到控制台的输出.
如果没有任何错误的话,可以看到成功的编译,打包。
到此为止,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”
生成一个新的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
这是一个POST请求, 后面的参数就是用户:TOKEN, 请求的任务地址, 调用成功之后,就可以在jenkens的管理界面看到一个新的正在运行的构建
上面红色框选中的,就是远程触发的构建。到现在为止,一个基本能够触发自动化构建的雏形就出现了。但是我们的代码是提交到SVN上面的呀。SVN才知道代码有没有变更。所以 远程调用jenkins 构建的角色,应该就是SVN. 当然,SVN 也为我们提供了这个机制,就是 webhook, SVN下有 hook 目录.
配置SVN 的hook, 远程触发jenkins 构建项目.
以我自己的SVN, 部署在阿里云上面的,登陆上去,先看看SVN 目录结构,找到hook 目录.
hook 目录下的每一个模板都对应了一个事件, (下图来源于网上)
以post-commit 举例, 当我们提交代码完成之后,触发jenkins自动构建. 先根据模板拷贝一份出来,并修改权限.
cp post-commit.tmpl post-commit chmod a+x post-commit
然后编辑 post-commit 文件,在中间加入上面curl 远程调用jenkins构建的命令, 在这里需要注意的时,要确保SVN服务能够访问jenkins服务器,至少要能ping通,如果无法访问,是调不通的。 但通常在一个局域网内部的系统是可以访问的, 我这里是阿里云调我本地,所以我用了内网穿透做测试。如果是内网的,就不用这么麻烦了.
其实,post-commit 就是一个shell脚本。
到此为止利用jenkins搭建的完全自动化构建项目就完成了。当然,如果是用git的话,也是类似处理。自动构建之后怎么处理呢?
构建项目之后的后续事项
项目构建之后,会生成相应的war包或者 jar包,那么这些war包,jar 可能还需要再次分发,比如我需要拷贝到机器的某个地方去,需要一次性自动分发到几十台机器上去,然后自动重启应用。这些应该怎么处理呢。前面我们安装了一个jenkins插件: Publish Over SSH,通过这个插件是能完成一部分功能的,但我现在不推荐了。
如果是大量的机器,我建议是通过shell脚本结合ansible一起来处理,自动分发到几十台机器,并重启服务。
关于这方面的处理,有时间再写一篇笔记.
From:一号门
COMMENTS