赞
踩
Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件项目可以进行持续集成。通常,项目中常用Jenkins作为编译打包项目的工具,做自动化部署。
本文的Jenkins安装基于Jenkins.war进行安装。
Jenkins下载地址:https://repo.huaweicloud.com/jenkins/war/
Maven下载地址: https://repo.huaweicloud.com/apache/maven/maven-3/
su - root
# 输入root用户密码
useradd jenkins
passwd jenkins
# 输入两次jenkins用户的密码即可
# 关闭防火墙:
systemctl stop firewalld.service
# 临时关闭SeLinux:
setenforce 0
# 切换Jenkins用户
# 把apache-maven-3.6.3-bin.tar.gz、apache-tomcat-8.5.57.tar.gz、jenkins.war
# 传入服务器的jenkins用户的主目录下
# 切换到root用户
su ‐ root
# step1.创建JDK安装目录
mkdir /usr/local/java
# step2.将JDK‐Linux压缩包上传到step1的目录后,解压缩,并推荐做软链接
ln ‐s /usr/local/java/jdk1.8‐xxxx /usr/local/java/jdk
# step3.添加环境变量
echo 'export JAVA_HOME=/usr/local/java/jdk' >> /etc/profile
echo 'export JRE_HOME=${JAVA_HOME}/jre' >> /etc/profile
echo 'export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib' >> /etc/profile
echo 'export PATH=${JAVA_HOME}/bin:$PATH' >> /etc/profile
source /etc/profile
# step4.验证环境配置
java -version
# 推荐使用yum安装git, 若离线环境,请在网上查找源码包安装git教程
yum ‐y install git
# 验证git安装
git --version
Jenkins编译项目需要用到maven,如果只有Jenkins在使用maven,推荐将maven安装在Jenkins用户下。
# 切换Jenkins用户
su ‐ jenkins
# step1.解压tar包
tar -zxvf apache-maven-3.6.3-bin.tar.gz
# step2.上传maven压缩包到Jenkins用户的home目录下,解压缩之后,推荐做软链接
ln -s apache-maven-3.6.3 maven
# step3.配置maven环境变量
echo 'export MAVEN_HOME=~/maven' >> .bash_profile
echo 'export PATH=${PATH}:${MAVEN_HOME}/bin' >> .bash_profile
source .bash_profile
# step4.添加或修改maven的配置文件/maven/conf/settings.xml(非必要)
# step5.验证maven安装
mvn -v
Jenkins.war依赖tomcat的运行环境,因此需要准备一个tomcat
# 切换Jenkins用户
su ‐ jenkins
# step1.解压tomcat的tar包
tar -zxvf apache-tomcat-8.5.57.tar.gz
# step2.上传tomcat压缩包到Jenkins用户的home目录下,解压缩之后,推荐做软链接
ln -s apache-tomcat-8.5.57 tomcat
# step3.删除tomcat的管理应用,这一步是可选的
cd tomcat/webapps
rm ‐rf *
# step4.修改tomcat启动端口,默认为8080,这一步是可选的,如果当前没有端口冲突
vi ~/tomcat/conf/server.xml
# step5.修改tomcat内存,这一步是可选的,在脚本头添加JAVA_OPTS="‐server ‐Xms2048m ‐Xmx2028m"
vi ~/tomcat/bin/catalina.sh
# 切换jenkins用户
su - jenkins
# 把jenkins用户主目录下刚才上传的war包copy到tomcat的webapp下
cp ~/jenkins.war tomcat/webapps/
# 启动tomcat
sh ~/tomcat/bin/startup.sh
# 第一次启动jenkins时,会生成一个秘钥,在tomcat的日志中查看
vim ~/tomcat/logs/catalina.out
在日志的最下方,找到如图所示,标红的即为jenkins初始秘钥
(1)浏览器地址栏中输入:http://ip:port/jenkins,出现如图所示,将上图中日志标红的秘钥复制进去,填写完后点继续
(2)如果你对jenkins不熟悉的话,推荐选择安装推荐的插件,Jenkins默认国外的镜像源,下载可能很慢,耐心等待。
(3)待插件全部安装完成,会出现如图所示页面,来设置管理员账户密码
填写完点击保存并完成。
最终出现如图所示界面,表示Jenkins已经部署完成。
该插件的功能是提供一个maven项目的构建任务配置摸板。
该插件的功能是提供SSH远程部署,包括将应用包传到远程服务器、执行远程shell命令/脚本等,下载方式同Maven Integration。Publish Over SSH插件依赖于SSH免密登录,因此我们还必须为Jenkins运行的用户配置到目标服务器用户的SSH免密登录。
安装完插件之后,按着箭头顺序找到插件配置项
按照如图所示一次填写相关配置内容
有这么一个场景,比如说我们部署Jenkins的服务器是A,需要部署项目的服务器是B; 我们现在有这样一个需求:
(1)在服务器A上使用git拉取某仓库某分支的代码
(2)使用maven在服务器A上编译并package项目
(3)将package后的jar/war包发送到应用服务器B上
(4)在应用服务器B上执行java -jar或者shell脚本来启动应用
步骤(3)需要怎么实现呢?很容易想到使用ftp进行文件传输,但是又不想让服务器密码作为参数暴露在外;这时候就用到了SSH免密。
我现在有两台服务器:Server,Client; 其中Jenkins部署在Server服务器上,Client作为我们的应用服务器,现在要做的便是Server->Client的SSH免密。
# 切换root用户
su - root
# 确保服务器的ssh服务已经安装并启动
vim /etc/ssh/sshd_config
# 确保AuthorizedKeysFile .ssh/authorized_keys和PubkeyAuthentication yes没有被注释掉
# 切换到jenkins用户
su - jenkins
# 执行命令,一直按回车即可
ssh‐keygen ‐t rsa
执行命令,会发现多出一个.ssh的隐藏目录
# 展示所有文件和文件夹
ls -a
# 展示.ssh目录的内容
cd .ssh
ls
其中id_rsa是私钥文件,id_rsa.pub是公钥文件。我们需要将id_rsa.put公钥文件
传输到服务器B的test用户下
# 使用scp命令传输文件
scp id_rsa.pub test@172.20.10.10:~
公钥传输完毕后,登录服务器B的test用户, 在test用户的主目录:~下执行以下命令:
# 创建.ssh目录
mkdir .ssh
# 创建文件authorized_keys并将公钥的内容写入
cd .ssh/
touch authorized_keys
cat ~/id_rsa.pub >> authorized_keys
# 改变文件权限为600
chmod 600 authorized_keys
# 改变.ssh目录权限为700
cd ..
chmod 700 .ssh
到此为止,服务器A到服务器B的免密就做好了。来实验一下:
服务器A:
服务器B:
传输文件test.txt并没有输入密码,SSH免密成功!
一般这种情况,是由于有人修改了被登录用户的公钥文件authorized_keys以及它所处目录.ssh的权限导致的,只需要将被登录用户的.ssh目录改回700权限,authorized_keys文件改回600权限即可。
如果不行的话,出现"Host key verification failed."这个问题,需要登录到服务器A的jenkins用户下,执行
ssh-keygen -R 你的ip地址
# 例如:
ssh-keygen -R 172.20.10.66
部署场景正如第四章第一节中所描述的一样,作为demo,我在gitee新建一个仓库,通过配置,需要jenkins通过git从gitee指定的仓库中拉取指定分支的代码,然后compile、package打成jar包; 然后将jar包发送到应用服务器B的test的用户的主目录下,然后执行主目录下的start.sh启动脚本,来启动应用。
不过在此基础上,增加一些难度,项目结构为:
项目jenkins-demo需要依赖jenkins-demo-dependencies,否则无法启动; 所以在jenkins-demo的pom中引入jenkins-demo-dependencies作为其依赖。
添加git用户名和密码
其他部分自行百度,在build这里配置上相应的maven命令
填写完后点击保存,jenkins-demo-denpendencies配置方式与其一致,不再重复展示, 需要特别注意的是,由于jenkins-demo引用了jenkins-demo-denpendencies, 所以jenkins-demo-denpendencies需要install
由于项目采用分布式服务架构,后端拆分为对外提供接口的接口层和对内提供服务的服务层,而服务层项目A又引用项目B和C服务,这时发布时就要求先发布A,再发布B和C,最后再发布接口项目。
(注:需要先安装MultiJob插件,具体操作参考上章节中插件的安装)
完成后点击保存。
在应用服务器B的test用户的主目录下上新增启动脚本
我们可以点击小圆圈来查看构建日志
可以看到应用服务器B已经存在jenkins-demo的jar包并且成功执行了startup.sh脚本启动了
对于我们项目来说,整个项目周期肯定不止一个环境,通常有dev、sit、uat、prod等环境; springboot天然支持多环境配置,jenkins打包时也根据参数加载不同配置文件,这里提供一个思路:
(1)项目中配置多个环境的application.properties
(2)Jenkins新增一个jenkins参数
(2) 在shell脚本里新增圈中内容,新增application.properties配置文件,并指定用哪个配置文件
(如果已经有application.properties,可以替换spring.profiles.active的值)
# 如果存在application.properties 可以替换内容
sed -i "2c spring.profiles.active=${env}" application.properties
(3)jar包的启动脚本要指定刚生成的application.properties
#指定配置文件,启动应用
nohup java -jar -Dspring.config.location=./application.properties jenkins-demo.jar &
(4)看一下启动效果,可以看到,我们Spring项目启动是引用的sit环境的配置文件
示例shell脚本:
#!/bin/bash
scp /home/jenkins/.jenkins/workspace/${project_name}/target/${project_name}.jar ${username}@${remote_addr}:~
echo "传输文件到${remote_addr}成功"
ssh -tt ${username}@${remote_addr} << eeooff
cd ~
rm -rf ./application.properties
touch application.properties
echo "spring.profiles.active=${env}" > application.properties
sh startup.sh
sleep 5s
exit
eeooff
echo done!
我们的生产环境,在很多情况下都是无网络的;所以很多jar包无法下载,所以需要我们自己将jar包上传到服务器上,然后采用离线模式去部署。
首先,查看我们的maven目录下的conf目录,目录下有settings.xml文件
我们可以看到,本地maven仓库的路径是用户根目录下的.m2/repository, 这是一个隐藏的目录,我们需要把仓库所需要的jar包上传到该目录下。
# 将本地仓库上传到服务器上的仓库中,当然路径可以在settings.xml中自行修改,这里我就不做修改了,使用默认路径
cd ~/.m2/repository/
# 上传后还有很重要的一点,如果使用离线模式;需要把maven仓库中的_remote.repositories文件都删了,否则离线模式不生效
find . -name '*_remote.repositories*' -type f -print -exec rm -f {} \;
并且还要修改settings.xml文件,添加
<offline>true</offline>
同时,我们在jenkins配置中的maven打包命令也需要修改:
clean install -o -Dmaven.test.skip=true
至此,我们Jenkins的讲解就告一段落了。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。