自动化部署入门Git+Nexus+SonarQube+Hudson

本文详细介绍如何在两台CentOS服务器上配置Hudson进行持续集成,包括安装Git、Tomcat、Maven、Nexus、SonarQube等工具,并进行权限配置、策略设置以及Hudson的具体配置步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

自动化部署的优点就不在这里赘述了,本文意在入门。软件都多少有一些权限等配置,这些请大家自行查找,如果实在找不到可以留言。

环境:

两台CentOS,且都配置jre
ip分别为:
- 192.168.199.61 作为CI服务器
- 192.168.199.60 应用服务器

OS:
[root@localhost ~]# uname -a
Linux localhost.localdomain 2.6.32-220.el6.x86_64 #1 SMP Tue Dec 6 19:48:22 GMT 2011 x86_64 x86_64 x86_64 GNU/Linux
[root@localhost ~]# head -n 1 /etc/issue
CentOS release 6.2 (Final)

安装Git,Tomcat

//安装步骤略,网上太多了,大家参考下。

需要注意的是Tomcat的配置

1.移除/root/hudson-tomcat/webapps 目录下的所有文件:
# rm -rf /root/hudson-tomcat/webapps/*
2.将 Tomcat 容器的编码设为 UTF-8:
# vi /root/hudson-tomcat/conf/server.xml

<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8" />

如果不把 Tomcat 容器的编码设为 UTF-8,在以后配置 Hudson 是提示
3.设置 hudson-tomcat 的内存

# vi /root/hudson-tomcat/bin/catalina.sh 

#!/bin/sh 下面增加: 
JAVA_OPTS='-Xms512m -Xmx2048m'

配置iptables策略

策略我提前说,为的是之后就不说了。因为后面的多个系统每对外暴露的端口都需要在其中增加策略,所以一起说了,具体策略属于哪个系统,看注释,也建议大家都写注释,否则策略太多,分不清哪个是哪个了。iptables位置是/etc/sysconfig/iptables

[root@ci ~]# cat /etc/sysconfig/iptables
# Firewall configuration written by system-config-firewall
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
#############以下为新增##############
# nexus
-A INPUT -m state --state NEW -m tcp -p tcp --dport 8081 -j ACCEPT
# sonar
-A INPUT -m state --state NEW -m tcp -p tcp --dport 9000 -j ACCEPT
# hudson
-A INPUT -m state --state NEW -m tcp -p tcp --dport 8080 -j ACCEPT
# zookeeper
-A INPUT -m state --state NEW -m tcp -p tcp --dport 2181 -j ACCEPT
#############以上 END ##############
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited

COMMIT

安装maven

由于Hudson和maven最新版集成的时候有bug,所以我们使用apache-maven-3.0.5

[root@ci ~]# wget https://archive.apache.org/dist/maven/maven-3/3.0.4/binaries/apache-maven-3.0.4-bin.tar.gz
[root@ci ~]# tar -zxvf apache-maven-3.0.4-bin.tar.gz
[root@ci ~]# cd apache-maven-3.0.4/conf/
[root@ci ~]# vim settings.xml ##配置文件,参考nexus安装

安装Nexus

一句话介绍:
Maven中央仓库的私服,也就是本地仓库和中央仓库之间的我们自己架设的仓库。
参考 安装Nexus

安装SonarQube

一句话介绍:
是一款自动化质量管理系统
前提:已安装 JDK8 并配置好了环境变量,安装完MySQL 可以参考源码编译安装MySQL

[root@ci ~]# java -version
openjdk version "1.8.0_91"
OpenJDK Runtime Environment (build 1.8.0_91-b14)
OpenJDK 64-Bit Server VM (build 25.91-b14, mixed mode)
##下载
[root@ci ~]# wget https://sonarsource.bintray.com/Distribution/sonarqube/sonarqube-5.6.zip
##解压安装:
[root@ci ~]# unzip sonarqube-5.6.zip
[root@ci ~]# mv sonarqube-5.6.zip sonarqube
##编辑 sonar 配置:
[root@ci ~]# cd sonarqube/conf/
[root@ci ~]# vi sonar.properties
sonar.jdbc.username=root
sonar.jdbc.password=root

