ElasticSearch 笔记 – 基础API

#新增文档(可以指定id, 或者由es生成)
POST .kibana_1/_doc/[id]
{
  "visualization" : {
      "title" : "First ES Doc",
      "visState" : "this is my first es document2.",
      "uiStateJSON" : "{}",
    },
    "type" : "visualization",
    "updated_at" : "1556582400000"
}

#修改文档
PUT .kibana_1/_doc/466x1GoBzyYXTMCaEtuq
{
  "visualization" : {
      "title" : "First ES Doc",
      "visState" : "this is my first es document2.",
      "uiStateJSON" : "{}",
      "description" : "",
      "version" : 1,
      "kibanaSavedObjectMeta" : {
        "searchSourceJSON" : """{"query":{"query":"","language":"kuery"},"filter":[]}"""
      }
    },
    "type" : "visualization",
    "references" : [ ],
    "migrationVersion" : {
      "visualization" : "7.0.1"
    },
    "updated_at" : "1556582400000"
}

#id查找
GET .kibana_1/_doc/466x1GoBzyYXTMCaEtuq

#指定字段返回
GET .kibana_1/_doc/466x1GoBzyYXTMCaEtuq?_source=visualization.title,visualization.visState,type,migrationVersion

#分页查询size=多少, from从哪里开始
GET .kibana_1/_doc/_search?size=1&from=4000
{
  "query": {
    "match_all": {}
  }
}

#只返回内容
GET .kibana_1/_doc/466x1GoBzyYXTMCaEtuq/_source

#检查是否存在
HEAD .kibana_1/_doc/466x1GoBzyYXTMCaEtuq

#请求参数方式搜索
GET kibana_sample_data_ecommerce/_doc/_search?q=category:Men's Clothing+products.price:>700

#访问映射
GET kibana_sample_data_ecommerce/_mapping

# 分析器演示
GET /_analyze
{
  "analyzer": "english",
  "text": ["This is my house. i'm living here",
          "every one know that",
          "don't you know"]
}

#定义索引映射
PUT kibana_sample_data_ecommerce/_mapping
{
  "properties": {
      "category":{
        "type": "text",
        "index": true
      }
  }
}

#更新索引映射
es中想要给一个已经建好映射的索引改变映射结果,即使改变一个字段类型都是不支持的,
需要重新建立索引以及映射结构,然后把以前的数据导入到新建的索引结构中去,完成改变映射结构的目的。
步骤:
1.给已有的索引定一个别名,并指向该别名
2.新建一个新的索引,新的映射结构
3.将别名指向新的索引,取消旧的索引与别名之间的关联
通过这几部即可达到重新改变映射结构的内容,例如我们想改变library01的映射中price字段的类型由现有的double变为integer类型。

一个简单的例子:

#删除索引
DELETE products

#建立索引
PUT products
{
  "settings": {
    "number_of_shards": 3,
    "number_of_replicas": 1
  }
}
#建立映射
PUT products/_mapping
{
  "properties": {
    "category":{
      "type": "text",
      "index": true
    },
    "id":{
      "type": "text",
      "index": true
    },
    "name":{
      "type": "text",
      "analyzer": "standard"
    },
    "description":{
      "type": "text",
      "analyzer": "standard"
    },
    "price":{
      "type": "double"
    },
    "detail":{
      "type": "text",
      "analyzer": "standard"
    },
    "enabled":{
      "type": "boolean"
    },
    "picture":{
      "type": "text"
    }
  }
}
#查询映射
GET products/_mapping
#写入数据
POST /products/_doc
{
  "category": "HaiLan Home",
  "id": "A92934JSDFIQ9234SJDF",
  "name": "男裤",
  "description": "纯棉 男裤 夏季 清凉一夏 直筒",
  "price": 201.50,
  "enabled": true,
  "picture": "http://img.alicdn.com/tfscom/i4/1692495776/TB2vLAKaDMG5uJjSZFAXXbmspXa_%21%211692495776.jpg",
  "detail": "裤子是人们下体所穿的主要服饰。原写作“绔”、“袴”。从出土文物及传世文献来看,早在春秋时期,人们的下体己穿著裤,不过那时的裤子不分男女,都只有两只裤管,其形制和后世的套裤相似,无腰无裆,穿时套在胫上,即膝盖以下的小腿部分,所以这种裤子又被称为“胫衣”。左右各一,分衣两胫。因其只有两只裤管,所以裤的计数与鞋袜相同,都用“两”字来计,居延汉简中就有这样的情况。穿著这种裤子,其目的是为了遮护胫部,尤其在冬天,可以起到保暖的作用,至于膝盖以上部分则无遮护。"
}
#查询数据
GET products/_doc/_search

