首页 > 编程语言 >Jenkins使用Maven构建Java项目

Jenkins使用Maven构建Java项目

时间:2022-09-01 22:23:15浏览次数:75  
标签:Java sonarqube hello Maven sonar Jenkins root war

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





标签:Java,sonarqube,hello,Maven,sonar,Jenkins,root,war
From: https://www.cnblogs.com/wangchengww/p/16648014.html

相关文章

  • Jenkins流水线风格pipeline
    Jenkins流水线风格pipelinepipeline介绍什么是pipelineJenkins2.0的精髓是PipelineasCode,是帮助Jenkins实现CI到CD转变的重要角色。什么是Pipeline,简单来说,就是一套......
  • 在maven引入一个maven仓库中不存在的jar,安装本地的仓库
    在maven引入一个maven仓库中不存在的jar,安装本地的仓库公司内部的jar包肯定不会在网络上存在的.问题描述:如果要在一个maven工程中引入一个不存在的jar,即无法通过denpend......
  • Linux环境安装并配置Maven
    Linux环境安装并配置Maven1.进入Maven官网复制下载地址下载mavenmaven官网:http://maven.apache.org/英文状态下:在线下载maven:wgethttps://dlcdn.apache.org/......
  • # JavaScript 函数
    目录JavaScript函数函数概念函数的使用函数的使用函数的封装函数的参数形参和实参形参和实参个数不匹配问题return终止函数return只能返回一个值JavaScript函数函数概......
  • 【Java基础】方法的重载、可变形参
    1.方法重载同一个类中,方法名相同,参数个数或参数类型不同。根据方法的参数列表的不同来区分。publicintadd(intx,inty){returnx+y;}pu......
  • Java常用类之日期操作类
    日期操作类在Java中对日期的操作类常用的有以下4种:Date类Calendar类DateFormat类SimpleDateFormat类一起来了解一下各个类如何使用的吧!!! 一、Date类1、......
  • 异常java.sql.SQLException: Before start of result set
    使用rs.getString();前一定要加上rs.next();原因:ResultSet对象代表SQL语句执行的结果集,维护指向其当前数据行的光标。每调用一次next()方法,光标向下移动一行。最初它位于......
  • 【Java基础】类的成员之二:方法(函数)
    1.方法表示类或对象具有的功能,也称为函数,定义在类中2.方法的执行过程方法被调用一次就会执行一次,方法中只能调用方法或属性,不能在方法内部定义方法。3.return关键字......
  • java中的语法糖
    Java语法糖语法糖(SyntacticSugar),也称糖衣语法,是由英国计算机学家Peter.J.Landin(彼得·兰丁)发明的一个术语,指在计算机语言中添加的某种语法,这种语法对语言的功能并没有......
  • 正则表达式在Java中的使用
    正则表达式在Java中的使用不仅限于String类中的match()方法!!!正则中的^与$首先我们来了解这两个符号在正则表达式中的作用:^符号放在表达式头部表示开始匹配$符号放......