jenkins 使用教程

时间:2024-07-18 10:08:20

1. 安装最新长期稳定版 2.426.1

Redhat Jenkins Packages

sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo --no-check-certificate
sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io-2023.key
yum install -y fontconfig java-11
yum -y install jenkins-2.426.1-1.1.noarch
systemctl enable jenkins
systemctl start jenkins

2. 本地hosts文件解析域名

10.0.0.72 jenkins.tom.com

3. 浏览器访问jenkins.tom.com:8080

[root@jenkins tools]# cat /var/lib/jenkins/secrets/initialAdminPassword
c7c62614a5d74aefae2966ceff362e4a

4. 更改密码

5. 安装插件

安装方式有2种:

1.在线搜索需要的插件进行安装

2.离线安装,把已有的.jpi文件复制到 /var/lib/jenkins/plugins/ 目录下,然后重启Jenkins即可。

用这种方式既可以批量安装插件,安装时又可以忽视插件之间的关联性。若依赖的插件不存在或者存在版本问题,则重启之后会在Manage Jenkins中进行提示,根据提示逐一解决问题即可。如果需要对Jenkins的插件配置进行迁移,直接将plugins文件目录直接替换即可,或者将.jpi复制过去之后直接重启Jenkins即可。

[root@jenkins yum.repos.d]# ll /var/lib/jenkins/plugins/
drwxr-xr-x 4 jenkins jenkins      56 Jul 12 14:35 bouncycastle-api
-rw-r--r-- 1 jenkins jenkins 8853632 Jul 12 14:35 bouncycastle-api.jpi
drwxr-xr-x 4 jenkins jenkins      56 Jul 12 14:35 instance-identity
-rw-r--r-- 1 jenkins jenkins   18216 Jul 12 14:35 instance-identity.jpi
drwxr-xr-x 4 jenkins jenkins      56 Jul 12 14:35 javax-activation-api
-rw-r--r-- 1 jenkins jenkins   77217 Jul 12 14:35 javax-activation-api.jpi
drwxr-xr-x 4 jenkins jenkins      56 Jul 12 14:35 javax-mail-api
-rw-r--r-- 1 jenkins jenkins  632494 Jul 12 14:35 javax-mail-api.jpi
drwxr-xr-x 5 jenkins jenkins      68 Jul 12 14:29 locale
-rw-r--r-- 1 jenkins jenkins   13518 Jul 12 14:29 locale.jpi
drwxr-xr-x 4 jenkins jenkins      56 Jul 12 14:35 localization-support
-rw-r--r-- 1 jenkins jenkins   24084 Jul 12 14:35 localization-support.jpi
drwxr-xr-x 5 jenkins jenkins      70 Jul 12 14:35 localization-zh-cn
-rw-r--r-- 1 jenkins jenkins  569475 Jul 12 14:35 localization-zh-cn.jpi

6. jenkins汉化插件安装

1、主要安装如下插件:Locale、Localization: Chinese (Simplified)

Manage Jenkins --> Manage Plugins --> Available,搜索上面2个插件安装即可

2.重启jenkins,systemctl restart jenkins

7. 常用插件安装

git,git parameter,git hub,gitlab,ansible,docker,maven,Workspace Cleanup

8. 案例:创建一个项目

为了方便jenkins进行操作与管理各种节点,避免出现权限问题。这里把jenkins运行用户改为root

]# egrep "User|Group" /usr/lib/systemd/system/jenkins.service
User=root
Group=root

]# systemctl daemon-reload
[root@jenkins yum.repos.d]# systemctl restart jenkins

项目目标:

通过运行jenkins 任务 
提示我们进行: 
选择 
dev  #开发环境 
prod #生产环境 
把选择结果放在变量中choose。 
jenkins执行脚本
case "$choose" in
DEV) echo "部署到测试环境" ;;
PROD) echo "部署到生产环境" ;;
esac 
echo "当前用户:`whoami`"
echo "当前路径: `pwd`"

9. 案例:拉取gitlab仓库代码,根据分支进行拉取代码

10. job内置变量

10.1. jenkins job有一些自带的环境变量,在配置中可以直接引用,这里列出基础参数。