备注: 随着 7.0 版本的发布,type 的移除也是越来越近了,在 6.0 的时候,已经默认只能支持一个索引一个 type 了,7.0 版本新增了一个参数 include_type_name ,即让所有的 API 是 type 相关的,这个参数在 7.0 默认是 true,不过在 8.0 的时候,会默认改成 false,也就是不包含 type 信息了,这个是 type 用于移除的一个开关。 让我们看看最新的使用姿势吧,当 include_type_name 参数设置成 false 后:

 索引操作:
PUT {index}/{type}/{id}需要修改成PUT {index}/_doc/{id}
Mapping 操作:
PUT {index}/{type}/_mapping 则变成 PUT {index}/_mapping
所有增删改查搜索操作返回结果里面的关键字 _type 都将被移除, 父子关系使用 join 字段来构建

Linux下nohup日志输出过大问题解决方案

  1、nohup命令解释:

  a、语法:nohup [command] [args] [&]

  b、说明:nohup 命令运行由 Command 参数和任何相关的 Arg 参数指定的命令,忽略所有挂断信号。在注销后使用 nohup 命令运行后台中的程序。要运行后台中的 nohup 命令,添加 & ( 表示“and”的符号)到命令的尾部,如果不指定重定向,则日志默认输出到当前目录下nohup.out文件中,

  一般提交如 :nohup ./execute.sh &  这样日志或输出当前运行目下.nohup.out中

  重定向: nohup ./execute.sh >  /home/xxx/log.log 2>&1 & :这样日志会重定向到指定目录下
  0: 表示标准输入
  1: 标准输出,在一般使用时,默认的是标准输出
  2: 标准错误信息输出
     可以用来指定需要重定向的标准输入或输出。例如,将某个程序的错误信息输出到log文件中:./program 2>log。这样标准输出还是在屏幕上,但是错误信息会输出到log文件中。另外,也可以实现0,1,2之间的重定向。2>&1:将错误信息重定向到标准输出。
  关于/dev/null文件
  Linux下还有一个特殊的文件/dev/null,它就像一个无底洞,所有重定向到它的信息都会消失得无影无踪。这一点非常有用,当我们不需要回显程序的所有信息时,就可以将输出重定向到/dev/null。

2 、切分nohup.out,同时不让它无限增长

 我这里用的一般提交命令:nohup ./execute.sh &,这样在当前目录就有nohup.out文件了,这时候可以想办法定时将nohup.out切分成,多个小文件,但同时又要使nohup.out不会无限增长下去(一般情况下是程序不能中断的):

    a、每天(根据需要设置时间),定时切分前一天的日志,(比如每天大概1g,那么可以么次切分100m左右),

    b、切分完后将nohup.out文件情况,保证新的输出日志会不停的继续输出到nohup.out

  以上在shell中

  current_date=`date -d "-1 day" "+%Y%m%d"`

   split  -b 65535000 -d -a 4  nohup.out  ./log/log_${current_date}_   这里使用split命令,将nouhup文件按指定大小切分(65535000b 大概60多M吧,可以自定义大小 ),并分成指定格式(-d -a 4以4位数字形式为后缀以从0000开始,具体可以百度split命令用法),最终输出格式为log_20160610_0001

  cat /dev/null > nohup.out  (该命令会瞬间清空nohup.out文件,后续会继续写该文件),将日志定向到/dev/null中

使用重定向输出一样可以这样,只不过换成重定向的文件名即可

将这些命令定义在一个shell文件每天定时运行即可,这样每天日志会被分成若干份,排查也方便,而且如果日志积压过大的话。可以定时删除历史的日志,保留近几天即可

整体代码如下:

this_path=$(cd `dirname $0`;pwd)

cd $this_path
echo $this_path
current_date=`date -d "-1 day" "+%Y%m%d"`
echo $current_date
split -b 65535000 -d -a 4 /home/.../nohup.out   /home/.../log/log_${current_date}_

cat /dev/null > nohup.out

https://blog.csdn.net/shawnhu007/article/details/50971084

Kafka 监控

KafkaOffsetMonitor托管在Github上,可以通过Github下载。
下载地址:https://github.com/quantifind/KafkaOffsetMonitor/releases

启动命令:

java -cp KafkaOffsetMonitor-assembly-0.2.1.jar com.quantifind.kafka.offsetapp.OffsetGetterWeb --zk 127.0.0.1:2181,127.0.0.1:2182 --port 6088  --refresh 5.seconds --retain 1.days
参数说明:

zk :zookeeper主机地址,如果有多个,用逗号隔开
port :应用程序端口
refresh :应用程序在数据库中刷新和存储点的频率
retain :在db中保留多长时间
dbName :保存的数据库文件名,默认为offsetapp
或者写一个shell脚本:
nohup java -Xms512M -Xmx512M -Xss1024K -XX:PermSize=256m -XX:MaxPermSize=512m  -cp KafkaOffsetMonitor-assembly-0.2.0.jar com.quantifind.kafka.offsetapp.OffsetGetterWeb \
--port 6088 \
--zk 127.0.0.1:2181,127.0.0.1:2182 \
--refresh 5.minutes \
--retain 1.day >/dev/null 2>&1 &

启动好后, 在浏览器中就能看见 Group, Topic, Consumer 等信息

备注: Kafka有一个坑,默认情况下Producer往一个不存在的Topic发送message时会自动创建这个Topic。 如果同时传递message和topic时, 传入的参数反了,将会在Kafka集群中自动创建Topic。在正常情况下,应该是先把Topic根据需要创建好,然后Producer往该Topic发送Message,最好把Kafka这个默认自动创建Topic的功能关掉。 
  那么,假设真的不小心创建了多余的Topic,在删除时,会出现“marked for deletion”提示,只是将该topic标记为删除,使用list命令仍然能看到。如果需要调整这两个功能的话,在server.properties中配置如下两个参数:

参数 默认值 作用
auto.create.topics.enable true Enable auto creation of topic on the server
delete.topic.enable false Enables delete topic. Delete topic through
the admin tool will have no effect
if this config is turned off

kafkaOffsetMonitor:程序一个jar包的形式运行,部署较为方便。只有监控功能,使用起来也较为安全。
除了KafkaOffsetMonitor,Kafka监控工具还有另外两款:
Kafka Web Console:监控功能较为全面,可以预览消息,监控Offset、Lag等信息,但存在bug,不建议在生产环境中使用。
Kafka Manager:偏向Kafka集群管理,若操作不当,容易导致集群出现故障。对Kafka实时生产和消费消息是通过JMX实现的。没有记录Offset、Lag等信息。

linux 添加自签名证书/Nginx 配置Https

自签名证书做法

1.先生成一对秘钥,把公钥做成证书 server.key

openssl  genrsa [-des3] -out server.key 2048       生成一个 2048 位的 私钥

说明:生成rsa私钥,des3算法,2048位强度,server.key是秘钥文件名。
注意:生成私钥,需要提供一个至少4位的密码, 如果不需要, 直接去掉-des3选项
这个密码会带来一个副作用,那就是在每次Apache启动Web服务器时,都会要求输入密码,这显然非常不方便。要删除私钥中的密码,操作如下:
cp server.key server.key.org
openssl rsa -in server.key.org -out server.key

我们可以 输出它的公钥看看

openssl  rsa -in server.key -pubout

2. 生成跟CA并自签(证书签名请求)

生成私钥之后,便可以创建csr文件了。
此时可以有两种选择。理想情况下,可以将证书发送给证书颁发机构(CA),CA验证过请求者的身份之后,会出具签名证书(很贵)。另外,如果只是内部或者测试需求,也可以使用OpenSSL实现自签名,具体操作如下:

openssl req -new -x509 -key server.key -out server.csr
国家 Country Name:  CN   
省    Stat or Province Name   Shanghai
市   Locality Name     Shanghai
公司  Organization Name :  HUPU
部门 Organizational Unit   Tech
主机名 Common Name    www.zmz8.com
邮件  Email Address    279861795@qq.com

3.生成证书CRT server.crt

openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
备注: crt 转 p12
openssl x509 -in server.crt -inform der -out server.pem
openssl pkcs12 -export -inkey server.key-in server.pem -out server.p12

我们可以查看证书内容

openssl  x509  -text -in server.crt

4.配置nginx

证书路径 /usr/local/nginx/ssl/server.crt

私钥路径 /usr/local/nginx/ssl/server.key

nginx添加配置
server {
    listen 80;
    server_name     www.zmz8.com;
    #rewrite ^/(.*)$ https://www.zmz8.com/$1 permanent;
    return 307 https://$host$request_uri;
}
server {
  listen 443;
  server_name  www.zmz8.com;
  ssl on;
  ssl_certificate   ../ssl/server.crt;
  ssl_certificate_key  ../ssl/server.key;
  ssl_session_timeout 5m;
  ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
}

