1. Jenkins工具的安装和配置:
在本篇博文中,主要讲解如下几个知识点和实践经验,供大家参考:
1. Jenkins的安装和配置:
2. Jenkins Slave节点配置:
3. 创建一个maven工程:
4. 配置代码检查sonar:
5. Jenkins Pipeline配置:
6. Jenkins 的备份和还原:
1. Jenkins的安装和配置:
1.1 Jenkins简介:
Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能。Jenkins是一个CI/CD工具,持续集成持续发布的工具。主要流程为:开发上传本地代码到git服务器-→合并分支到master—-》jenkins服务器git clone master到jenkins本地服务器—-》jenkins通过本地maven命令编译war包或者jar包—-》war包或者jar包存储在jenkins workspace目录target目录下面—-》jenkins通过ssh插件scp或者ansible复制war包或者jar包到部署机器-→jenkins通过ssh插件调用目标机器的脚本重启服务;
1.2 Jenkins安装:
首先安装jdk:
cd /software wget ftp://bqjrftp:Pass123$%^@10.83.20.27:9020/software/jdk/jdk-8u111-linux-x64.tar.gz tar xzvf jdk-8u111-linux-x64.tar.gz -C /usr/local/ vim /etc/profile.d/java.sh JAVA_HOME=/usr/local/jdk1.8.0_111 PATH=$PATH:$JAVA_HOME/bin export PATH JAVA_HOME [root@devops jdk1.8.0_111]# . /etc/profile #配置一个环境变量 [root@devops jdk1.8.0_111]# java -version java version "1.8.0_111" Java(TM) SE Runtime Environment (build 1.8.0_111-b14) Java HotSpot(TM) 64-Bit Server VM (build 25.111-b14, mixed mode)
紧接着安装maven,用于编译构建的工具,当然有的项目可能还会用ant构建:
cd /software/ wget ftp://bqjrftp:Pass123$%^@10.83.20.27:9020/software/maven/apache-maven-3.3.9-bin.tar.gz tar xzvf apache-maven-3.3.9-bin.tar.gz -C /usr/local/ cd /usr/local/ ln -sv apache-maven-3.3.9/ maven vim /etc/profile.d/maven.sh MAVEN_HOME=/usr/local/maven PATH=$PATH:$MAVEN_HOME/bin export PATH MAVEN_HOME source /etc/profile
紧接着安装git,linux操作系统默认是有git命令的,只是默认自带的git版本比较低,需要自己安装比较高的版本:
cd /software yum remove git-1.7.1-9.el6_9.x86_64 #先卸载旧的git rpm包 yum install openssl-devel curl-devel expat-devel perl-ExtUtils-MakeMaker gettext gettext-libs gettext-devel asciidoc xmlto docbook2X 安装依赖 ln -s /usr/bin/db2x_docbook2texi /usr/bin/docbook2x-texi wget http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.14.tar.gz #安装依赖 tar xzvf libiconv-1.14.tar.gz ./configure --prefix=/usr/local/libiconv Make && make install ln -sv /usr/local/libiconv/lib/libiconv.so /usr/lib64/ ln -sv /usr/local/libiconv/lib/libiconv.so.2 /usr/lib64/ cd /software wget https://www.kernel.org/pub/software/scm/git/git-2.7.3.tar.gz tar xzvf git-2.7.3.tar.gz cd git-2.7.3 ./configure prefix=/usr/local/git all --with-iconv=/usr/local/libiconv/ Make Make install echo "export PATH=$PATH:/usr/local/git/bin" >> /etc/bashrc source /etc/bashrc Git --version 查看版本,已经是 [root@devops git-2.7.3]# git --version git version 2.7.3
紧接着是安装jenkins, Jenkins的安装可以采用两种方式,一种是直接使用jenkins的yum源,通过yum安装jinkins,还有一种就是在jenkins的官网下载jenkins.war包,通过在tomcat里面运行。本文档采用的是tomcat容器来运行jenkins
# 先安装tomcat cd /software/ wget ftp://bqjrftp:Pass123$%^@10.83.20.27:9020/software/tomcat/apache-tomcat-8.5.8.tar.gz tar xzvf apache-tomcat-8.5.8.tar.gz -C /usr/local cd /usr/local ln -sv apache-tomcat-8.5.8/ tomcat cd /usr/local/tomcat/webapps rm -rf * # 删除没有用的工程 # 在jenkins官方网站下载war包: https://jenkins.io/download/,然后放置在/usr/local/tomcat/webapps目录下面,启动tomcat /usr/local/tomcat/bin/catalina.sh
启动成功jenkins之后,第一次登陆需要输入jenkins管理员密码,按照提示输入管理员密码,然后安装常用插件。这里有一个问题需要解决,就是默认我们安装的jenkins服务器无法连接到jenkins的更新站点来安装插件,需要做如下的配置才可以。
vim /root/.jenkins/updates/default.json # 经此文件中的www.google.com修改为www.baidu.com vim /root/.jenkins/hudson.model.UpdateCenter.xml # 将这里的更新站点更改为国内的站点 <?xml version='1.1' encoding='UTF-8'?> <sites> <site> <id>default</id> <url>https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json</url> </site> </sites> #然后重新启动jenkins /usr/local/tomcat/bin/catalina.sh stop /usr/local/tomcat/bin/catalina.sh start
紧接着是做一些初始化的配置,主要包括以下几个方面:
工具的配置: 比如jdk、maven、git、ant、npm等;系统管理—-》全局工具配置
邮件告警的配置:配置发送邮件的用户信息、邮件服务器信息等;
全局安全配置: 定义登录jenkins的用户是本地用户还是LDAP用户,是否开启项目的授权;












