Linux环境下 Jenkins部署

Linux环境下 Jenkins部署以及应用发布

  • 一、Jenkins是什么
  • 二、Jenkins安装前环境准备
    • 1.Jenkins用户创建
    • 2.配置JDK环境
    • 3.安装Git版本控制
    • 4.安装Maven依赖管理
    • 5.安装tomcat
  • 三、Jenkins部署
    • 1.war包部署在tomcat服务器
    • 2.页面配置
    • 3.安装Jenkins插件
      • (1) Maven Integration
      • (2) Publish Over SSH
    • 4.配置jenkins的java、git和maven环境
  • 四、SSH免密配置
    • 1.场景描述
    • 2.SSH免密登录步骤
    • 3.关于免密突然失效问题
  • 五、应用部署
    • 1. 部署场景
    • 2. 新建jenkins-maven项目
    • 3.新建MultiJob Project
    • 4.构建Jenkins项目
    • 5. 多环境配置
    • 6. 生产环境部署


一、Jenkins是什么

        Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件项目可以进行持续集成。通常,项目中常用Jenkins作为编译打包项目的工具,做自动化部署。

        本文的Jenkins安装基于Jenkins.war进行安装。

        Jenkins下载地址:https://repo.huaweicloud.com/jenkins/war/
        Maven下载地址: https://repo.huaweicloud.com/apache/maven/maven-3/

二、Jenkins安装前环境准备

1.Jenkins用户创建

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用户的主目录下

2.配置JDK环境

# 切换到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

3.安装Git版本控制

# 推荐使用yum安装git, 若离线环境,请在网上查找源码包安装git教程
yum ‐y install git

# 验证git安装
git --version

4.安装Maven依赖管理

        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

5.安装tomcat

        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部署

1.war包部署在tomcat服务器

# 切换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初始秘钥
Linux环境下 Jenkins部署_第1张图片

2.页面配置

        (1)浏览器地址栏中输入:http://ip:port/jenkins,出现如图所示,将上图中日志标红的秘钥复制进去,填写完后点继续
Linux环境下 Jenkins部署_第2张图片
        (2)如果你对jenkins不熟悉的话,推荐选择安装推荐的插件,Jenkins默认国外的镜像源,下载可能很慢,耐心等待。
Linux环境下 Jenkins部署_第3张图片
Linux环境下 Jenkins部署_第4张图片
        (3)待插件全部安装完成,会出现如图所示页面,来设置管理员账户密码
Linux环境下 Jenkins部署_第5张图片
填写完点击保存并完成。
Linux环境下 Jenkins部署_第6张图片
最终出现如图所示界面,表示Jenkins已经部署完成。
Linux环境下 Jenkins部署_第7张图片

3.安装Jenkins插件

(1) Maven Integration

该插件的功能是提供一个maven项目的构建任务配置摸板。Linux环境下 Jenkins部署_第8张图片
Linux环境下 Jenkins部署_第9张图片
Linux环境下 Jenkins部署_第10张图片

(2) Publish Over SSH

        该插件的功能是提供SSH远程部署,包括将应用包传到远程服务器、执行远程shell命令/脚本等,下载方式同Maven Integration。Publish Over SSH插件依赖于SSH免密登录,因此我们还必须为Jenkins运行的用户配置到目标服务器用户的SSH免密登录。
Linux环境下 Jenkins部署_第11张图片
安装完插件之后,按着箭头顺序找到插件配置项
Linux环境下 Jenkins部署_第12张图片
Linux环境下 Jenkins部署_第13张图片
Linux环境下 Jenkins部署_第14张图片

4.配置jenkins的java、git和maven环境

按照如图所示一次填写相关配置内容
Linux环境下 Jenkins部署_第15张图片
Linux环境下 Jenkins部署_第16张图片Linux环境下 Jenkins部署_第17张图片

四、SSH免密配置

1.场景描述

        有这么一个场景,比如说我们部署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免密。

2.SSH免密登录步骤

# 切换root用户
su - root

# 确保服务器的ssh服务已经安装并启动
vim /etc/ssh/sshd_config 

# 确保AuthorizedKeysFile .ssh/authorized_keys和PubkeyAuthentication yes没有被注释掉

# 切换到jenkins用户
su - jenkins

# 执行命令,一直按回车即可
ssh‐keygen ‐t rsa

Linux环境下 Jenkins部署_第18张图片
Linux环境下 Jenkins部署_第19张图片

执行命令,会发现多出一个.ssh的隐藏目录

# 展示所有文件和文件夹
ls -a

# 展示.ssh目录的内容
cd .ssh
ls

在这里插入图片描述在这里插入图片描述
其中id_rsa是私钥文件,id_rsa.pub是公钥文件。我们需要将id_rsa.put公钥文件
传输到服务器B的test用户下

