Jenkins使用Maven构建Java项目

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

posted on 2022-09-04 14:53  jilei  阅读(49)  评论(0编辑  收藏  举报