Jenkins使用Maven构建Java项目
Maven
Maven是一个项目管理和综合工具。Maven提供给开发人员构建一个完整的生命周期框架。
开发团队可以自动完成该项目的基础设施建设,Maven使用标准的目录结构和默认构建生命周期。
Apache的开源项目主要服务于JAVA平台的构建、依赖管理、项目管理。
Project Object Model,项目对象模型。通过xml格式保存的`pom.xml`文件。该文件用于管理:源代码、配置文件、开发者的信息和角色、问题追踪系统、组织信息、项目授权、项目的url、项目的依赖关系等等。该文件是由开发维护,我们运维人员可以不用去关心。
编译Java代码的工具
如:
nginx,make,MySQL,cmake,gamke
## Java也有编译的工具
如:
Maven
Ant
##Java代码容器
tomcat
resin
使用Maven构建Java项目
环境准备
主机名 |
外网IP |
内网IP |
角色 |
应用 |
环境 |
gitlab |
10.0.0.83 |
172.16.1.83 |
代码仓库(CI持续集成) |
gitlab、git |
运维 |
Jenkins |
10.0.0.82 |
172.16.1.82 |
代码部署(CD持续交付/持续部署) |
Jenkins、jdk、maven |
运维 |
web01 |
10.0.0.7 |
172.16.1.7 |
Java容器(Java代码网站) |
tomcat、jdk |
测试 |
web02 |
10.0.0.8 |
172.16.1.8 |
Java容器(Java代码网站) |
tomcat、jdk |
生产 |
配置tomcat
1.安装tomcat和jdk
[root@web02 ~]# yum install -y tomcat
2.启动tomcat
[root@web02 ~]# systemctl start tomcat
3.tomcat站点目录
[root@web02 ~]# ll /var/lib/tomcat/webapps/
# 默认找站点目录下的ROOT中的index.jsp
4.创建Java项目的git仓库
[root@jenkins ~]# tar xf hello-world-war.tar.gz
5.在jenkins安装Maven
[root@jenkins ~]# yum install -y maven
6.查看maven版本和java版本
[root@jenkins ~]# mvn -version
Apache Maven 3.0.5 (Red Hat 3.0.5-17)
Maven home: /usr/share/maven
Java version: 1.8.0_342, vendor: Red Hat, Inc.
Java home: /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.342.b07-1.el7_9.x86_64/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "3.10.0-957.el7.x86_64", arch: "amd64", family: "unix"
[root@jenkins ~]# java -version
openjdk version "1.8.0_342"
OpenJDK Runtime Environment (build 1.8.0_342-b07)
OpenJDK 64-Bit Server VM (build 25.342-b07, mixed mode)
7.修改maven的源
[root@jenkins ~]# vim /etc/maven/settings.xml
<mirrors>
<mirror>
<id>aliyunmaven</id>
<mirrorOf>*</mirrorOf>
<name>阿里云公共仓库</name>
<url>https://maven.aliyun.com/repository/public</url>
</mirror>
8.在gitlab上创建项目
9.添加远程仓库
[root@gitlab hello-world-war]# git remote add hello git@gitlab.jl.com:root/hello-world.git
10.将该目录添加到远程仓库中
[root@jenkins ~]# scp hello-world-war 172.16.1.83:/root
[root@gitlab ~]# cd hello-world-war/
11. 推送代码
[root@gitlab hello-world-war]# git push -u hello -all
12.推送标签
[root@gitlab hello-world-war]# git push -u hello --tag
手动代码上线Java项目
1.从gitlab中把代码拉到jenkins机器上
2.进入jenkins机器工作目录中
3.先编译代码
[root@gitlab hello-world-war]# mvn clean
[root@gitlab hello-world-war]# mvn package
4.发送代码到web中
5.解压代码
[root@web02 ~]# unzip /tmp/hello-world-war-1.0.0.war -d /tmp/hello-world-war-1.0.0
6.做软链接
[root@web02 ~]# ln -s /tmp/hello-world-war-1.0.0 /usr/share/tomcat/webapps/ROOT
Jenkins的Maven风格自动化代码上线
在jenkins上配置Maven
新增JDK
自动化发布脚本
[root@jenkins ~]# vim /var/lib/jenkins/scripts/deploy_hello.sh
#!/bin/bash
build_dir="${WORKSPACE}/target"
war_version=`awk -F '[<>]+' '/version/{print $3}' pom.xml |head -1`
war_pkg="hello-world-war-${war_version}.war"
code_dir="/data/hello_code"
dev_server='172.16.1.9'
test_server='172.16.1.7'
prod_server='172.16.1.8'
soft_link='/usr/share/tomcat/webapps/ROOT'
deploy(){
for ip in $1;do
ssh ${ip} "mkdir -p ${code_dir}"
scp ${build_dir}/${war_pkg} ${ip}:${code_dir}
ssh ${ip} "cd ${code_dir} && /usr/bin/unzip ${war_pkg} -d ${war_pkg%.*}"
ssh ${ip} "rm -f ${soft_link}"
ssh ${ip} "ln -s ${code_dir}/${war_pkg%.*} ${soft_link}"
done
}
case $env in
dev)
deploy $dev_server
;;
test)
deploy $test_server
;;
prod)
deploy $prod_server
;;
esac
构建后发送邮件
#!/bin/bash
build_dir="${WORKSPACE}/target"
war_version=`awk -F '[<>]+' '/version/{print $3}' pom.xml |head -1`
war_pkg="hello-world-war-${war_version}.war"
code_dir="/data/hello_code"
dev_server='172.16.1.9'
test_server='172.16.1.7'
prod_server='172.16.1.8'
soft_link='/usr/share/tomcat/webapps/ROOT'
DATE=`date +%F-%T`
deploy(){
for ip in $1;do
ssh ${ip} "mkdir -p ${code_dir}"
scp ${build_dir}/${war_pkg} ${ip}:${code_dir}
ssh ${ip} "cd ${code_dir} && /usr/bin/unzip ${war_pkg} -d ${war_pkg%.*}_${git_tag_version}"
ssh ${ip} "rm -f ${soft_link}"
ssh ${ip} "ln -s ${code_dir}/${war_pkg%.*}_${git_tag_version} ${soft_link}"
ssh ${ip} "systemctl restart tomcat"
if [ $? -eq 0 ];then
return 0
else
return 1
fi
done
}
send_mail(){
deploy $1
if [ $? -eq 0 ];then
build_status='success'
cat > ${WORKSPACE}/msg.html <<EOF
<style>
.s{
color: green;
}
</style>
<table border=1px color=red>
<tbody>
<tr bgcolor="lightgreen">
<td colspan=7 align=center>Jenkins ${JOB_NAME} 代码发布</td>
</tr>
<tr>
<td align=center>部署环境</td>
<td align=center>部署IP地址</td>
<td align=center>部署tag号</td>
<td align=center>部署时间</td>
<td align=center>部署状态</td>
</tr>
<tr>
<td align=center>${env}</td>
<td align=center>$1</td>
<td align=center>${git_tag_version}</td>
<td align=center>${DATE}</td>
<td class='s' align=center>${build_status}</td>
</tr>
</tbody>
</table>
EOF
else
build_status='field'
cat > ${WORKSPACE}/msg.html <<EOF
<style>
.s{
color: red;
}
</style>
<table border=1px color=red>
<tbody>
<tr bgcolor="lightgreen">
<td colspan=7 align=center>Jenkins ${JOB_NAME} 代码发布</td>
</tr>
<tr>
<td align=center>部署环境</td>
<td align=center>部署IP地址</td>
<td align=center>部署tag号</td>
<td align=center>部署时间</td>
<td align=center>部署状态</td>
</tr>
<tr>
<td align=center>${env}</td>
<td align=center>$1</td>
<td align=center>${git_tag_version}</td>
<td align=center>${DATE}</td>
<td class='s' align=center>${build_status}</td>
</tr>
</tbody>
</table>
EOF
fi
sendEmail \
-f w2794552827@163.com \
-t 3079978291@qq.com \
-s smtp.163.com \
-u "Jenkins ${JOB_NAME} 代码发布"\
-xu w2794552827 \
-xp ZIMGQEGBKRANNNPA \
-o message-content-type=html \
-o message-file=/var/lib/jenkins/workspace/maven-hello/msg.html \
-o message-charset=utf-8 \
-o tls=no
}
case $env in
dev)
send_mail $dev_server
;;
test)
send_mail $test_server
;;
prod)
send_mail $prod_server
;;
esac
Java代码质量检测
SonarQube官网
环境准备
主机名 |
外网IP |
内网IP |
角色 |
应用 |
环境 |
gitlab |
10.0.0.83 |
172.16.1.83 |
代码仓库(CI持续集成) |
gitlab、git |
运维 |
Jenkins |
10.0.0.82 |
172.16.1.82 |
代码部署(CD持续交付/持续部署) |
Jenkins、jdk、maven |
运维 |
web01 |
10.0.0.7 |
172.16.1.7 |
Java容器(Java代码网站) |
tomcat、jdk |
测试 |
web02 |
10.0.0.8 |
172.16.1.8 |
Java容器(Java代码网站) |
tomcat、jdk |
生产 |
sonarqube |
10.0.0.93 |
172.16.1.93 |
代码质量检测工具 |
MySQL、Elasticsearch、sonarqube |
运维 |
优化
# 临时优化
sysctl -w vm.max_map_count=262144
sysctl -w fs.file-max=65536
ulimit -n 65536
ulimit -u 2048
# 永久生效
[root@sonarqube ~]# vim /etc/sysctl.conf
vm.max_map_count=262144
fs.file-max=65536
[root@sonarqube ~]# vim /etc/security/limits.conf
* - nofile 65536
sonarqube - nproc 2048
sonarqube7.7安装
1.安装jdk
[root@sonarqube ~]# yum install -y java
[root@sonarqube ~]# java -version
openjdk version "1.8.0_342"
OpenJDK Runtime Environment (build 1.8.0_342-b07)
OpenJDK 64-Bit Server VM (build 25.342-b07, mixed mode)
2.安装sonarqube
unzip sonarqube-7.7.zip -d /app
3.创建软链接
[root@sonarqube app]# ln -s /app/sonarqube-7.7/ /app/sonarqube
4.创建sonar用户
[root@sonarqube ~]# useradd sonar
5.授权
[root@sonarqube ~]# chown -R sonar.sonar /app/sonarqube*
6.修改sonar配置文件
[root@sonarqube ~]# vim /app/sonarqube/conf/sonar.properties
sonar.jdbc.username=sonar
sonar.jdbc.password=123
sonar.jdbc.url=jdbc:mysql://172.16.1.53:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&useSSL=false
7.启动sonar
[root@sonarqube ~]# su - sonar -c '/app/sonarqube/bin/linux-x86-64/sonar.sh start'
8.浏览器访问
9.登录
更改密码
jenkins tokens:32f4cfafd72ff6807f24baa50d60d426fd99da3c
mvn sonar:sonar \
-Dsonar.projectKey=32f4cfafd72ff6807f24baa50d60d426fd99da3c \
-Dsonar.host.url=http://10.0.0.93:9000 \
-Dsonar.login=32f4cfafd72ff6807f24baa50d60d426fd99da3c
jenkins配置sonar