2. Jenkins Slave节点配置:
jenkins支持master-slave模式。master主要是做任务管理,slave是实际运行job的机器。所以slave机器也需要安装maven、jdk等工具;配置步骤如下:
tar xzvf jdk-8u111-linux-x64.tar.gz -C /usr/local/ mv apache-maven-3.3.9-bin.tar.gz /home/jenkins/ useradd jenkins passwd jenkins chown -R jenkins.jenkins /home/jenkins/ vim /etc/ssh/sshd_config AllowUser jenkins service sshd restart su - jenkins vim /etc/profile.d/java.sh source /etc/profile.d/java.sh # 在slave节点上面创建jenkins用户,安装maven和jdk工具,配置环境变量,配置允许jenkins用户登录
系统管理—-节点管理—-新建节点:

如果创建第二个节点,可以选择复制以前的节点配置





3. 创建一个maven工程:


输入代码的git服务器地址和访问账户

选择构建的参数

选择邮件通知

4. 配置代码检查sonar:
Sonar是一个用于代码质量管理的开源平台,用于管理Java源代码的质量。通过插件机制,Sonar 可以集成不同的测试工具,代码分析工具,以及持续集成工具,比如pmd-cpd、checkstyle、findbugs、Jenkins。通过不同的插件对这些结果进行再加工处理,通过量化的方式度量代码质量的变化,从而可以方便地对不同规模和种类的工程进行代码质量管理.
Sonar (SonarQube)是一个开源平台,用于管理源代码的质量。Sonar 不只是一个质量数据报告工具,更是代码质量管理平台。支持的语言包括:Java、PHP、C#、C、Cobol、PL/SQL、Flex 等。
安装jdk:
lftp bqjrftp:Pass123$%^@10.83.20.27:9020 cd /software/jdk/ mget jdk-8u111-linux-x64.tar.gz Tar xzvf jdk-8u111-linux-x64.tar.gz -C /usr/local vim /etc/profile.d/java.sh JAVA_HOME=/usr/local/jdk1.8.0_111 JRE_HOME=/usr/local/jdk1.8.0_111/jre CLASS_PATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin export JAVA_HOME JRE_HOME CLASS_PATH PATH source /etc/profile Echo $JAVA_HOME /usr/local/jdk1.8.0_111 如果结果是上面的输出,就表示jdk安装成功了
安装mysql:
一定要安装5.6以上版本的mysql,如果安装的版本是5.5或者是mariadb10.2.15都不行的,我刚开始安装的mysql版本比较低,后面启动sonarqubo的时候就报错mysql版本过低
lftp bqjrftp:Pass123$%^@10.83.20.27:9020 cd /software/mysql/ mget mariadb-5.5.54-linux-x86_64.tar.gz tar xzvf mariadb-5.5.54-linux-x86_64.tar.gz -C /usr/local/ mkdir -p /application/mysql/data #创建数据目录 Cd /usr/local/mysql/scripts ./mysql_install_db --basedir=/usr/local/mysql/ --datadir=/application/mysql/data/ --user=mysql # 确保系统已经创建了mysql账户,初始化数据库 vim /etc/my.cnf [mysqld] sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES [client] port = 3306 socket = /var/lib/mysql/mysql.sock # 指定socket文件路径 [mysqld] user = mysql port = 3306 socket = /var/lib/mysql/mysql.sock basedir = /usr/local/mysql datadir = /application/mysql/data/ # 指定数据目录 log-error = /var/log/mysqldb/mysql_error.log # 指定日志目录 pid-file = /application/mysql/data/mysql.pid # 指定PID文件路径 mkdir -p /var/lib/mysql && chown -R mysql.mysql /var/lib/mysql mkdir -p /var/log/mysqldb && chown -R mysql.mysql /var/log/mysqldb cp -r /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld #拷贝默认的服务启动文件 [root@SZ3FUAT0NAS0100 scripts]# cd /etc/init.d/ [root@SZ3FUAT0NAS0100 init.d]# chmod +x mysqld [root@SZ3FUAT0NAS0100 init.d]# chkconfig mysqld on [root@SZ3FUAT0NAS0100 init.d]# vim mysqld [root@SZ3FUAT0NAS0100 init.d]# service mysqld status ERROR! MySQL is not running [root@SZ3FUAT0NAS0100 init.d]# service mysqld start Starting MySQL.180523 10:01:09 mysqld_safe Logging to '/var/log/mysqldb/mysql_error.log'. 180523 10:01:09 mysqld_safe Starting mysqld daemon with databases from /application/mysql/data/ . SUCCESS! [root@SZ3FUAT0NAS0100 init.d]# service mysqld status SUCCESS! MySQL running (59947) [root@SZ3FUAT0NAS0100 init.d]# 配置mysql的环境变量 [root@SZ3FUAT0NAS0100 profile.d]# cat /etc/profile.d/mysql.sh MYSQL_HOME=/usr/local/mysql/bin PATH=$MYSQL_HOME:$PATH export MYSQL_HOME PATH mysqladmin -u root password 'abc1234' #修改mysql root账户的密码 安装mycli工具,带扩展功能的mysql客户端: cd /usr/local/python2.7.12/bin/ python -m ensurepip --default-pip #安装对应版本的pip工具 /usr/local/python2.7.12/bin/pip install mycli #下载安装mycli模块 #创建数据库、数据库用户、赋权限 mariadb root@localhost:(none)> create database sonar character set utf8 collate utf8_general_ci; Query OK, 1 row affected Time: 0.001s mariadb root@localhost:(none)> create user 'sonar' identified by 'sonar'; Query OK, 0 rows affected Time: 0.001s mariadb root@localhost:(none)> grant all on sonar.* TO 'sonar'@'%' identified by 'sonar'; Query OK, 0 rows affected Time: 0.001s mariadb root@localhost:(none)> grant all on sonar.* TO 'sonar'@'localhost' identified by 'sonar'; Query OK, 0 rows affected Time: 0.001s mariadb root@localhost:(none)> flush privileges; Query OK, 0 rows affected Time: 0.001s mariadb root@localhost:(none)> 通过mycli工具登录mysql,输入会有提示的。上一段的命令用途是创建sonar数据库,创建sonar用户,并给sonar数据库赋权限。