最后如果可以的话 ,可以配置一个服务器签署

openssl req -new -out server.csr -key server.key -config /etc/pki/tls/openssl.cnf 
OpenSSL工具说明:
OpenSSL   ssl的开源实现,几乎实现了市面上所有的加密
libcrypto: 通用加密库, 任何软件要实现加密功能 链接调用这个库
libssl:   TLS/SSL 加密库  
openssl: 命令行工具   多功能多用途工具  实现私有证书颁发机构
子命令:
genrsa    [-out filename]    [-passout arg] [numbits]
generate an  RSA  private key  
生成一个 RSA 的私钥 (公钥是从私钥中提取的,有了私钥 就有公钥)
openssl  rsa -in ca.key -pubout  提取私钥
创建证书的基本流程是这样:
生成自己的服务端私钥     Server Key
输入基本信息并用私钥签名生成CSR    证书签名请求
提交CSR给证书机构CA(免费或商业证书)签名生成CRT,或自己做CA签名生成CRT(自签名证书)
生成RSA服务器私钥:
openssl genrsa -out server.key 4096 
输出的server.key文件就是服务器私钥,4096是密钥长度,要求不高的话用2048也可。
生成CSR:
执行命令  openssl req -new -nodes -sha256 -newkey rsa:2048 -keyout myprivate.key -out mydomain.csr生成 CSR 文件。
其中,
-new 指定生成一个新的CSR。
-nodes 指定私钥文件不被加密。
-sha256 指定摘要算法。
-keyout 生成私钥文件。
-newkey rsa:2048 指定私钥类型和长度。 
因为sha1已经不安全,所以这里用了sha256,可能太旧的客户端(比如win98?)会不支持。
yoursite.csr就是生成的CSR,yoursite建议用你的网站名标识会比较方便识别。
然后按提示输入:
国家
省
市
公司
部门
通用名(即网站域名,这个必须准确,有些商业证书支持在这里用带www的域名后签发出同时支持不带www的域名)
email
密码(可选,设置的话以后重启webserver都需要输入密码)

参考连接:

https://www.jianshu.com/p/44a3efae1d84

https://blog.csdn.net/yongf_xu/article/details/85006854

Maven和Findbugs集成

1.配置pom.xml

<build>
        <plugins>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>findbugs-maven-plugin</artifactId>
                <version>3.0.4</version>
                <configuration>
                    <!--配置文件-->
                    <configLocation>${basedir}/findbugs-config.xml</configLocation>
                    <!--排除的BUG规则-->
                    <excludeFilterFile>custom-findbugs-exclude.xml</excludeFilterFile>
                    <!--包含的BUG规则-->
                    <includeFilterFile>custom-findbugs-include.xml</includeFilterFile>
                    <!--检查等级-->
                    <threshold>High</threshold>
                    <effort>Default</effort>
                    <!-- 输出配置 -->
                    <findbugsXmlWithMessages>true</findbugsXmlWithMessages>
                    <findbugsXmlOutput>true</findbugsXmlOutput>
                    <xmlOutput>true</xmlOutput>
                    <findbugsXmlOutputDirectory>target/site</findbugsXmlOutputDirectory>
                </configuration>
            </plugin>
        </plugins>
    </build>

custom-findbugs-exclude.xml内容:

<FindBugsFilter>
    <Match>
        <Bug pattern="DLS_DEAD_LOCAL_STORE"/>
    </Match>

    <Match>
        <Bug pattern="DM_BOXED_PRIMITIVE_FOR_PARSING"/>
    </Match>

    <Match>
        <Bug pattern="EI_EXPOSE_REP"/>
    </Match>

    <Match>
        <Bug pattern="EI_EXPOSE_REP2"/>
    </Match>

    <Match>
        <Bug pattern="ME_ENUM_FIELD_SETTER"/>
    </Match>
</FindBugsFilter>

2. 运行findbugs任务(先运行“mvn package”编译工程 )

mvn findbugs:help      
查看findbugs插件的帮助  
mvn findbugs:check      
检查代码是否通过findbugs检查,如果没有通过检查,检查会失败,但检查不会生成结果报表  
mvn findbugs:findbugs   
检查代码是否通过findbugs检查,如果没有通过检查,检查不会失败,会生成结果报表保存在target/findbugsXml.xml文件中  
mvn findbugs:gui        
检查代码并启动gui界面来查看结果  

