配置基础环境

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

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

048b0025551d2ff5eb16eabd7605bce4.png

安装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配置角色

# tomcat7以上版本还需要修改以下两个文件

# 默认文件是下面这样

cat webapps/host-manager/META-INF/context.xml

allow="127.d+.d+.d+|::1|0:0:0:0:0:0:0:1" />

# 这段代码的作用是限制来访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

allow="^.*$" />

配置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"

25ce017c68167862dc7a657c58b5cc3e.png

9664deb7d3728e4393e241943601b816.png

173849568aec089ddb4679edf52b21bb.png

Maven是如何编译项目的

创建项目结构

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

# 创建如下结构

mkdir -p src/main/java/hello

tree src/

src/

└── main

└── java

└── hello

在src/main/java/hello目录下创建Java文件HelloWorld.java和Greeter.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

xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">

4.0.0

org.springframework

gs-maven

jar

0.1.0

org.apache.maven.plugins

maven-shade-plugin

2.1

package

shade

implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">

hello.HelloWorld

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

:POM 模块版本(通常是4.0.0).

:项目所属的组织编号,通常用域名

项目的名称(比如,JAR或者WAR的名称)

项目编译的版本号

项目打包形式,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将会报错,因为没有声明依赖。在 节点下插入如下:

joda-time

joda-time

2.2

e1167252c299b9e8c7881020d2a661d1.png

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

: 该依赖库所属的组织名称

: 依赖的库名

: 依赖的库版本

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

# compile,缺省值,适用于所有阶段,会随着项目一起发布。

# provided,类似compile,期望JDK、容器或使用者会提供这个依赖。如servlet.jar。

# runtime,只在运行时使用,如JDBC驱动,适用运行和测试阶段。

# test,只在测试时使用,用于编译和运行测试代码。不会随项目发布。

# system,类似provided,需要显式提供包含依赖的jar,Maven不会在Repository中查找它。

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

完整的pom.xml

xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">

4.0.0

org.springframework

gs-maven

jar

0.1.0

joda-time

joda-time

2.2

org.apache.maven.plugins

maven-shade-plugin

2.1

package

shade

implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">

hello.HelloWorld

运行项目:

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项目了

43e89ce57965712e834fb43c5d9bd47c.png

配置构建Job

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

7a0951fcc8cb37e7d81439fdaaf7851a.png

aa2c32f3f3a013d0aec3b5d54f3f15fc.png

d35a06dfff393e56eb80125a20277783.png

配置构建后发邮件

0f123487a9c7f8f2bddd0e936aa9da66.png

83bf60b9bcfe78bfb959811fadaa267b.png

配置系统发件人邮件信息

0df2e9c8bca3f918c7da44269197ca2c.png

6a605b9822e4cfe2a480ccae15697c82.png

4464bc94c792b5bdea1acdff3d5bf9e8.png

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

077f27f63d4c6dc530b0eb6dc45b2ce4.png

Jenkins发布war包

84445a288198938ec38c945f666101d9.png

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

f1346806bce780d486f1d6413fdfe82f.png

be5f0f6a1e0d922c69010edb4a257898.png

验证

这时候到目标机器上,看看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脚本部署到远程服务器上

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