现在开始安装sonar server和sonar-runner SonarQube是服务器端,它主要有两个功能:
分析源代码;
因为它内嵌了Apache模块,所以提供Web端的界面访问。
SonarQube Runner是一个利用SonarQube服务端分析代码的命令行工具,可以把它简单理解为客户端。所以,为了安装和调试方便,建议SonarQube和SonarQube Runner都下载。
cd /software/sonarqube mget sonarqube-6.7.3.zip mget sonar-runner-dist-2.4.zip cd /usr/local unzip sonarqube-6.7.3.zip unzip sonar-runner-dest-2.4.zip # 安装sonar和sonar-runner vim /etc/profile.d/sonar.sh SONAR_HOME=/usr/local/sonarqube-6.7.3 SONAR_RUNNER_HOME=/usr/local/sonar-runner-2.4 PATH=$SONAR_HOME/bin:$SONAR_RUNNER_HOME/bin:$PATH export SONAR_HOME SONAR_RUNNER_HOME PATH # 配置sonar服务器,sonar命令行工具的环境变量 #修改sonarqubo server的配置文件 [root@SZ3FUAT0NAS0100 conf]# egrep -v "^#" sonar.properties |sed '/^[[:space:]]*$/d' sonar.jdbc.username=sonar sonar.jdbc.password=sonar sonar.jdbc.url=jdbc:mysql://127.0.0.1:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&useSSL=false sonar.web.host=10.83.64.130 sonar.web.port=9000 [root@SZ3FUAT0NAS0100 conf]# # 修改sonar-runner客户端的配置文件 [root@SZ3FUAT0NAS0100 conf]# egrep -v "^#" /usr/local/sonar-runner-2.4/conf/sonar-runner.properties |sed '/^[[:space:]]*$/d' sonar.host.url=http://10.83.64.130:9000 sonar.jdbc.url=jdbc:mysql://127.0.0.1:3306/sonar?useUnicode=true&characterEncoding=utf8 sonar.jdbc.username=sonar sonar.jdbc.password=sonar sonar.sourceEncoding=UTF-8 sonar.login=admin sonar.password=admin [root@SZ3FUAT0NAS0100 conf]# # 配置sonar检查项目的配置文件 [root@SZ3FUAT0NAS0100 sonar-runner-2.4]# egrep -v "^#" /usr/local/sonar-runner-2.4/sonar-project.properties |sed '/^[[:space:]]*$/d' sonar.projectKey=my:clf sonar.projectName=clf sonar.projectVersion=1.0 sonar.sources=/root/java sonar.language=java sonar.sourceEncoding=UTF-8 sonar.my.property=value [root@SZ3FUAT0NAS0100 sonar-runner-2.4]# # Sonarqube这个工具自带了elasticsearch,他的配置文件是 [root@SZ3FUAT0NAS0100 local]# egrep -v "^$|#" /usr/local/sonarqube-6.7.3/elasticsearch/config/elasticsearch.yml bootstrap.memory_lock: false bootstrap.system_call_filter: false [root@SZ3FUAT0NAS0100 local]# # 修改为false # 启动sonarqube不要用root用户启动,需要用elasticsearch用户启动。 # 在启动之前,需要先赋权限 chown -R elasticsearch.elasticsearch sonarqube-6.7.3/ # 然后切换到elasticsearch cd /usr/local/sonarqube-6.7.3/bin/linux-x86-64/ sh sonar.sh start [elasticsearch@SZ3FUAT0NAS0100 linux-x86-64]$ sh sonar.sh status SonarQube is running (71514). [elasticsearch@SZ3FUAT0NAS0100 linux-x86-64]$ 表示sonarqube启动成功了 [root@SZ3FUAT0NAS0100 ~]# cat /usr/local/sonarqube-6.7.3/conf/sonar.properties |grep Xms sonar.web.javaOpts=-Xmx1024m -Xms512m -XX:+HeapDumpOnOutOfMemoryError # 修改java 内存启动 [root@SZ3FUAT0NAS0100 ~]# cat /usr/local/sonarqube-6.7.3/bin/linux-x86-64/sonar.sh |grep USER RUN_AS_USER=elasticsearch #配置sonarqube的启动用户为elasticsearch




