java项目使用Jenkins自动化运维详细配置流程

  • Post author:
  • Post category:java


Jenkins是现在最流行的持续集成工具,可以帮助我们更方便更规范的发布项目。详细的介绍可以参考

官网

本文详细的介绍了Jenkins从安装到配置使用的详细流程,希望可以给大家带来一些帮助。



1. 环境准备

因为在该机器上需要做的步骤有:从gitlab拉取代码,使用maven编译项目,所以需要安装以下环境

  • Jenkins
  • git
  • maven



1.1 安装Jenkins

yum的repo中默认没有Jenkins,需要先将Jenkins存储库添加到yum repos,执行下面的命令:

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

然后执行下面的命令:

rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key

然后 安装Jenkins

yum install -y jenkins

使用yum安装的方式,Jenkins的配置文件在

/etc/sysconfig

目录下,我们需要对它做些修改。

Jenkins默认端口是8080,容易与其他服务冲突,最好修改下,我这里修改成9503

vi /etc/sysconfig/jenkins

找到端口部分,修改如下

image

然后启动服务

service jenkins start

启动成功后访问地址:

http://10.7.121.30:9503/

打开主页后,根据提示走就行了,注意一点他会推荐很多插件安装,最好都安装下,后面都有用到。



注意

:后面如果文章中有的输入栏或选项你的Jenkins中没有出现,说明你没有安装对应的插件



其他:

查看初始化密码:

less /var/lib/jenkins/secrets/initialAdminPassword



1.2 安装git

git 安装比较简单

yum install git-core

安装完成后,执行

git

查看是否安装成功



1.2 安装maven

下载maven安装包

wget http://mirrors.cnnic.cn/apache/maven/maven-3/3.5.4/binaries/apache-maven-3.5.4-bin.tar.gz

解压maven安装包

tar -zxvf apache-maven-3.5.4-bin.tar.gz

配置maven环境变量

 vi /etc/profile

在底部加入(如果已经有jdk环境变量,注意将PATH合并成一个)

export MAVEN_HOME=/opt/apache-maven-3.5.4
export PATH=$MAVEN_HOME/bin:$PATH

image

配置文件生效

source /etc/profile

查看maven是否安装成功

mvn -version



2. 配置Jenkins

做完上面的准备工作,下面开始对Jenkins进行配置,

不同的项目架构,配置的方式是不一样的。

如果是简单的单体项目,则只需要配置一个流程就够了:

  • 从版本管理拉取最新代码
  • 编译
  • 上传到服务器
  • 执行运行脚本

如果是复杂一点的多模块则需要额外的处理,比如示例项目是一个微服务架构,里面有多个module,使用一个parent module将多个子module联合起来

image

我这里处理的步骤是分成两个流程:



1. 打包
  • 执行parent的mvn package


2. 上传各个服务的jar包及运行启动脚本

先看看配置好的效果,流程分两个步骤,第一个就是打包,第二个就是上传运行发布。

image

下面的示例主要以这种方式来操作。



2.1 配置parent的打包流程

首先在 “系统管理”-“系统设置” 中找到全局属性这栏,选择环境变量,这里需要配置jdk和maven的环境变量,否则在下面执行maven打包的步骤时会出现(即使在服务器上已经配置过了环境变量,这里还需要配置一下)

mvn: command not found

image

配置完成,回到首页, 新建一个任务, 输入任务名称,选择“构建一个自由风格的软件项目”,然后点击ok

