zoukankan      html  css  js  c++  java
  • 04 . Jenkins部署Java项目

    配置基础环境

    注意: 安装使用Jenkins和Gitlab请先看前面文章,此处不详细介绍

    https://www.cnblogs.com/you-men/p/13126873.html

    Jenkins大多数情况下都是用来部署Java项目,Java项目有一个特点是需要编译和打包的,一般情况下编译和打包都是用maven完成,所以系统环境中需要安装maven。

    本次实验,我们采用git私有仓库的形式,涉及到配置密钥,以zrlog来作为本次实验需要部署的java项目

    List
    	CentOS Linux release 7.3.1611 (Core) 
    	jdk-8u151-linux-x64.tar.gz 
    	jenkins-2.222.1-1.1
    	apache-maven-3.5.4-bin.tar.gz 
    	git-2.9.5.tar.gz
    
    节点名 IP 软件版本 硬件 网络
    Jenkins 149.129.38.117 list 里面都有 2C4G Nat,内网
    Tomcat-1 39.108.140.0 list 里面都有 2C4G 公有云

    准备工作

    # 到gitlab上创建一个项目,对jenkins拉取代码做免密,此处不演示了,请看上面提示的那篇文章
    
    下载一个java源码包
    wget https://codeload.github.com/94fzb/zrlog/zip/master
    unzip master
    
    # 然后把解压后的文件移动到从gitlab仓库再提交到gitlab
    # youmen为我gitlab的项目名字
    mv zrlog-master/* youmen/
    cd youmen
    git add .
    git commit -m "add blog source code"
    git push
    
    部署Tomcat

    jdk最好不要使用openjdk,使用openjdk容易出问题

    安装JDK环境

    # CentOS7安装Java,有tar包和rpm包两种
            1>. rpm -ivh jdk-8u121-linux-x64.rpm
            2>. tar xvf jdk-8u151-linux-x64.tar.gz -C /usr/local/
    cd /usr/local/
    mv jdk1.8.0_151/ jdk
    tail -3 /etc/profile
    JAVA_HOME=/usr/local/jdk
    export PATH=$JAVA_HOME/bin:$PATH
    export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
      
    # tomcat软件启动时,会默认到系统的环境变量中查找一个名称叫JAVA_HOME的变量。这个变量的作用找到tomcat启动所需的jvm。
    # tomcat软件启动后,除了查找JAVA_HOME后,还会再查找一个叫CATALINA_HOME变量,这个变量的作用是设置tomcat的根目录。
      
    source /etc/profile
    

    安装Tomcat

    wget https://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-8/v8.5.55/bin/apache-tomcat-8.5.55.tar.gz
    tar xvf apache-tomcat-8.5.47.tar.gz -C /usr/local/
    ln -s /usr/local/apache-tomcat-8.5.47/ /usr/local/tomcat
    tail -1 /etc/profile
    export CATALINA_HOME=/usr/local/tomcat
    
    source /etc/profile
    ev |grep -i home
    CATALINA_HOME=/usr/local/tomcat
    HOME=/root
    
    # 查看熵池的大小: 
    cat /proc/sys/kernel/random/entropy_avail 180
    增加熵池大小,解决Tomcat在CentOS 7巨慢的问题
    
    # 安装rng服务,增大熵池
    yum -y install rng-tools
    systemctl start rngd && systemctl enable rngd
    # 启动服务访问Tomcat页面快一百倍..
    

    开启tomcat管理功能

    vim /usr/local/tomcat/conf/tomcat-users.xml 
    <role rolename="admin"/>  # role配置角色
        <role rolename="admin-gui"/>
        <role rolename="admin-script"/>
        <role rolename="manager"/>
        <role rolename="manager-gui"/>
        <role rolename="manager-script"/>
        <role rolename="manager-jmx"/>
        <role rolename="manager-status"/> 
        <user name="admin" password="admin" roles="admin,manager,admin-gui,admin-script,manager-gui,manager-script,manager-jmx,manager-status" /> 
        
    # tomcat7以上版本还需要修改以下两个文件
    # 默认文件是下面这样
    cat webapps/host-manager/META-INF/context.xml
    <Context antiResourceLocking="false" privileged="true" >
      <Valve className="org.apache.catalina.valves.RemoteAddrValve"
             allow="127.d+.d+.d+|::1|0:0:0:0:0:0:0:1" />
    </Context>
    # 这段代码的作用是限制来访IP的,127.d+.d+.d+|::1|0:0:0:0:0:0:0:1,是正则表达式,表示IPv4和IPv6的本机环回地址,所以这也解释了,为什么我们本机可以访问管理界面,但是其他机器确是403。
    # 那么修改一下这里的正则表达式即可,我们修改为所有人都可以访问,那么改成这样就可以:
    
    
    cat webapps/host-manager/META-INF/context.xml
    <?xml version="1.0" encoding="UTF-8"?>
    <Context antiResourceLocking="false" privileged="true" >
      <Valve className="org.apache.catalina.valves.RemoteAddrValve"
             allow="^.*$" />
      <Manager sessionAttributeValueClassNameFilter="java.lang.(?:Boolean|Integer|Long|Number|String)|org.apache.catalina.filters.CsrfPreventionFilter$LruCache(?:$1)?|java.util.(?:Linked)?HashMap"/>
    </Context>
    

    https://img2020.cnblogs.com/blog/1871335/202006/1871335-20200604173550160-1696672787.png

    配置Jenkins

    安装maven

    因为我们需要通过maven来帮我们编译并打包Java项目,所以这一步是安装好maven,注意这一步是在Jenkins服务器上完成的,官网下载地址:

    # Maven官方下载地址
    # http://mirror.bit.edu.cn/apache/maven/maven-3/3.5.4/binaries/
    # 解压部署
    tar xvf apache-maven-3.5.4-bin.tar.gz -C /usr/local/
    mv /usr/local/apache-maven-3.5.4/ /usr/local/maven
    # 修改/etc/bashrc配置文件,末尾加入下面一行环境变量
    tail -3 /etc/bashrc
    export M2_HOME=/usr/local/maven
    export M2=$M2_HOME/bin
    export PATH=$M2:$PATH:$HOME/bin:/usr/local/git/bin
    
    source /etc/bashrc  
    # 测试maven是否安装成功
    mvn -version
    Apache Maven 3.5.4 (1edded0938998edf8bf061f1ceb3cfdeccf443fe; 2018-06-18T02:33:14+08:00)
    Maven home: /usr/local/maven
    Java version: 1.8.0_151, vendor: Oracle Corporation, runtime: /usr/local/jdk/jre
    Default locale: zh_CN, platform encoding: UTF-8
    OS name: "linux", version: "3.10.0-514.el7.x86_64", arch: "amd64", family: "unix"
    

    Maven是如何编译项目的

    创建项目结构

    选择一个项目目录,在 linux系统上使用下面语句

    # 创建如下结构
    mkdir -p src/main/java/hello
    
    tree src/
    src/
    └── main
        └── java
            └── hello
    

    在src/main/java/hello目录下创建Java文件HelloWorld.javaGreeter.java

    src/main/java/hello/HelloWorld.java
    package hello;
    
    public class HelloWorld {
        public static void main(String[] args) {
            Greeter greeter = new Greeter();
            System.out.println(greeter.sayHello());
        }
    }
    src/main/java/hello/Greeter.java
    package hello;
    
    public class Greeter {
        public String sayHello() {
            return "Hello world!";
        }
    }
    
    定义简单的Maven编译

    首先,在项目的根目录下创建一个Maven项目定义文件pom.xml,该文件主要是说明项目的名称、版本和依赖库

    pom.xml
    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <groupId>org.springframework</groupId>
        <artifactId>gs-maven</artifactId>
        <packaging>jar</packaging>
        <version>0.1.0</version>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-shade-plugin</artifactId>
                    <version>2.1</version>
                    <executions>
                        <execution>
                            <phase>package</phase>
                            <goals>
                                <goal>shade</goal>
                            </goals>
                            <configuration>
                                <transformers>
                                    <transformer
                                        implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                        <mainClass>hello.HelloWorld</mainClass>
                                    </transformer>
                                </transformers>
                            </configuration>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </build>
    </project>
    

    除了 元素可选外,其他的元素是构成pom.xml 文件的最基本的元素了。它包括以下几个项目的配置:

    <modelVersion> :POM 模块版本(通常是4.0.0).
    <groupId> :项目所属的组织编号,通常用域名
    <artifactId> 项目的名称(比如,JAR或者WAR的名称)
    <version> 项目编译的版本号
    <packaging> 项目打包形式,jar或者war
    
    编译Java代码

    运行下面语句编译

    mvn compile
    [INFO] Scanning for projects...
    [INFO] 
    [INFO] --------------------< org.springframework:gs-maven >--------------------
    [INFO] Building gs-maven 0.1.0
    [INFO] --------------------------------[ jar ]---------------------------------
    [INFO] 
    [INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ gs-maven ---
    [WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
    [INFO] skip non existing resourceDirectory /opt/src/main/resources
    [INFO] 
    [INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ gs-maven ---
    [INFO] Changes detected - recompiling the module!
    [WARNING] File encoding has not been set, using platform encoding UTF-8, i.e. build is platform dependent!
    [INFO] Compiling 2 source files to /opt/target/classes
    [INFO] ------------------------------------------------------------------------
    [INFO] BUILD SUCCESS
    [INFO] ------------------------------------------------------------------------
    [INFO] Total time: 2.267 s
    [INFO] Finished at: 2020-06-16T20:33:55+08:00
    [INFO] ------------------------------------------------------------------------
    

    编译完成的.class文件将会出现在target/classes目录下.`

    ls target/classes/hello/
    Greeter.class  HelloWorld.class
    

    运行项目

    mvn exec:java -Dexec.mainClass="hello.HelloWorld"
    Hello world!
    [INFO] ------------------------------------------------------------------------
    [INFO] BUILD SUCCESS
    [INFO] ------------------------------------------------------------------------
    [INFO] Total time: 22.844 s
    [INFO] Finished at: 2020-06-16T20:35:44+08:00
    [INFO] -----------
    

    如果不想直接运行.class文件,可以将其打包

    mvn package
    
    ls target/
    classes             maven-archiver  original-gs-maven-0.1.0.jar
    gs-maven-0.1.0.jar  maven-status
    

    打包完成后,会在target目录下生成一个JAR文件,文件名由组成。比如本例,将会根据pom.xml生成gs-maven-0.1.0.jar

    如果你想安装您的项目的JAR文件到本地Maven仓库,那么你应该调用下面语句:

    mvn install
    

    此时,你的项目代码将会经过编译、测试、打包并拷贝到本地依赖库,提供给其他项目引用。

    说到项目依赖,下面说下声明依赖

    声明依赖

    上面的例子比较简单,没有用到其他库。但是真实的项目可能会引用(依赖)到很多其他库。

    下面例子,依赖了Joda Time的库。

    修改src/main/java/hello/HelloWorld.java

    package hello;
    
    import org.joda.time.LocalTime;
    
    public class HelloWorld {
        public static void main(String[] args) {
            LocalTime currentTime = new LocalTime();
            System.out.println("The current local time is: " + currentTime);
            Greeter greeter = new Greeter();
            System.out.println(greeter.sayHello());
        }
    }
    

    现在运行mvn compile将会报错,因为没有声明依赖。在 节点下插入如下:

    <dependencies>
        <dependency>
            <groupId>joda-time</groupId>
            <artifactId>joda-time</artifactId>
            <version>2.2</version>
        </dependency>
    </dependencies>
    

    声明依赖

    这段内容就声明了项目的依赖。每个依赖节点都由三个子节点组成:

    <groupId> : 该依赖库所属的组织名称
    <artifactId> : 依赖的库名
    <version> : 依赖的库版本
    

    在POM 4中, 中还引入了 ,它主要管理依赖的部署。目前 可以使用5个值:

    # compile,缺省值,适用于所有阶段,会随着项目一起发布。
    # provided,类似compile,期望JDK、容器或使用者会提供这个依赖。如servlet.jar。
    # runtime,只在运行时使用,如JDBC驱动,适用运行和测试阶段。
    # test,只在测试时使用,用于编译和运行测试代码。不会随项目发布。
    # system,类似provided,需要显式提供包含依赖的jar,Maven不会在Repository中查找它。
    

    现在你运行mvn compile或者mvn package,Maven会自动下载相关依赖。

    完整的pom.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <groupId>org.springframework</groupId>
        <artifactId>gs-maven</artifactId>
        <packaging>jar</packaging>
        <version>0.1.0</version>
    
    <dependencies>
        <dependency>
            <groupId>joda-time</groupId>
            <artifactId>joda-time</artifactId>
            <version>2.2</version>
        </dependency>
    </dependencies>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-shade-plugin</artifactId>
                    <version>2.1</version>
                    <executions>
                        <execution>
                            <phase>package</phase>
                            <goals>
                                <goal>shade</goal>
                            </goals>
                            <configuration>
                                <transformers>
                                    <transformer
                                        implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                        <mainClass>hello.HelloWorld</mainClass>
                                    </transformer>
                                </transformers>
                            </configuration>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </build>
    </project>
    

    运行项目:

    mvn exec:java -Dexec.mainClass="hello.HelloWorld"
    [INFO] Scanning for projects...
    [INFO] 
    [INFO] --------------------< org.springframework:gs-maven >--------------------
    [INFO] Building gs-maven 0.1.0
    [INFO] --------------------------------[ jar ]---------------------------------
    [INFO] 
    [INFO] --- exec-maven-plugin:3.0.0:java (default-cli) @ gs-maven ---
    The current local time is: 20:42:17.492
    Hello world!
    [INFO] ------------------------------------------------------------------------
    [INFO] BUILD SUCCESS
    [INFO] ------------------------------------------------------------------------
    [INFO] Total time: 1.761 s
    [INFO] Finished at: 2020-06-16T20:42:17+08:00
    [INFO] ------------------------------------------------------------------------
    
    安装对应Maven插件
    Maven Integration:       # 用于构建Maven项目的
    Deploy to container:     # 则是用于发布远程war包的。
    
    # 如果没有安装Maven Integration的话,构建任务时是没有Maven项目的选项的:
    # 安装完插件重启一下就会多出一个构件maven项目了
    

    配置构建Job

    点击新建任务,创建一个maven项目


    配置构建后发邮件

    配置系统发件人邮件信息

    
    

    同样填好SMTP Server的信息,点击"高级" 进行SMTP鉴权的配置,配置邮件人的用户名,密码等信息

    Jenkins发布war包

    Containers选择Tomcat 8.x,Tomcat URL填写要把war包发布到的那台机器的url

    验证

    这时候到目标机器上,看看war包是否已发布到tomcat上了:

    ls /usr/local/tomcat/webapps/
    docs      host-manager  zrlog-2.1.12-SNAPSHOT
    examples  manager       zrlog-2.1.12-SNAPSHOT.war
    
    
    # 我们也可以将war打包好后然后通过shell,ansible脚本部署到远程服务器上
    
  • 相关阅读:
    python类的__repr__方法
    元素定位之css选择器(1)
    selenium-find_element相关内容
    selenium-模块概述(1)
    元素定位之css选择器(2)
    css笔记
    html笔记
    html、css、javascript之间的关系
    去除提示“Chrome正在受到自动软件的控制”
    Python3+RobotFramework+pycharm环境搭建
  • 原文地址:https://www.cnblogs.com/you-men/p/13143694.html
Copyright © 2011-2022 走看看