# 使用scp命令传输文件
scp id_rsa.pub [email protected]:~

在这里插入图片描述
公钥传输完毕后,登录服务器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

Linux环境下 Jenkins部署_第20张图片
        到此为止,服务器A到服务器B的免密就做好了。来实验一下:

服务器A:
Linux环境下 Jenkins部署_第21张图片
服务器B:
Linux环境下 Jenkins部署_第22张图片
传输文件test.txt并没有输入密码,SSH免密成功!

3.关于免密突然失效问题

        一般这种情况,是由于有人修改了被登录用户的公钥文件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

五、应用部署

1. 部署场景

        部署场景正如第四章第一节中所描述的一样,作为demo,我在gitee新建一个仓库,通过配置,需要jenkins通过git从gitee指定的仓库中拉取指定分支的代码,然后compile、package打成jar包; 然后将jar包发送到应用服务器B的test的用户的主目录下,然后执行主目录下的start.sh启动脚本,来启动应用。

        不过在此基础上,增加一些难度,项目结构为:
Linux环境下 Jenkins部署_第23张图片
项目jenkins-demo需要依赖jenkins-demo-dependencies,否则无法启动; 所以在jenkins-demo的pom中引入jenkins-demo-dependencies作为其依赖。

2. 新建jenkins-maven项目

Linux环境下 Jenkins部署_第24张图片
Linux环境下 Jenkins部署_第25张图片
Linux环境下 Jenkins部署_第26张图片
添加git用户名和密码
Linux环境下 Jenkins部署_第27张图片
Linux环境下 Jenkins部署_第28张图片
其他部分自行百度,在build这里配置上相应的maven命令
Linux环境下 Jenkins部署_第29张图片
填写完后点击保存,jenkins-demo-denpendencies配置方式与其一致,不再重复展示, 需要特别注意的是,由于jenkins-demo引用了jenkins-demo-denpendencies, 所以jenkins-demo-denpendencies需要install
在这里插入图片描述

3.新建MultiJob Project

        由于项目采用分布式服务架构,后端拆分为对外提供接口的接口层和对内提供服务的服务层,而服务层项目A又引用项目B和C服务,这时发布时就要求先发布A,再发布B和C,最后再发布接口项目。
(注:需要先安装MultiJob插件,具体操作参考上章节中插件的安装)
Linux环境下 Jenkins部署_第30张图片
Linux环境下 Jenkins部署_第31张图片
Linux环境下 Jenkins部署_第32张图片

Linux环境下 Jenkins部署_第33张图片
Linux环境下 Jenkins部署_第34张图片
Linux环境下 Jenkins部署_第35张图片
Linux环境下 Jenkins部署_第36张图片
Linux环境下 Jenkins部署_第37张图片
Linux环境下 Jenkins部署_第38张图片
完成后点击保存。

在应用服务器B的test用户的主目录下上新增启动脚本
在这里插入图片描述

4.构建Jenkins项目

Linux环境下 Jenkins部署_第39张图片
我们可以点击小圆圈来查看构建日志
Linux环境下 Jenkins部署_第40张图片
Linux环境下 Jenkins部署_第41张图片
可以看到应用服务器B已经存在jenkins-demo的jar包并且成功执行了startup.sh脚本启动了
Linux环境下 Jenkins部署_第42张图片

5. 多环境配置

        对于我们项目来说,整个项目周期肯定不止一个环境,通常有dev、sit、uat、prod等环境; springboot天然支持多环境配置,jenkins打包时也根据参数加载不同配置文件,这里提供一个思路:

(1)项目中配置多个环境的application.properties
Linux环境下 Jenkins部署_第43张图片

(2)Jenkins新增一个jenkins参数
Linux环境下 Jenkins部署_第44张图片
Linux环境下 Jenkins部署_第45张图片

(2) 在shell脚本里新增圈中内容,新增application.properties配置文件,并指定用哪个配置文件
Linux环境下 Jenkins部署_第46张图片
(如果已经有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环境的配置文件
Linux环境下 Jenkins部署_第47张图片
示例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!

6. 生产环境部署

我们的生产环境,在很多情况下都是无网络的;所以很多jar包无法下载,所以需要我们自己将jar包上传到服务器上,然后采用离线模式去部署。
首先,查看我们的maven目录下的conf目录,目录下有settings.xml文件
Linux环境下 Jenkins部署_第48张图片
我们可以看到,本地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>trueoffline> 

Linux环境下 Jenkins部署_第49张图片
同时,我们在jenkins配置中的maven打包命令也需要修改:

clean install -o -Dmaven.test.skip=true

Linux环境下 Jenkins部署_第50张图片

至此,我们Jenkins的讲解就告一段落了。

你可能感兴趣的:(笔记,linux,jenkins,maven)