#----- MySQL 5.x sonar.jdbc.url=jdbc:mysql://localhost:3306/sonarqube?useUnicode=true&characterE ncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance
sonar.web.host=0.0.0.0
sonar.web.context=/sonarqube 
sonar.web.port=9000
##保存以上配置(注意,要看看默认的 9000 端口是否已被占用)
##防火墙中打开 9000 端口:
[root@ci ~]# vi /etc/sysconfig/iptables
-A INPUT -m state --state NEW -m tcp -p tcp --dport 9000 -j ACCEPT #重启防火墙,使端口配置生效
[root@ci ~]# service iptables restart
启动 SonarQube Web Server
[root@ci ~]# /root/sonarqube/bin/linux-x86-64/sonar.sh start (初次启动会自动建表和做相应的初始化)
浏览器中输入:http://192.168.199.61:9090/sonarqube/

登录,默认用户名/密码为 admin/admin
在选择菜单 配置–>系统–>更新中心–>available中分别安装PMD,Checkstyle,Cobertura,Chinese Pack这些常用插件。

Maven 分析器插件的配置与使用

http://docs.sonarqube.org/display/SONAR/Installing+and+Configuring+Maven
在 Maven 本地库中的 settings.xml(我这里是 settings_edu.xml)配置文件中的 节点中添加如下配置:

        <profile>
            <id>sonar</id>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
            <properties>
                <!-- Example for MySQL-->
                <sonar.jdbc.url>
                    jdbc:mysql://127.0.0.1:3306/sonar?useUnicode=true&amp;characterEncoding=utf8
                </sonar.jdbc.url>
                <sonar.jdbc.username>root</sonar.jdbc.username>
                <sonar.jdbc.password>root</sonar.jdbc.password>

                <!-- Optional URL to server. Default value is http://localhost:9000 -->
                <sonar.host.url>
                    http://192.168.199.61:9000/sonar
                </sonar.host.url>
            </properties>
        </profile>

使用 Maven 分析器进行分析

命令:
纯 Maven 命令:mvn clean install sonar:sonar
如果你是第一次运行此命令,看执行日志你会发现它会先下载 sonar-runner 等插件,成功执行完分析命令后便可到 Web Server 中查看代码质量分析结果数据。

至此,所有安装准备工作已完成,接下来需要配置Hudson来进行自动化构建。

安装Hudson

安装Hudson和部署一个web项目一样简单。所以直接下载Hudson的war包即可。
Hudson 只是一个持续集成服务器(持续集成工具),要想搭建一套完整的持续集成管理平台, 还需要用到Git、Maven、Sonar 等工具,按需求整合。

[root@ci ~]# mv hudson-3.3.3.war ~/download/
[root@ci ~]#   cd ../bin/
[root@ci bin]# pwd
/root/download/tomcat/bin
[root@ci ~]#   ./startup.sh 

Hudson的默认工作空间

/root/.hudson/jobs 就是构建完后的所有项目
/root/.hudson/jobs/项目/workspace/target 每个项目构建完成后的文件 jar或者war或者等等。

[root@ci .hudson]# pwd
/root/.hudson
[root@ci .hudson]# cd jobs
[root@ci jobs]# ll
total 32
drwxr-x---. 5 root root 4096 Jul  5 01:13 service-common
drwxr-x---. 5 root root 4096 Jul  5 01:13 service-common-config
drwxr-x---. 5 root root 4096 Jul  5 01:13 service-common-core
drwxr-x---. 5 root root 4096 Jul  5 01:13 service-common-web
drwxr-x---. 5 root root 4096 Jul  5 01:13 service-parent
... ...
[root@ci jobs]# cd service-common-core/
[root@ci service-common-core]# ll
total 28
drwxr-x---. 6 root root 4096 Jul  1 09:56 builds
-rw-r-----. 1 root root 5300 Jul  5 01:13 config.xml
... ...
drwxr-x---. 5 root root 4096 Jul  1 08:21 workspace
[root@ci service-common-core]# cd workspace/
[root@ci workspace]# ll
total 16
-rw-r-----.  1 root root 3669 Jul  1 08:21 pom.xml
-rw-r-----.  1 root root   39 Jul  1 08:21 README.md
drwxr-x---.  4 root root 4096 Jul  1 08:21 src
drwxr-x---. 11 root root 4096 Jul  1 08:22 target
[root@ci workspace]# cd target/
[root@ci target]# ll
total 60
drwxr-x---. 3 root root  4096 Jul  1 08:22 classes
... ...
-rw-r-----. 1 root root 23516 Jul  1 09:54 service-common-core-1.0-SNAPSHOT.jar
drwxr-x---. 2 root root  4096 Jul  1 09:56 sonar