BUILD_NUMBER:当前构建号,如1
BUILD_ID:构建的id编号,一般可为构建号,也可是时间戳(需添加时间戳插件,开启时间记录)
JOB_NAME:当前job名称 如: job-04-game-auto-webhook
BUILD_TAG:本次构建记录,一般标记为jenkins-{JOB_NAME}−{BUILD_NUMBER}
EXECUTOR_NUMBER:执行者编号,在“build executor status”中看到的数字
NODE_NAME:运行的节点名称
NODE_LABELS:运行的节点标签名称
WORKSPACE:job的工作区地址 如:/var/lib/jenkins/workspace/job-04-game-auto-webhook
HUDSON_URL:jenkins的url,如:http://jenkins.tom.com/
JOB_URL:job的url,如:http://jenkins.tom.com/job/job-04-game-auto-webhook/ 
BUILD_URL:构建记录的url,如:http://jenkins.tom.com/job/job-04-game-auto-webhook/7/ ,形式为 http://ip:端口/job/{JOB_NAME}/${BUILD_NUMBER}

10.2. 也可以安装Build Environment插件,可以通过查看历史构建记录得知本次构建的所有参数)

10.3. 如需查看系统环境变量,可在系统管理-系统属性中查询。

11. 案例:拉取gitlab仓库代码,根据tag标签拉取代码

这里jenkins做了免密登录web服务器,以实现代码推送到web服务器

ssh-keygen
ssh-copy-id root@web

ssh root@10.0.0.8 "mkdir -p /app/code-back"
dirname="/app/code-back/game-${git_tag}"
scp -o StrictHostKeyChecking=no -r ${WORKSPACE}  root@10.0.0.8:$dirname
ssh -o StrictHostKeyChecking=no root@10.0.0.8 "rm -rf /app/code/game"
ssh -o StrictHostKeyChecking=no root@10.0.0.8 "ln -s $dirname  /app/code/game"

如果不选参数,会报错

12. 案例:代码上传到测试分支,自动触发jenkins构建部署

注意:不可用于生产环境,如果代码故障会导致生产环境故障

步骤:

  1. jenkins添加gitlab插件
  2. jenkins创建钩子令牌认证
  3. gitlab配置jenkins钩子和令牌
  4. 向gitlab提交代码

12.1. 需要gitlab允许来自钩子和服务的对本地网络的请求,否则会报错误

12.2. jenkins URL设置,否则一会webhook的url是带8080的

12.3. 先记录下刚才jenkins生成的两个数据,gitlab会用

webhook url:  http://jenkins.tom.com/project/job-04-game-auto-webhook
Secret token: 1b061a9f1fa423f086b72882863d5132

12.4. gitlab新建钩子,加上jenkins的webhook地址

看到上面错误,不一定是真的无法完成构建,这里采用手动推送来试试,发现可以触发jenkins构建的。

13. 案例:java项目编译部署

13.1. jenkins服务器安装maven

cd /app/tools
wget https://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.8.8/binaries/apache-maven-3.8.8-bin.tar.gz
ln -s apache-maven-3.8.8 maven
echo 'export PATH=/app/tools/maven/bin/:$PATH' >> /etc/profile
source /etc/profile
]# mvn --version
Apache Maven 3.8.8 (4c87b05d9aedce574290d1acc98575ed5eb6cd39)
Maven home: /app/tools/maven
Java version: 11.0.8, vendor: N/A, runtime: /usr/lib/jvm/java-11-openjdk-11.0.8.10-1.el7.x86_64
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "3.10.0-1160.el7.x86_64", arch: "amd64", family: "unix"

13.2. 配置maven仓库地址

vim maven/conf/settings.xml
  </mirrors>
    <mirror>
      <id>aliyunmaven</id>
      <mirrorOf>*</mirrorOf>
      <name>阿里云公共仓库</name>
      <url>http://maven.aliyun.com/repository/public</url>
    </mirror>
  </mirrors>

13.3. jenkins全局工具配置里面添加maven路径

项目代码:

从gitee克隆一份代码(链接)到本地,然后在自己的gitlab仓库中新建一个项目,把代码上传到仓库

然后jenkins开始创建一个maven job