具体fndbugs插件的配置项可以参考http://mojo.codehaus.org/findbugs-maven-plugin/findbugs-mojo.html

WordPress 搭建

  1. 环境准备 – 数据库(mariadb)

参考:https://www.cnblogs.com/river2005/p/6813618.html
CentOS7下使用yum安装MariaDB
CentOS 6 或早期的版本中提供的是 MySQL 的服务器/客户端安装包,但 CentOS 7 已使用了 MariaDB 替代了默认的 MySQL。MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可 MariaDB的目的是完全兼容MySQL,包括API和命令行,使之能轻松成为MySQL的代替品。

Linux下安装MariaDB官方文档参见:https://mariadb.com/kb/zh-cn/installing-mariadb-with-yum/

全部删除MySQL/MariaDBMySQL 已经不再包含在 CentOS 7 的源中,而改用了 MariaDB;

 1.使用rpm -qa | grep mariadb搜索 MariaDB 现有的包: 
如果存在,使用rpm -e --nodeps mariadb-*全部删除:
[root@localhost ~]# rpm -qa | grep mariadb
[root@localhost ~]# rpm -e mysql-*

2.使用rpm -qa | grep mariadb搜索 MariaDB 现有的包:
如果存在,使用yum remove mysql mysql-server mysql-libs compat-mysql51全部删除;
[root@localhost ~]# yum remove mysql mysql-server mysql-libs compat-mysql51

3.开始新的安装, 创建MariaDB.repo文件
vi /etc/yum.repos.d/MariaDB.repo
插入以下内容:
# MariaDB 10.2.4 CentOS repository list - created 2017-05-05 16:13 UTC
# http://downloads.mariadb.org/mariadb/repositories/
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.2.4/centos7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1

4.运行安装命令安装MariaDB
[root@localhost ~]# yum -y install MariaDB-server MariaDB-client

5. 安装成功之后启动MariaDB服务。
systemctl start mariadb #启动服务 systemctl enable mariadb #设置开机启动 systemctl restart mariadb #重新启动 systemctl stop mariadb.service #停止MariaDB

6. 进行MariaDB的相关简单配置,使用mysql_secure_installation命令进行配置。

7.配置MariaDB的字符集
  查看/etc/my.cnf文件内容,其中包含一句!includedir /etc/my.cnf.d 说明在该配置文件中引入/etc/my.cnf.d 目录下的配置文件。
  
1)使用vi server.cnf命令编辑server.cnf文件,在[mysqld]标签下添加
init_connect='SET collation_connection = utf8_unicode_ci'
init_connect='SET NAMES utf8'
character-set-server=utf8
collation-server=utf8_unicode_ci
skip-character-set-client-handshake
如果/etc/my.cnf.d 目录下无server.cnf文件,则直接在/etc/my.cnf文件的[mysqld]标签下添加以上内容。
2)文件/etc/my.cnf.d/client.cnf
vi /etc/my.cnf.d/client.cnf
在[client]中添加
default-character-set=utf8
3)文件/etc/my.cnf.d/mysql-clients.cnf
vi /etc/my.cnf.d/mysql-clients.cnf
在[mysql]中添加
default-character-set=utf8
 全部配置完成,重启mariadb
systemctl restart mariadb
之后进入MariaDB查看字符集
mysql> show variables like "%character%";show variables like "%collation%";
授予权限并且可以授权
mysql>grant all privileges on *.* to username@'hostname' identified by 'password' with grant option;

2. 环境准备 – php

1、由于linux的yum源不存在php7.x,所以我们要更改yum源:
rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm
 2、yum查询安装php71w
yum search php71w
3、yum 安装php71w和各种拓展,选自己需要的即可。
yum install php71w php71w-cli php71w-common php71w-devel php71w-embedded php71w-fpm php71w-gd php71w-mbstring php71w-mysqlnd php71w-opcache php71w-pdo php71w-xml

php -v //就可以看到PHP版本信息了。
4. 修改配置文件
编辑PHP的配置文件,/etc/php.ini,注意去掉分号注释
vim /etc/php.ini
  将 ;cgi.fix_pathinfo=1 改为 cgi.fix_pathinfo=0
编辑PHP-FPM配置文件
vim /etc/php-fpm.d/www.conf
  将
  user = nobody
  group = nobody   
 改为
  user = nginx
  group = nginx
 前提是已经创建了nginx用户和nginx组。如果没有创建方法:
groupadd -r nginx
useradd -r -g nginx nginx
5、启动PHP—FPM
systemctl start php-fpm
6、设置开机启动
systemctl enable php-fpm
7,确保Nginx配置文件修该之后,重启Nginx
systemctl restart nginx
8、在/usr/share/nginx/html/目录下创建info.php
    内容如下:
   <?php phpinfo();?>
然后在浏览器访问这个文件, 看看是否成功

3. 环境准备 – nginx

安装nginx
yum install nginx
修改nginx 配置
vim /etc/nginx/nginx.conf
去掉默认的server配置
在/etc/ngnix/conf.d/下,新增一个配置文件wordpress.conf
内容为:

server {
listen 80 default;
server_name blog.javastone.net blog.caul.com.cn;
index index.php index.html index.htm index.jsp;
root /usr/local/wordpress;
error_page 404 /404.html; location = /40x.html { }
  error_page 500 502 503 504 /50x.html; location = /50x.html { }
  location ~ \.php$ {
  try_files $uri =404;
  fastcgi_pass 127.0.0.1:9000;
  fastcgi_index index.php;
  fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
  include fastcgi_params; 
  }
  location / {
  index index.php;
  }
  access_log /data/logs/nginx/blog.log;
}

4. 部署

参考官方文档, 主要是修改配置文件wp-config.php

/** WordPress数据库的名称 */
define('DB_NAME', '数据库');
/** MySQL数据库用户名 */
define('DB_USER', '用户');
/** MySQL数据库密码 */
define('DB_PASSWORD', '密码');
/** MySQL主机 */
define('DB_HOST', '主机IP');