5. Jenkins Pipeline配置:
先介绍下什么是Jenkins 2.0,Jenkins 2.0的精髓是Pipeline as Code,是帮助Jenkins实现CI到CD转变的重要角色。什么是Pipeline,简单来说,就是一套运行于Jenkins上的工作流框架,将原本独立运行于单个或者多个节点的任务连接起来,实现单个任务难以完成的复杂发布流程。Pipeline的实现方式是一套Groovy DSL,任何发布流程都可以表述为一段Groovy脚本,并且Jenkins支持从代码库直接读取脚本,从而实现了Pipeline as Code的理念。
Pipeline的几个基本概念:
Stage: 阶段,一个Pipeline可以划分为若干个Stage,每个Stage代表一组操作。注意,Stage是一个逻辑分组的概念,可以跨多个Node.
Node: 节点,一个Node就是一个Jenkins节点,或者是Master,或者是Agent,是执行Step的具体运行期环境。
Step: 步骤,Step是最基本的操作单元,小到创建一个目录,大到构建一个Docker镜像,由各类Jenkins Plugin提供
Jenkinsfile可以使用两种语法编写 - Declarative和Scripted。我们这里使用的是声明式语法。要创建pipeline流水线任务,还需要安装pipeline流水线插件才可以;
pipeline { agent any // 定义变量,分布是字符类变量,就是手工输入分支名称;定义单选变量,表示可以选择的模块;定义字符类型的变量,代表要发布的ip parameters { string(name: 'brach',description: 'branch') choice(name: 'module',choices: ['aip-manager-server','auth-server','config-server','eureka-server','info-test-server','info-update-server','mq-server','ordertest-service-server','posttest-loan-server','pretest-loan-server','zuul-server'], description: 'module_name') string(name: 'ip',description: 'ip') } tools { maven 'M3' jdk 'jdk1.8.0_92' } // 定义git的代码路径和访问秘钥 stages{ stage('get code'){ steps{ git branch: '$brach', credentialsId: 'c943389e-ac1e-438e-9aaf-07342173a37a', url: 'http://test02@git.test.club/YWZC/AIP.git' } } // 定义构建 stage('build'){ steps{ sh "/usr/local/maven/bin/mvn -Dmaven.test.skip=true clean install -f openapi/pom.xml" } } // 定义部署,通过条件判断,如果部署的时候选择此模块和此服务器ip,就会执行ansible连接到这台服务器,同步编译好的jar包和执行目标服务器的脚本完成服务重启 stage('deploy'){ parallel { stage('test-loan-server-192.168.20.186') { when { allOf{ environment name: 'module', value: 'test-loan-server' environment name: 'ip', value: '192.168.20.186' } } steps { sh "ansible mmt-naip-testloan-1 -m synchronize -a 'mode=push src=$WORKSPACE/openapi/test-loan-server/target/test-loan-server-0.0.1-SNAPSHOT.jar dest=/home/weblogic/app/test-loan-server/test-loan-server-0.0.1-SNAPSHOT.jar'" sh "ansible mmt-naip-testloan-1 -m shell -a 'sh /home/weblogic/script/deploy_naip.sh testloan '" } } stage('test-loan-server-192.168.20.187') { when { allOf{ environment name: 'module', value: 'test-loan-server' environment name: 'ip', value: '192.168.20.187' } } steps { sh "ansible mmt-naip-testloan-2 -m synchronize -a 'mode=push src=$WORKSPACE/openapi/test-loan-server/target/test-loan-server-0.0.1-SNAPSHOT.jar dest=/home/weblogic/app/test-loan-server/test-loan-server-0.0.1-SNAPSHOT.jar'" sh "ansible mmt-naip-testloan-2 -m shell -a 'sh /home/weblogic/script/deploy_naip.sh testloan '" } } } } } // 下面这段配置了邮件通知,包括使用了jenkins默认变量。 post { success { emailext ( subject: "'${env.JOB_NAME} [${env.BUILD_NUMBER}]' 更新正常", body: """ 详情: SUCCESSFUL: Job '${env.JOB_NAME} [${env.BUILD_NUMBER}]' 状态:${env.JOB_NAME} jenkins 更新运行正常 URL :${env.BUILD_URL} 项目名称 :${env.JOB_NAME} 项目更新进度:${env.BUILD_NUMBER} 代码分支:${env.brach} 业务服务器IP: ${env.ip} 发布模块: ${env.module} """, to: "test@maimaiti.cn" recipientProviders: [[$class: 'DevelopersRecipientProvider']] ) } failure { emailext ( subject: "'${env.JOB_NAME} [${env.BUILD_NUMBER}]' 更新失败", body: """ 详情: FAILED: Job '${env.JOB_NAME} [${env.BUILD_NUMBER}]' 状态:${env.JOB_NAME} jenkins 运行失败 URL :${env.BUILD_URL} 项目名称 :${env.JOB_NAME} 项目更新进度:${env.BUILD_NUMBER} 代码分支:${env.brach} 业务服务器IP: ${env.ip} 发布模块: ${env.module} """, to: "gaoyang@test.cn", recipientProviders: [[$class: 'DevelopersRecipientProvider']] ) } }
}
6. Jenkins 的备份和还原:









