Jenkins使用Maven构建Java项目
什么是Maven
Maven是一个项目管理和综合工具。Maven提供给开发人员构建一个完整的生命周期框架。
开发团队可以自动完成该项目的基础设施建设,Maven使用标准的目录结构和默认构建生命周期。
Apache的开源项目主要服务于JAVA平台的构建、依赖管理、项目管理。
Project Object Model,项目对象模型。通过xml格式保存的pom.xml
文件。该文件用于管理:源代码、配置文件、开发者的信息和角色、问题追踪系统、组织信息、项目授权、项目的url、项目的依赖关系等等。该文件是由开发维护,我们运维人员可以不用去关心。
编译JAVA代码的工具
比如nginx,make
比如MySQL,cmake、gmake
Java也有编译的工具
- Maven
- Ant
JAVA代码容器:
- tomcat
- resin
使用Maven构建Java项目
环境
主机名 | 外网IP | 内网IP | 角色 | 应用 | 环境 |
---|---|---|---|---|---|
gitlab | 10.0.0.91 | 172.16.1.91 | 代码仓库(CI持续集成) | gitlab、git | 运维 |
Jenkins | 10.0.0.92 | 172.16.1.92 | 代码部署(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@web01 www]# yum install -y tomcat
# 2.启动tomcat
[root@web02 ~]# systemctl start tomcat
# 3.tomcat站点目录
/var/lib/tomcat/webapps/
默认找站点目录下的ROOT中的index.jsp
# 4.创建Java项目的git仓库
[root@gitlab ~]# tar xf hello-world-war.tar.gz
# 5.在Jenkins机器上安装Maven
[root@jenkins ~]# yum install -y maven
# 6.查看java版本和maven版本
[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)
[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"
# 7.修改maven的源
[root@gitlab hello-world-war]# vim /etc/maven/settings.xml
在没有被注释的<mirrors>标签下面添加 146 <mirrors>
<mirror>
<id>aliyunmaven</id>
<mirrorOf>*</mirrorOf>
<name>阿里云公共仓库</name>
<url>https://maven.aliyun.com/repository/public</url>
</mirror>
## 添加远程仓库
[root@gitlab hello-world-war]# git remote add hello [email protected]:root/hello-world.git
## 推送代码
[root@gitlab hello-world-war]# git push -u hello --all
## 推送标签
[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@web01 opt]# unzip hello-world-war-1.0.1.war -d hello-world-war-1.0.1
6.做软链接
[root@web01 opt]# ln -s /opt/hello-world-war-1.0.1 /usr/share/tomcat/webapps/ROOT
Jenkins的Maven风格自动化代码上线
在Jenkins上配置Maven
新增一个JDK环境
自动化发布脚本
[root@jenkins mave-hello]# cat /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
构建后发送邮件
[root@jenkins ~]# cat /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'
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 [email protected] \
-t [email protected] \
-s smtp.163.com \
-u "Jenkins ${JOB_NAME} 代码发布"\
-xu m17343833094 \
-xp ZIMGQEGBKRANNNPA \
-o message-content-type=html \
-o message-file=/var/lib/jenkins/workspace/mave-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官网:TP
主机名 | 外网IP | 内网IP | 角色 | 应用 | 环境 |
---|---|---|---|---|---|
gitlab | 10.0.0.91 | 172.16.1.91 | 代码仓库(CI持续集成) | gitlab、git | 运维 |
Jenkins | 10.0.0.92 | 172.16.1.92 | 代码部署(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 | 运维 |
优化
[root@sonarqube ~]# sysctl -w vm.max_map_count=262144
vm.max_map_count = 262144
[root@sonarqube ~]# sysctl -w fs.file-max=65536
fs.file-max = 65536
[root@sonarqube ~]# ulimit -n 65536
[root@sonarqube ~]# 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
sonarqube安装
# 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.更换MySQL yum源
[root@sonarqube ~]# wget https://dev.mysql.com/get/mysql80-community-release-el7-7.noarch.rpm
[root@sonarqube ~]# rpm -ivh mysql80-community-release-el7-7.noarch.rpm
# 3.修改yum源配置
[root@sonarqube ~]# vim /etc/yum.repos.d/mysql-community.repo
[mysql57-community]
name=MySQL 5.7 Community Server
baseurl=http://repo.mysql.com/yum/mysql-5.7-community/el/7/$basearch
enabled=1
gpgcheck=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql-2022
file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql
# 4.安装MySQL5.7
[root@sonarqube ~]# yum install -y mysql-community-server
mysql> create database sonar charset utf8;
mysql> grant all on *.* to sonar@'localhost' identified by '123';
# 5.安装sonarqube
[root@sonarqube ~]# unzip sonarqube-7.7.zip -d /app/
# 6.软链接
[root@sonarqube ~]# ln -s /app/sonarqube-7.7 /app/sonarqube
# 7.创建sonar用户
[root@sonarqube ~]# useradd sonar
# 8.授权
[root@sonarqube ~]# chown -R sonar.sonar /app/sonarqube*
# 9.修改sonar配置文件
[root@sonarqube ~]# vim /app/sonarqube/conf/sonar.properties
sonar.jdbc.username=sonar
sonar.jdbc.password=123
sonar.jdbc.url=jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&useSSL=false
# 10.启动sonar
[root@sonarqube ~]# su - sonar -c '/app/sonarqube/bin/linux-x86-64/sonar.sh start'
# 11.检查端口
[root@sonarqube ~]# netstat -lntup
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.1:32000 0.0.0.0:* LISTEN 21069/java
tcp6 0 0 :::9000 :::* LISTEN 21208/java
tcp6 0 0 127.0.0.1:9001 :::* LISTEN 21089/java
打开浏览器访问:http://10.0.0.93:9000/about
23fdb54fabfde81afd946920fcbd7050508248e9
mvn sonar:sonar \
-Dsonar.projectKey=665532b2cf9f8fa1e534b192f913cdc1b6906451 \
-Dsonar.host.url=http://10.0.0.93:9000 \
-Dsonar.login=665532b2cf9f8fa1e534b192f913cdc1b6906451
jenkins配置sonar