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
- [[email protected] jdk1.8.0_111]# . /etc/profile #配置一个环境变量
- [[email protected] 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
查看版本, 已经是
- [[email protected] 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
- # 拷贝默认的服务启动文件
- [[email protected] scripts]# cd /etc/init.d/
- [[email protected] init.d]# chmod +x mysqld
- [[email protected] init.d]# chkconfig mysqld on
- [[email protected] init.d]# VIM mysqld
- [[email protected] init.d]# service mysqld status
- ERROR! MySQL is not running
- [[email protected] 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!
- [[email protected] init.d]# service mysqld status
- SUCCESS! MySQL running (59947)
- [[email protected] init.d]#
配置 MySQL 的环境变量
- [[email protected] 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 [email protected]:(none)> create database sonar character set utf8 collate utf8_general_ci;
- Query OK, 1 row affected
- Time: 0.001s
- mariadb [email protected]:(none)> create user 'sonar' identified by 'sonar';
- Query OK, 0 rows affected
- Time: 0.001s
- mariadb [email protected]:(none)> grant all on sonar.* TO 'sonar'@'%' identified by 'sonar';
- Query OK, 0 rows affected
- Time: 0.001s
- mariadb [email protected]:(none)> grant all on sonar.* TO 'sonar'@'localhost' identified by 'sonar';
- Query OK, 0 rows affected
- Time: 0.001s
- mariadb [email protected]:(none)> flush privileges;
- Query OK, 0 rows affected
- Time: 0.001s
- mariadb [email protected]:(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 的配置文件
- [[email protected] 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
- [[email protected] conf]#
- # 修改 sonar-runner 客户端的配置文件
- [[email protected] 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
- [[email protected] conf]#
- # 配置 sonar 检查项目的配置文件
- [[email protected] 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
- [[email protected] sonar-runner-2.4]#
- # Sonarqube 这个工具自带了 Elasticsearch, 他的配置文件是
- [[email protected] local]# egrep -v "^$|#" /usr/local/sonarqube-6.7.3/Elasticsearch/config/Elasticsearch.YAML
- Bootstrap.memory_lock: false
- Bootstrap.system_call_filter: false
- [[email protected] 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
- [[email protected] Linux-x86-64]$ sh sonar.sh status
- SonarQube is running (71514).
- [[email protected] Linux-x86-64]$
表示 sonarqube 启动成功了
- [[email protected] ~]# cat /usr/local/sonarqube-6.7.3/conf/sonar.properties |grep Xms
- sonar.Web.javaOpts=-Xmx1024m -Xms512m -XX:+HeapDumpOnOutOfMemoryError
- # 修改 java 内存启动
- [[email protected] ~]# 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 运维职业道路上一起成长和进步;
来源: http://www.bubuko.com/infodetail-3074294.html