10.0.0.8上面是web服务器,上面安装了tomcat和jdk,构建完成后,访问10.0.0.8:8080可以可以看到项目已部署成功

14. 案例:java项目编译推送至docker仓库,然后在web服务器运行docker容器

14.1. 步骤:

  1. 代码上传至gitlab
  2. 书写测试dockerfile(只需要代码+docker环境即可)
  3. jenkins创建任务
    1. 拉取代码
    2. 执行构建,shell命令(docker build,docker push)
    3. web机器docker run 镜像
  1. 检测结果

14.2. 环境

gitlab

10.0.0.71

jenkins

10.0.0.72

web1

10.0.0.7

web2

10.0.0.8

docker harbor

10.0.0.81

14.3. jenkins 10.0.0.72 机器安装docker,并配置docker仓库地址

#1.安装相关依赖.
yum install -y yum-utils device-mapper-persistent-data lvm2
#2.下载官方的docker yum源文件
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#3.替换yum源地址
sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
#4.安装docker-ce
yum makecache fast
yum -y install docker-ce docker-compose 
systemctl enable --now docker  

mkdir -p /etc/docker
tee /etc/docker/daemon.json <<'EOF'
{
  "registry-mirrors": ["https://bjjtv7cs.mirror.aliyuncs.com"],
   "insecure-registries": ["harbor.tom.cn"]
}
EOF
systemctl daemon-reload
systemctl restart docker

14.4. docker harbor 安装docker-ce ,docker-compose,harbor

#----------------------------------------------------------------------------------
#1.安装相关依赖.
yum install -y yum-utils device-mapper-persistent-data lvm2
#2.下载官方的docker yum源文件
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#3.替换yum源地址
sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
#4.安装docker-ce
yum makecache fast
yum -y install docker-ce docker-compose 
systemctl enable --now docker  

mkdir -p /etc/docker
tee /etc/docker/daemon.json <<'EOF'
{
  "registry-mirrors": ["https://bjjtv7cs.mirror.aliyuncs.com"],
   "insecure-registries": ["harbor.tom.cn"]
}
EOF
systemctl daemon-reload
systemctl restart docker

#----------------------------------------------------------------------------------
mkdir -p /app/tools/
cd /app/tools/
wget https://github.com/goharbor/harbor/releases/download/v2.11.0/harbor-offline-installer-v2.11.0.tgz
tar -xvf harbor-offline-installer-v2.11.0.tgz 
cd harbor
cp harbor.yml.tmpl harbor.yml
#----------------------------------------------------------------------------------
vim harbor.yml
#修改域名
hostname: harbor.tom.cn

#注释掉证书配置
#https:
#  # https port for harbor, default is 443
#  port: 443
#  # The path of cert and key files for nginx
#  certificate: /your/certificate/path
#  private_key: /your/private/key/path

#修改登录密码
harbor_admin_password: Admin
#----------------------------------------------------------------------------------
./install.sh  
#注意要检查80是否被占用
提示successfully
? ----Harbor has been installed and started 
successfully.----
#----------------------------------------------------------------------------------

14.5. 把代码上传到自己的gitlab仓库

源码:git clone zhrzzzzzzzzz/bird

14.6. web1和web2安装docker,并配置仓库地址(参照jenkins安装docker的过程)

14.7. jenkins新建项目

docker build  -t harbor.tom.cn/prod/nginx_bird:${git_tag} .
docker login -uadmin -padmin harbor.tom.cn
docker push harbor.tom.cn/prod/nginx_bird:${git_tag}
#部署
ansible -i /server/ansible/hosts web -m shell -a"\
docker rm -f bird; \
docker rmi harbor.tom.cn/prod/nginx_bird:${git_tag}; \
docker login -uadmin -padmin harbor.tom.cn; \
docker run -d --name bird -p 80:80 harbor.tom.cn/prod/nginx_bird:${git_tag}"

这里有个问题,如果同样的tag,被推送到harbor仓库以后,再次推送的是推不上相同的tag的,只能删除

这里提供如下方案,在push前,把相同tag的镜像从仓库里删除,再进行推送

