Jenkins使用Maven构建Java项目

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 git@gitlab.zls.com: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 m17343833094@163.com \
        -t 133411023@qq.com \
        -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





posted @ 2022-09-01 22:13  Gabydawei  阅读(892)  评论(0编辑  收藏  举报