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
# 将这里的更新站点更改为国内的站点



  
    default
    https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
  


#然后重新启动jenkins
/usr/local/tomcat/bin/catalina.sh stop
/usr/local/tomcat/bin/catalina.sh start

  紧接着是做一些初始化的配置,主要包括以下几个方面:

  1. 工具的配置: 比如jdk、maven、git、ant、npm等;系统管理---》全局工具配置
  2. 邮件告警的配置:配置发送邮件的用户信息、邮件服务器信息等;
  3. 全局安全配置: 定义登录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是服务器端,它主要有两个功能:

  1. 分析源代码;
  2. 因为它内嵌了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://[email protected]/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: "[email protected]"
                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: "[email protected]",
                recipientProviders: [[$class: 'DevelopersRecipientProvider']]
                )
                }

    }

}

  6. Jenkins 的备份和还原:

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

jenkins安装和配置_第1张图片