HARBOR_URL="harbor.tom.cn"
PROJECT="prod"
REPOSITORY="nginx_bird"
USER="admin"
PASSWORD="admin"
curl -s -X DELETE "http://${HARBOR_URL}/api/v2.0/projects/${PROJECT}/repositories/${REPOSITORY}/artifacts/${git_tag}/tags/${git_tag}" -u "$USER:$PASSWORD"
docker build  -t ${HARBOR_URL}/${PROJECT}/${REPOSITORY}:${git_tag} .
docker login -uadmin -padmin ${HARBOR_URL}
docker push ${HARBOR_URL}/${PROJECT}/${REPOSITORY}:${git_tag}
#部署
ansible -i /server/ansible/hosts web -m shell -a"\
docker rm -f bird; \
docker rmi ${HARBOR_URL}/${PROJECT}/${REPOSITORY}:${git_tag}; \
docker login -u$USER -p$PASSWORD ${HARBOR_URL}; \
docker run -d --name bird -p 80:80 ${HARBOR_URL}/${PROJECT}/${REPOSITORY}:${git_tag}"

15. jenkins引入安全扫描工具sonarqube

sonarqube服务器:10.0.0.73,下面安装的软件都是在这台机器安装

15.1. jdk1.8安装

yum -y install java

15.2. 安装依赖

yum install git java unzip wget -y

15.3. 安装mysql 5.7

yum install -y https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm
yum install -y mysql-community-server
systemctl start mysqld
]# grep -i password /var/log/mysqld.log 
2024-07-16T06:21:23.103934Z 1 [Note] A temporary password is generated for root@localhost: *PpB&()jE0<a
mysql -uroot -p"*PpB&()jE0<a"
mysql> alter user root@localhost identified by '新密码';

#创建数据库及用户
mysql> create database sonarqube charset utf8;
mysql> grant all on sonarqube.* to 'sonarqube'@'localhost' identified by 'Sonar123...';

15.4. sonarqube安装

cd /app/tools
wget  https://binaries.sonarsource.com/Distribution/sonarqube/sonarqube-7.7.zip
unzip sonarqube-7.7.zip
ln -s sonarqube-7.7 sonar
useradd sonar
chown -R sonar.sonar /app/tools/sonar/
#修改配置文件
]# egrep -v '^$|^#' sonar/conf/sonar.properties
sonar.jdbc.username=sonarqube
sonar.jdbc.password=Sonar123...
sonar.jdbc.url=jdbc:mysql://localhost:3306/sonarqube?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&useSSL=false
#启动sonarqube
]# su - sonar -c '/app/tools/sonar/bin/linux-x86-64/sonar.sh start'
Starting SonarQube...
Started SonarQube.

15.5. 访问sonarqube界面 http://sonar.tom.cn:9000

点击login,输入用户名:admin 用户密码:admin

windows本地做host解析
10.0.0.73 sonar.tom.cn

15.6. sonarqube汉化

rm -rf sonar/extensions/plugins/
tar -xvf sonarqube_7.7.plugins_new.tar.gz -C ./sonar/extensions/
]# su - sonar -c '/app/tools/sonar/bin/linux-x86-64/sonar.sh restart'
Stopping SonarQube...
Stopped SonarQube.
Starting SonarQube...
Started SonarQube.

15.7. sonarqube新建一个项目,创建token,复制用于扫描java的maven命令

mvn sonar:sonar \
  -Dsonar.projectKey=test \
  -Dsonar.projectName=test \
  -Dsonar.host.url=http://sonar.tom.cn:9000 \
  -Dsonar.login=06fd5a5f31971847aa7c3caab9a87ee378a83c41

15.8. jenkins项目中调用sonarqube扫描

16. jenkins分布式

背景:

jenkins服务器上运行maven编译,ansible(执行剧本),docker build(构建镜像) ,jenkins慢了.

解决:

把一些功能拆分出去. 运行指定任务的时候指定这个新的(jenkins)节点即可.

16.1. 案例:拆分docker功能

目标:未来我们的任务中只要有docker build相关操作就交给对应docker节点.

16.1.1. 添加节点 :

  1. 准备节点上安装jdk/jre环境. yum install -y java-11
  2. web页面添加节点 Dashbord-->系统管理-->节点管理(Clouds)

16.1.2. 创建任务并绑定到指定节点中

