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工程:
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 {
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 的备份和还原:
博文的更详细内容请关注我的个人微信公众号 “云时代IT运维”,本公众号旨在共享互联网运维新技术,新趋势; 包括IT运维行业的咨询,运维技术文档分享。重点关注devops、jenkins、zabbix监控、kubernetes、ELK、各种中间件的使用,比如redis、MQ等;shell和python等运维编程语言;本人从事IT运维相关的工作有十多年。2008年开始专职从事Linux/Unix系统运维工作;对运维相关技术有一定程度的理解。本公众号所有博文均是我的实际工作经验总结,基本都是原创博文。我很乐意将我积累的经验、心得、技术与大家分享交流!希望和大家在IT运维职业道路上一起成长和进步;
转载于:https://blog.51cto.com/zgui2000/2401091