配置 HudsonHome(可选)

这一步是为了建立自定义的Hudson工作空间目录,到时候找项目target的时候需要,如果没配置就按上面说的位置(/root/.hudson)查找。

在/root 目录下创建 HudsonHome 目录,并配置到环境变量 
[root@ci ~]# mkdir HudsonHome
切换到 root 用户,在/etc/profile 中配置全局环境变量
[root@ci ~]# vi /etc/profile 
## hudson env
export HUDSON_HOME=/root/HudsonHome
[root@ci ~]# source /etc/profile

Hudson配置

初始化配置

访问 http://192.168.199.61:8080/hudson-3.3.3 进入初始化界面。
选择

√ Hudson BIRT Charts Plugin
√ JNA Native Support Plugin
√ XPath Provider Plugin

然后install
初始化安装需要安装 3 个默认勾选中的插件(如上图红色部分),其它插件可以等初始 化安装完成之后再选择安装。 点击“Install”安装按钮后,需要等待一会时间才能安装完成。安装完成后按“Finish”按钮。 安装的插件保存在 /root/HudsonHome/plugins 目录。

安全配置

初始化完成后就会进行 Hudson 的配置管理界面:
1.启动安全配置
菜单:系统管理–>Configure Security–> Enable security [save]
2.配置Access Control
菜单:系统管理–>Configure Security

Access Control:
        Security Realm:
        √ Hudson专有用户数据库
        √ 允许用户注册   √ Notify user of Hudson account creation
        Authorization
        √ 安全矩阵
        admin 所有复选框全勾选 #这里是需要在下面文本框中输入admin的。
        匿名用户 只勾选所有read

配置完Access Control后直接[save]。
3.注册超管
菜单:右上角 注册–>Sign up 填写完信息后,邮箱最好是真实常用的。 [Sign up] 按钮完成
4.系统设置
菜单:系统管理–>系统设置
4.1.配置系统信息、JDK、Maven,sonar和SSH 需要安装插件后再配置。否则没有配置项。

Instance TagHudson自定义系统名称) :X系统CI服务器
系统消息:一段系统描述
执行者数量:2
生成前等待时间:5
SCM签出重试次数:2

√ 防止跨站点请求伪造
    Crumbs
        Crumb AlgorithmDefault Crumb IssuerEnable proxy compatibility
JDK
    JDK 安装
        别名:openjdk-1.8.0
        JAVA_HOME:/usr/lib/jvm/java-1.8.0-openjdk.x86_64
Git
    Git 安装
        Name:Default
        Path to Git executable:git
Maven
    Maven 安装
        Name:maven-3.0.5
        MAVEN_HOME:/root/download/apache-maven-3.0.5
Sonar  #在 Hudson 中配置 SonarQube 链接
    Sonar installations
    Name:sonar5.6
    Server URL:http://192.168.199.61:9000/sonar
    Sonar account login:admin
    Sonar account password:admin
    Server Public URL:http://192.168.199.61:9000/sonar
    Database URL:jdbc:mysql://192.168.199.131:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatement s=true&useConfigs=maxPerformance
    Database login:root
    Database password:root
    Database driver:com.mysql.jdbc.Driver
邮件通知
    SMTP服务器:smtp.163.com
    系统管理员邮件地址:xxxx@163.com
    Hudson URL:http://192.168.199.61:8080/hudson-3.3.3/
    √ 使用SMTP认证
    用户名:xxxx@163.com
    密码:xxxx
    SMTP端口:25
    Charset:UTF-8
SSH Servers 
    #我配置了一台远程机器,如果是多项目的化,以此类推,在构建项目选项的时候就会让我们选择是发布到哪台机器上
    Name192.168.199.60_product-provider
    Hostname192.168.199.60
    Username:root
    Remote Directory:/rootUse password authentication, or use a different key 使用密码
    Passphrase / Password:root
    Port22
    Timeout300000
    #配置完后记得用[Test configuration]button测试一下,如果是success就OK啦。

插件安装

结合我们想要实现的持续集成功能,需要安装如下几个插件。如想集成更多功能,自行 添加插件并配置则可。(注意:现在我们使用了 SonarQube 质量管理平台,则不再需要在 Hudson 中单独去安装 CheckStyle、Findbugs、PMD、Cobertura 等 Sonar 中已有的插件) 逐个搜索你想要安装的插件并点击安装,安装完之后重启 Hudson。
菜单:系统管理–>管理插件–>available–>search
输入 sonar 搜索出

√ Sonar Plugin
  TusarNotifier

选择Sonar Plugin 然后[install]就安装成功,然后会提示restart,[restart]后即可完成一个插件的安装。
我们需要通过以上方法安装如下几个插件:

√ Sonar Plugin
√ Hudson GIT plugin
√ Publish Over SSH
√ Hudson SSH plugin

Hudson 的使用

添加项目(maven为例)

菜单:新建任务
任务名称: xxxxx
√ 构建一个Maven 2/3 (Legacy)项目
[OK]进入Job Configurations

Project name:测试项目名称
Cascading Job:none
Description:产品api实现
√ Discard Old Builds #保留50次历史记录
Days to keep builds:50
Max # of builds to keep:50
Source Code Management
    Git
        Repositories--URL of repository:git@xxxxxxx.git
        Branches to build--Branch Specifier (blank for default):master
Build Triggers #触发动作,被谁触发
    Build after other jobs are built #在另一个项目构建之后自动构建。如果是独立的项目,这里就不需要配置了
        Jobs names:service-xxxxx-api
    Poll SCM #规则可参考linux 的 crontab 规则
        Schedule:* * * * *  #每分钟检查git是否有变化
Build
    Root POM:pom.xml
    Goals and options:install #要执行的命令
Build Settings
    √ E-mail Notification
    √ Send e-mail for every unstable build