注意:拉取代码会被拉到新建的节点机器上,shell部分的操作命令全都会在新节点上运行,就相当于jenkins让新节点干活了,所以新节点上要部署ansible,否则编译会报错

17. jenkins权限控制rbac认证

17.1. 安装插件

Role-based Authorization Strategy

Matrix Authorization Strategy

17.2. 启用rbac的认证

17.3. 配置权限

在系统管理页面点击Manage and Assign Roles进入角色管理页面:

17.4. 管理角色(manager roles)

选择该项可以创建全局角色、项目角色,并可以为角色分配权限

全局角色(Global roles)与项目角色(item roles)的区别就是,项目角色只能管理项目,没有管理jenkins的权限配置,全局角色适用于Jenkins中的任何项目,并覆盖您在项目角色中指定的任何内容。也就是说,当您在全局角色中为角色指定job read权限时,无论您在项目角色中指定什么,该角色都可以读取所有作业。在全局角色中提供job create将允许创建任何名称的作业。

添加项目角色时,需要指定匹配项目的模式,官方文档介绍该选项支持正则表达式,

"Roger-." 表示所有以Roger-开头的项目,

"(?i)roger-.*" 表示以roger-开头的项目并且不区分大小写,

"ABC|ABC.*",ABC开头的项目可以配置为“

"abc|bcd|efg" 直接匹配多个项目

"aa[^abc].*" 匹配以aa开头并且不包括abc的字符串:

全局角色:

OPS: 运维人员权限

项目角色:

上面根据项目,每个项目建立了2组角色,一个是开发用,一个测试用

DEV-DEV:  DEV环境 开发人员权限  
DEV-SIT: DEV环境 测试人员权限
PROD-DEV:  PROD环境 开发人员权限
PROD-SIT: PROD环境 测试人员权限

17.5. 新建用户:

OPS-01 
DEV-01
SIT-01

17.6. 给用户分配角色(assign roles)

18. jenkins pipeline

安装插件:Pipeline: Stage View Plugin,Pipeline Stage View

pipeline流水线:通过jenkins的工作框架,通过代码的方式,将多个任务联合起来

流水线优点:

  1. 模块化
  2. 方便检查
  3. 方便排错
  4. 整体运行流程清晰

18.1. pipeline代码书写格式

pipeline {
  agent any
  environment {
    host="web1"
  }
  stages {
    stage('1.获取代码') {
      steps {
        echo "get code $host"
      }
    }
       
    stage('2.质量检测') {
      steps {
        echo "check code $host"
      }
    }
       
    stage('3.maven编译') {
      steps {
        echo "result code $host"
      }
    }
  }
}
所有代码都放在pipeline层内
agent定义在哪台机器上运行:any,none
environment{} 环境变量=变量值
stages{} 集合一个大项目的结合,用来包含stage子项目
stage{} 单个任务,用来包含steps{}部分
steps{} 用来实现具体动作(命令/脚本)

18.2. 新建一个流水线job

这里可以通过流水线语法生成流水线的部分代码,比如拉取代码等

Git Parameter | Jenkins plugin

Git plugin

pipeline {
  agent any
  parameters {
	gitParameter branchFilter: 'origin.*/(.*)', defaultValue: 'main', name: 'git_tag', type: 'PT_TAG', useRepository: 'http://gitlab.tom.com/dev/helloworld.git'
  }
  stages {
    stage('1.获取代码') {
      steps {
		    checkout([$class: 'GitSCM', 
		      branches: [[name: "${params.git_tag}"]], 
		      extensions: [], 
		      userRemoteConfigs: [[credentialsId: 'fc5d2626-f02d-4b07-b709-8c04f8709c57', url: 'http://gitlab.tom.com/dev/helloworld.git']]
		     ])	
      }
    }
    stage('2.质量检测') {
      steps {
        sh '''/app/tools/maven/bin/mvn sonar:sonar \
              -Dsonar.projectKey=${JOB_BASE_NAME} \
              -Dsonar.projectName=${JOB_BASE_NAME} \
              -Dsonar.host.url=http://sonar.tom.cn:9000 \
              -Dsonar.login=06fd5a5f31971847aa7c3caab9a87ee378a83c41'''
      }
    }
    stage('3.maven编译') {
      steps {
        sh '''/app/tools/maven/bin/mvn clean package''' 
      }
    }
	stage('4.部署') {
      steps {
        sh '''scp ${WORKSPACE}/target/*.war root@10.0.0.8:/app/tools/tomcat/webapps/ROOT.war''' 
      }
    }
  }
}