[外链图片转存失败(img-8JcxDne8-1568714635840)(https://raw.githubusercontent.com/strivezheng/image/master/blog/image.go3kqd4jx2.png)]

进入到了流程的配置页面,第一步

配置项目代码的git地址(svn同理,选择下面的选项输入svn的项目地址),并在“Credentials”点击添加-点击Jenkins

image

这里认证类型有多种选项,选择最简单用户名密码方式,输入你gitlab的用户名和密码,点击添加

image

然后在下拉框中选择已经保存过的认证(这一步可能要等一会儿,下拉框才会显示出你添加的认证选项)

image

这一步配置完了,下面配置编译项目的流程。下拉到底部构建一栏,选择“执行shell”

image

输入打包命令

mvn package -Dmaven.test.skip=true  

image

点击保存,以上就配置好了编译的流程

回到工程页面,点击“立即构建”,在左下角构建历史中可以看到构建的结果,点击下拉框-控制台输出,可以看到此次运行过程和结果

image

通过输出可以看到具体的执行过程和结果了。


注意输出结果的第三行的workspace,后面的步骤会用到这个路径,生成的jar包在这个路径下


[外链图片转存失败(img-KadfGCOn-1568714635856)(https://raw.githubusercontent.com/strivezheng/image/master/blog/image.7lzj0euq1fo.png)]

image



2.2 配置各个服务的上传jar包及启动

在第一个流程执行完成后,已经生成了每个module的可执行jar包文件,这一步的主要操作就是将jar包推送到需要发布的目录,然后执行启动脚本。

这里分两种情况:

  • Jenkins和你要发布的项目



    同一个服务器
  • Jenkins和你要发布的项目

    不在

    同一个服务器

两个唯一的区别就是在同一个服务器的话,直接将编译好的jar包通过cp命令复制到要发布的目录下,

不在同一个服务器就需要使用ssh插件将jar包上传到发布服务器的发布目录下



2.2.1 Jenkins和你要发布的项目在同一个服务器

这里主要运行的步骤是:

  • 将刚刚编译好的jar包复制到发布环境目录下
  • 启动项目

新建任务-选择“构建一个自由风格的软件项目”

image

下拉到底部构建一栏,选择“执行shell”

image

输入复制jar包命令

cp /var/lib/jenkins/workspace/aps-parent-compile-test/aps-provider-algorithm/target/algorithm.jar /usr/local/tomcat/aps-provider-algorithm-8082/

输入启动脚本命令,


这里要根据你具体的情况来了,如果你的启动脚本不带有杀掉原进程功能,则还要加一个杀进程的步骤。

同样如果是生产环境,还需要添加备份原jar包的命令,这些脚本都放在下面提供参考。

bash /usr/local/tomcat/aps-provider-algorithm-8082/start8082.sh

image



注意



Jenkins复制jar包的时候报错

cp: cannot create regular file ‘/usr/local/tomcat/aps-provider-algorithm-8082/algorithm.jar’: Permission denied

这是因为 /usr/local/tomcat 目录权限的问题,这里修改下改目录权限

chmod 777 tomcat -R

点击“保存”-“立即构建”,可以在控制台上看到此次运行结果。

image

其他服务模块步骤同理,依次创建。

因为创建后面“上传运行”流程与第一个基本类似,后面创建其他流程的时候,可以使用

复制

功能

image



2.2.2 Jenkins和你要发布的项目不在同一个服务器

这里需要用到插件,可以在“系统管理”-“插件管理”-“可选插件”进行筛选

输入“publish over ”,将这两个都装上

image

在 “系统管理”-“系统设置”-“Publish over SSH” 配置需要上传的目标服务器配置

:用户名、密码

image


下面正式开始配置

新建任务-选择“构建一个自由风格的软件项目” ,点击ok

在“构建”栏,新增一个通过ssh发送文件的步骤

image

这里需要配置三个地方,

  • 第一个“name”就是刚刚在全局设置里配置的
  • 第二个是需要上传的源文件
  • 第三个是需要上传到目标服务器的目录

[外链图片转存失败(img-jDkbUdzI-1568714635886)(https://raw.githubusercontent.com/strivezheng/image/master/blog/image.5i28tv38eka.png)]

继续在“构建”一栏,选择“执行shell”

输入启动脚本命令,


这里要根据你具体的情况来了,如果你的启动脚本不带有杀掉原进程功能,则还要加一个杀进程的步骤。

同样如果是生产环境,还需要添加备份原jar包的命令,这些脚本都放在下面提供参考。

bash /usr/local/tomcat/aps-provider-capacity-8083/start8083.sh

image

点击-“保存”,回到主界面“立即构建”,查看输出结果

image



其他

这里贴上我常用的脚本文件


backup.sh

# 备份jar包到jar包所在目录的backup目录下,以当前时间戳重命名
cp -rf capacity.jar backup/capacity_backup_`date '+%Y%m%d_%H.%M.%S'`.jar


start8083.sh

这里指定了jar包运行的端口、应用名、运行环境

#!/bin/sh
source /etc/profile
## 应用选项
CUR_DIR=$(pwd)

APP_DIR=/usr/local/tomcat/aps-provider-capacity-8083

APP_NAME=capacity

APP_PORT=8083

## 环境
APP_PROFILES=dev

JVM_OPTIONS="-Xms256m -Xmx256m"

JAR_NAME=$APP_NAME\.jar

cd $APP_DIR

## 检查进程是否存在
PID=$(ps -ef | grep -w "$APP_NAME" | grep -w "java"| grep -w "$APP_PORT" | grep -v "grep" | awk '{print $2}')
if [ "$PID" == "" ]; then
	echo "应用:$APP_NAME 端口:$APP_PORT 进程不存在。"
else
	echo "应用:$APP_NAME 端口:$APP_PORT 存在进程:$PID"
	kill -15 $PID
	sleep 3
	## 如果仍然存在则强行停止
	CHECK_PID=$(ps -ef | grep -w "$APP_NAME" | grep -w "java"| grep -w "$APP_PORT" | grep -v "grep" | awk '{print $2}')
	if [ "$CHECK_PID" == "" ]; then
		echo "应用:$APP_NAME 端口:$APP_PORT 进程:$PID 停止成功。"
	else
		echo "应用:$APP_NAME 端口:$APP_PORT 进程:$PID 强行停止!"
		kill -9 $PID
	fi
fi

sleep 1

echo "应用:$APP_NAME 端口:$APP_PORT 正在启动..."
nohup java $JVM_OPTIONS -jar -Dspring.profiles.active=$APP_PROFILES $APP_DIR/$JAR_NAME --server.port=$APP_PORT >/dev/null >> nohup.out 2>&1 &
echo "应用启动命令已执行,稍候请检查服务是否可用。"

cd $CUR_DIR

exit 0



stop8083.sh

#!/bin/sh

## 应用选项
APP_NAME=capacity

APP_PORT=8083

## 检查进程是否存在
PID=$(ps -ef | grep -w "$APP_NAME" | grep -w "java"| grep -w "$APP_PORT" | grep -v "grep" | awk '{print $2}')
if [ "$PID" == "" ]; then
	echo "应用:$APP_NAME 端口:$APP_PORT 进程不存在。"
else
	echo "应用:$APP_NAME 端口:$APP_PORT 存在进程:$PID"
	kill -15 $PID
	sleep 3
	## 如果仍然存在则强行停止
	CHECK_PID=$(ps -ef | grep -w "$APP_NAME" | grep -w "java"| grep -w "$APP_PORT" | grep -v "grep" | awk '{print $2}')
	if [ "$CHECK_PID" == "" ]; then
		echo "应用:$APP_NAME 端口:$APP_PORT 进程:$PID 停止成功。"
	else
		echo "应用:$APP_NAME 端口:$APP_PORT 进程:$PID 强行停止!"
		kill -9 $PID
	fi
fi

exit 0



其他错误


如果你使用自己的启动脚本,可能遇到Jenkins提示脚本执行成功,但实际上程序没有起来的问题,(直接连接服务器手动运行脚本是可以起来的,说明脚本是没有问题的)

查看日志发现如下提示

nohup: failed to run command ‘java’: No such file or directory

原因是nohup命令没有找到java环境变量(手动执行又是可以找到的,不知道什么鬼)

参考:https://blog.csdn.net/loveli178/article/details/68069361

在sh脚本中加入一句话

source /etc/profile

手动指定环境变量文件,就ok了

image



版权声明:本文为sinstar1原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。