Post-build Actions:
    √ Sonar
    Send build artifacts over SSH
        SSH Publishers
            Name: #这个就是刚才系统设置里增加的ssh server,选择一个目标机器即可。
            Transfers
                #这个地址是hudson每个项目的地址中的target,参考安装hudson那个小节
                Source files:target/service-product-core.jar,target/lib/*
                Remove prefix:target #前缀
                #这个地址要注意了,配置远程ssh server的时候有一个Remote Directory:/root
                #此处的Remote directory是相对那个地址而言的,也就是那个地址下的路径
                #最终会将service-product-core.jar发送到 远程的/root/xiaoshoujia/service/product目录下
                Remote directory:xiaoshoujia/service/product
                #在远程机器执行的脚本,这个脚本已经在远程的目录下了。如果是war包,参考附件service-restart.sh 脚本
                Exec command:/root/xiaoshoujia/service/product/service-product.sh

最后[save]保存构建配置。

构建流程

这样,构建一个项目包括
1.项目名称及描述
2.要拉取的Git地址
3.有无触发条件
4.pom文件
5.sonar的质量检测
6.异常邮件提醒
7.以及构建完后要发送的远程服务器目录
8.最终执行远程服务器的脚本,启动应用

执行构建

配置完后,在主界面就可以看到Jobs Status下面是一个个新建的任务。
最后上个图吧
Jobs Status
紫色的框中光盘按钮是执行构建,黄色的框中是Console 命令行输出。

至此超级简单的配置和使用就完成了。当然配置和构建过程可能还有很多小问题需要大家去解决,如果有问题直接留言即可。

shell脚本附件

service-restart.sh

path: /home/xiaoshoujia/tomcat/bin/service-restart.sh

#!/bin/sh
#java env
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
export JRE_HOME=$JAVA_HOME/jre

APP_NAME=topsales-coss
WORK_DIR=/home/xiaoshoujia/webapps/$APP_NAME
TOMCAT_HOME=/home/xiaoshoujia/tomcat-coss

echo "==== clean webapps ====="
rm -rf $WORK_DIR/*
rm -rf $TOMCAT_HOME/work/*

#这一句的前提是将项目war已经发送到这个目录
unzip -q ~/$APP_NAME.war -d $WORK_DIR

echo "==== restart tomcat ====="
## restart tomcat
$TOMCAT_HOME/bin/shutdown.sh

sleep 5

$TOMCAT_HOME/bin/startup.sh

如果无法正常shutdown,可以参考以下方法:
修改catalina.sh和shutdown.sh,
catalina.sh增加CATALINA_PID文件,

if [ -r "$CATALINA_BASE/bin/setenv.sh" ]; then
  . "$CATALINA_BASE/bin/setenv.sh"
elif [ -r "$CATALINA_HOME/bin/setenv.sh" ]; then
  . "$CATALINA_HOME/bin/setenv.sh"
fi
###--------只增加以下这一句
export CATALINA_PID="$CATALINA_HOME/catalina_pid"

# For Cygwin, ensure paths are in UNIX format before anything is touched
if $cygwin; then

shutdown.sh增加-force参数

#在执行stop时增加 -force 
exec "$PRGDIR"/"$EXECUTABLE" stop -force "$@"

强制停止tomcat脚本

如果以上方法无法停止你的tomcat,可以尝试如下:

project_name="boss"
env_type="prod1"
##判断环境
if [ ${env_type} != "prod1" ]; then
    exit 0
fi

~/apache-tomcat-${project_name}/bin/shutdown.sh
sleep 5s
##查看tomcat pid
tomcat_pid=`ps -ef|grep ${project_name}|grep -v grep|grep -v vi|grep -v less|grep -v more|awk '{print $2}'`
echo ${tomcat_pid}
##如果有pid 就执行kill -9 
[ -n "${tomcat_pid}" ] && kill -9 ${tomcat_pid}
##清理相关目录
rm -rf ~/apache-tomcat-${project_name}/work/*
rm -rf ~/mywebapps/${project_name}
unzip -q ~/${project_name}.war -d ~/mywebapps/${project_name}
~/apache-tomcat-${project_name}/bin/startup.sh

service-product.sh

#!/bin/sh

## java env
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
export JRE_HOME=$JAVA_HOME/jre

## service name
APP_NAME=product

SERVICE_DIR=/home/xiaoshoujia/xiaoshoujia/service/$APP_NAME
SERVICE_NAME=service-$APP_NAME-core
JAR_NAME=$SERVICE_NAME\.jar
PID=$SERVICE_NAME\.pid

cd $SERVICE_DIR

case "$1" in

    start)
        nohup $JRE_HOME/bin/java -Xms256m -Xmx512m -jar $JAR_NAME >$SERVICE_DIR/service.log 2>$SERVICE_DIR/service_err.log &
        echo $! > $SERVICE_DIR/$PID
        echo "=== start $SERVICE_NAME"
        ;;

    stop)
        kill `cat $SERVICE_DIR/$PID`
        rm -rf $SERVICE_DIR/$PID
        echo "=== stop $SERVICE_NAME"

        sleep 5
        P_ID=`ps -ef | grep -w "$SERVICE_NAME" | grep -v "grep" | awk '{print $2}'`
        if [ "$P_ID" == "" ]; then
            echo "=== $SERVICE_NAME process not exists or stop success"
        else
            echo "=== $SERVICE_NAME process pid is:$P_ID"
            echo "=== begin kill $SERVICE_NAME process, pid is:$P_ID"
            kill -9 $P_ID
        fi
        ;;

    restart)
        $0 stop
        sleep 2
        $0 start
        echo "=== restart $SERVICE_NAME"
        ;;

    *)
        ## restart
        $0 stop
        sleep 2
        $0 start
        ;;
esac
exit 0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值