由于这里是根据tag进行拉取代码的,第一次构建的时候,页面上不出现选项,成功后,再次构建的时候,就会提示要选择tag,进行拉取代码了

19. Maven私服仓库配置-Nexus

19.1. nexus安装

#https://www.sonatype.com/download-oss-sonatype
#10.0.0.74机器,上传nexus压缩包
cd /app/tools/
tar -xvf nexus-3.13.0-01-unix.tar.gz
ln -s /app/tools/nexus-3.13.0-01/bin/nexus /bin/nexus
]# tar -xvf nexus-3.13.0-01-unix.tar.gz ^C
[root@nexus tools]# nexus --version
No suitable Java Virtual Machine could be found on your system.
The version of the JVM must be at least 1.8 and at most 1.8.
Please define INSTALL4J_JAVA_HOME to point to a suitable JVM.
#提示需要安装java1.8
yum -y install java-1.8.0
[root@nexus tools]# nexus --version
WARNING: ************************************************************
WARNING: Detected execution as "root" user.  This is NOT recommended!
WARNING: ************************************************************
Usage: /usr/bin/nexus {start|stop|run|run-redirect|status|restart|force-reload}
[root@nexus tools]# nexus start
WARNING: ************************************************************
WARNING: Detected execution as "root" user.  This is NOT recommended!
WARNING: ************************************************************
Starting nexus
[root@nexus tools]# nexus status
WARNING: ************************************************************
WARNING: Detected execution as "root" user.  This is NOT recommended!
WARNING: ************************************************************
nexus is running.

本地hosts做解析

10.0.0.74 nexus.tom.cn

访问:http://nexus.tom.cn:8081 用户名:admin 密码:admin123

admin登陆后,点击左侧【Security–Users】,在列表中选择用户,右键可更改密码和重围密码, 底部表格中可修改用户其余信息

System Requirement: max file descriptors [4096] likely too low, increase to at least [65536].

翻译nexus要求: 文件描述符过低,请增加到65536(每个进程可以打开的文件数量)

#配置后重启生效。
vim /etc/security/limits.conf
#新增
 * soft nofile 65536
 * hard nofile 65536
#命令临时重启后失效 
 ulimit -n 65536

19.2. nexus配置远程的仓库为阿里云的nexus地址

http://maven.aliyun.com/nexus/content/groups/public/

19.3. maven修改配置连接nexus

jenkins机器做hosts解析

echo '172.16.1.74 nexus.tom.cn' >> /etc/hosts

cp /app/tools/maven/conf/settings.xml{,.back}
cat /app/tools/maven/conf/settings.xml
<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
  <servers>
    <server>
       <id>my-nexus-releases</id>
       <username>admin</username>  
       <password>admin123</password>  
       </server>
    <server>
       <id>my-nexus-snapshot</id>
       <username>admin</username>
       <password>admin123</password>
     </server>
  </servers>
  <mirrors>
    <mirror>
      <id>nexus</id>
      <mirrorOf>*</mirrorOf>
	  <url>http://nexus.tom.cn:8081/repository/maven-public/</url>
    </mirror>
  </mirrors>
  <profiles>
    <profile>
      <id>nexus</id>
      <repositories>
       <repository>
          <id>central</id>
          <url>http://nexus.tom.cn:8081/repository/maven-public/</url>
          <releases><enabled>true</enabled></releases>
          <snapshots><enabled>true</enabled></snapshots>
        </repository>
      </repositories>
     <pluginRepositories>
       <pluginRepository>
          <id>central</id>
          <url>http://nexus.tom.cn:8081/repository/maven-public/</url>
          <releases><enabled>true</enabled></releases>
          <snapshots><enabled>true</enabled></snapshots>
       </pluginRepository>
     </pluginRepositories>
    </profile>
  </profiles>
<activeProfiles>
	<activeProfile>nexus</activeProfile>
</activeProfiles>
</settings>

测试