去https://api.wordpress.org/secret-key/1.1/salt/ 拿到一个key,
替换define中的AUTH_KEY等信息
define('AUTH_KEY', '');
define('SECURE_AUTH_KEY', '');
define('LOGGED_IN_KEY', '');
define('NONCE_KEY', '\');
define('AUTH_SALT', '');
define('SECURE_AUTH_SALT', '');
define('LOGGED_IN_SALT', '');
define('NONCE_SALT', '');*/
define('AUTH_KEY', '');
define('SECURE_AUTH_KEY', '');
define('LOGGED_IN_KEY', '');
define('NONCE_KEY', '\');
define('AUTH_SALT', '');
define('SECURE_AUTH_SALT', '');
define('LOGGED_IN_SALT', '');
define('NONCE_SALT', '');

Jenkins+Maven+Git+Tomcat快速搭建持续集成环境

[转]Jenkins+Maven+Git+Tomcat快速搭建持续集成环境

下载安装及注意事项

这里选择war包,下载后直接放到tomcat或者jetty里,启动服务即可。

  • 在浏览器中输入http://localhost:[你的端口号]/jenkins,就打开jenkins首页了

第一次打开会提示输入初始密码(用户名为admin),页面上有提示,跟着提示找到文件打开复制密码,输入即可

Jenkins initial setup is required. An admin user has been created and a password generated.
Please use the following password to proceed to installation:

cdb925243ad74b3ca566fd2d248090d8

This may also be found at: C:\Users\A\.jenkins\secrets\initialAdminPassword

进去之后记得改密码,如果忘记改了,下次进入时还需要输入密码,还是去一开始提示的地址找到密码文件,打开复制到password文本框即可

  • 修改密码步骤 点击用户 —— admin —— 设置 —— 密码 —— 修改后save

网上资料:
说jenkins把网上的协议由http改为了https,但代码里没有改,所以需要手动去修改一下,步骤如下:
修改http为https
系统管理 —— 管理插件 —— 高级标签 —— 下面有个“升级站点” 把里面的URL中的 http改为https即可 —— 点击提交

安装插件

系统管理 —— 管理插件 —— 可选插件, 在右上角有个“过滤”的搜索框,输入maven,找到Maven Integration plugin 因网络的原因,加载速度不一(小技巧,过滤会很卡,有可能把页面卡死,可以用ctrl+F搜索定位)

勾选后,点击下面的直接安装按钮,接下来等待即可。

http://ww3.sinaimg.cn/mw690/b11e11f9jw1f81h4u9tj3j20dk0a2gmr.jpg

安装完成后可以在已安装的标签里查看。

此外还需要安装的插件:

  • Maven插件 Maven Integration plugin
  • 发布插件 Deploy to container Plugin
  • git插件 Git plugin
  • svn插件 Subversion Plug-in

非必须安装插件:

  • 发送邮件插件 Email Extension Plugin

网上资料: jenkins+maven+svn实现简单的一键发布 – pein_zero的专栏 – 博客频道 – CSDN.NET

网友发现上面安装可能会失败,

看错误提示信息可以发现

大致的意思就是,文件的签名验证不正确,不管它,注意看这个红色的路径。找到这个文件,打开它

把这个路径复制下来,放到浏览器,就可以把这个插件下载下来。在本地建一个jenkins的关于maven插件的目录,把跟maven相关的插件都放到这个目录下

其它几个插件也一一找到对应的文件,找到url,下载, 然后手动上传插件。上传插件的在:系统管理——管理插件——高级,你可以看到上传插件的地方

注意,上传的顺序,要跟报错的顺序一样,因为这些插件都是有依赖的先后顺序的。 不过即使顺序错了也没关系,系统会提示你的:

插件离线下载地址

插件安装完成后,就可以构建项目了。

配置环境

系统管理 —— Global Tool Configuration —— 配置JDK、Git、Maven

  • Maven Configuration
    两个都下拉选择Settings file in filesystem,然后在下面的File Path里填写:
    D:\apache-maven-3.2.3\conf\settings.xml ,如图
  • JDK
    填写别名:JDK
    自动安装前的勾选去掉,在出现的JAVA_HOME里输入:D:\Program Files\Java\jdk1.7.0_45
  • Git
    Path to Git executable输入:D:\Program Files\Git\bin\git.exe
    如果不用git,可以点击Delete Git,即可
  • Maven
    填写别名:maven
    去掉“自动安装”勾选框, 在MAVEN_HOME输入:D:\apache-maven-3.2.3

最后点击save按钮保存。

构建集成配置

新建 —— Enter an item name 输入一个名字, 选择构建一个maven项目, 点击OK,如图:

接下来到了配置页面,

  • 勾选丢弃旧的构建,并填写保持构建的天数和最大个数

  • 源码管理,这里选择了 Git

Repository URL里填写git仓库地址: /e/git_repo/demo/.git
这里我采用了本地仓库,可根据实际情况填写url地址,如:https://github.com/alibaba/druid.git
使用网络仓库需要添加Git证书Credentials,其原理与git免密码登录是一样的,都是基于SSH形式的,这里不再细说,请自行搜索资料。
接下来是选择一个分支Branch,默认就是*/master,可以根据你的项目实际配置修改。

用Svn作为源码库,其操作基本一样,输入svn地址,用户名,密码即可

  • 构建触发器

网上资料:

build whenever a snapshot dependency is built 当job依赖的快照版本被build时,执行本job。
Build after other projects are built:在其他项目构建完成后再进行构建。

这里又分三种情况:
1. Trigger only if build is stable:其他项目构建成功
2. Trigger even if the build is unstable:其他项目不稳定
3. Trigger even if the build fails:其他项目构建失败

Build periodically 隔一段时间build一次,不管版本库代码是否发生变化,通常不会采用此种方式。例如: 0 2 * * * (每天2:00 必须build一次源码)
Poll SCM:隔一段时间比较一次源代码如果发生变更,那么就build。否则,不进行build,通常采用这种方式;
定时检查源码变更(根据SCM软件的版本号),如果有更新就checkout最新code下来,然后执行构建动作。配置如下: */5 * * * * (每5分钟检查一次源码变化,如果有更新才build)

在 Schedule中填入* * * * *,代表一分钟监听一次
第一个参数代表的是分钟 minute,取值 0~59;
第二个参数代表的是小时 hour,取值 0~23;
第三个参数代表的是天 day,取值 1~31;
第四个参数代表的是月 month,取值 1~12;
最后一个参数代表的是星期 week,取值 0~7,0 和 7 都是表示星期天。
所以 0 * * * * 表示的就是每个小时的第 0 分钟执行一次构建。

  • Build

Root POM默认填写了pom.xml,这里不用修改,
Goals and options 里填写 clean package, 如图:

  • 构建后操作 (tomcat需要添加管理账户)

网上资料:
在tomcat中配置用户权限,即添加管理员帐号

在tomcat的安装目录中,修改conf/tomcat-user.xml配置文件,在节点里添加下面的代码,用户名和密码可自定义


点击增加构建后操作步骤下拉选择:Deploy war/ear to a Container ,多出一个发布选项

  1. WAR/EAR files 是war包的相对路径, 这里填写: target/*.war
  2. Context path是tomcat的发布路径,例如:填写了myDemo , 则访问地址为:http://localhost:8080/myDemo
  3. Containers 发布到的容器,主要可发布到tomcat、jboss、GlassFish
    下拉选择 tomcat7.x

Manager user name 填写上面自定义的用户名
Manager password 填写上面自定义的密码
Tomcat URL 中tomcat的访问地址 http://localhost:8689
(有网友说端口号后面不要加/

  1. deploy on failure:发生错误的时候是否发布到tomcat
    如图:

最后点击 保存 即可。

立即构建

在首页点击项目中最后一列的图标,立即构建项目,或者在项目里的左侧菜单点击立即构建(Build Now),即可实现了持续集成。

查看日志输出或构建错误信息

点击工程的构建版本号 #1 ,在左侧菜单选择Console Output,就可以查看控制台输出
最下面要出现Finished: SUCCESS才说明成功,(我有一次没有把test里的单元测试代码删除掉,导致一直失败)

其它注意事项

  1. 修改jenkins的工作空间

    默认情况下,jenkins的工作空间会放到C:\Users[用户名].jenkins目录下,
    如过想要更改工作空间,我们需要在系统环境变量里面配置JENKINS_HOME变量,将该变量指向目标工作空间。
    例如:JENKINS_HOME=Z:\jenkins_home
    这里需要注意的是,tomcat启动情况下,jenkins不会去读JENKINS_HOME变量,必须要重启tomcat。
    而重启tomcat也是有坑的,如果tomcat是通过命令行执行tomcat/bin/startup.bat目录启动的,那么单单停掉tomcat没用,
    必须要将前面提到的命令行一并关闭掉,这时重启tomcat,jenkins才会使用JENKINS_HOME中配置的目录作为工作空间。
    此外,一旦更换工作空间,此前过于jenkins的所有配置都将作废。

  2. 发布容器中,Add Container选项中虽然知道tomcat7.x,但实际上,你选择用tomcat8.x依然支持,没有问题
  3. 如何获取构建脚本里的日志输出信息

资料:
解决方法是使用jenkins的Log Parser插件,同使用Git Plugin一样,在插件管理中找 Log Parser插件,并添加。添加完毕后,配置jenkins中的Console Output Parsing

rule的具体规则语法可以使用正则表达式,具体可以参考Log Parser插件的文档http://my.oschina.net/donhui/blog/382592

Parsing Rules File的配置同上文的配置工作目录具有一样的坑,如果要更新规则,首先要清除job中选中的规则,然后删除此处配置的Parseing Rule,重启tomcat。

添加完毕后,在job的配置页的 Post-Build Actions部分选中Console Output parsing

然后进行如下配置:

这样我们可以对buld.bat中的error进行捕获,并且在某次构建过程的Parsed Console Output中进行查看

  1. jenkins多次deploy到tomcat导致内存溢出的问题

当短时间内多次对一个项目进行构建操作时,tomcat会出现内存溢出的错误,java.lang.OutOfMemoryError: PermGen space

解决方法:

在tomcat安装目录下,打开bin文件夹,window环境修改catalina.bat文件,在文件最前面(注释的结尾)添加下面的代码:

set JAVA_OPTS=-Xms512m -Xmx512m

Linux环境修改catalina.sh,在文件开头(cygwin=false的上面)添加下面的代码:(注意没有set,还有添加了双引号")

JAVA_OPTS="-Xms512m -Xmx512m"  

其中,-Xms设置初始化内存大小,-Xmx设置可以使用的最大内存。

注意: 该方式只能用startup.bat启动tomcat才可以设置生效,如果是用windows的系统服务启动tomcat服务,上面的设置就不生效了。

建议: 目前没有更好的办法解决这个问题,所以减少构建频率为最佳的办法

资料:

错误提示:java.lang.OutOfMemoryError: PermGen space 永久保存内存不足

set JAVA_OPTS=-Xms64m -Xmx256m -XX:PermSize=128M -XX:MaxNewSize=256m -XX:MaxPermSize=256m

错误提示:java.lang.OutOfMemoryError: Java heap space 堆空间内存不足

JVM堆的设置是指java程序运行过程中JVM可以调配使用的内存空间的设置。
JVM在启动的时候会自动设置Heap size的值,其初始空间(即-Xms)是物理内存的1/64,最大空间(-Xmx)是物理内存的1/4。
建议:将-Xms和-Xmx选项设置为相同,而-Xmn为1/4的-Xmx值
当然可根据实际情况进行具体调整。