Jenkins持续集成&部署

Jenkins持续集成&部署

  • 什么是持续集成
    • CI/CD简介
    • 持续集成CI
    • 持续交付
    • 持续部署CD
    • 小结
  • Jenkins
    • Jenkins是什么
    • Jenkins安装
      • 准备工作
      • 安装启动
      • 访问
      • Jenkins配置
      • 主程序目录
      • JDK配置
      • maven配置
      • 插件安装
      • 系统设置
      • git配置
  • 持续构建
    • 构建maven项目
    • 构建配置
    • 构建成功
  • 持续部署
    • 执行shell脚本
    • 执行完毕

什么是持续集成

  • 持续集成是一个开发的实践,需要开发人员定期集成代码到共享存储库。这个概念是为了消除发现的问题,后来出现在构建生命周期的问题。持续集成要求开发人员有频繁的构建。最常见的做法是,每当一个代码提交时,构建应该被触发。

CI/CD简介

  • 互联网软件的开发和发布,已经形成了一套标准流程,假如把开发工作流程分为以下几个阶段:

Jenkins持续集成&部署_第1张图片

  • 正如你在上图中看到,[持续集成(Continuous Integration)]、[持续交付(Continuous Delivery)]和[持续部署(Continuous Deployment)]有着不同的软件自动化交付周期。

持续集成CI

  • 上面整个流程中最重要的组成部分就是持续集成(Continuous integration,简称CI)。
  • 持续集成指的是,频繁地(一天多次)将代码集成到主干。将软件个人研发的部分向软件整体部分交付,频繁进行集成以便更快地发现其中的错误。
  • 它的好处主要有两个:
    • 快速发现错误。每完成一点更新,就集成到主干,可以快速发现错误,定位错误也比较容易。
    • 防止分支大幅偏离主干。如果不是经常集成,主干又在不断更新,会导致以后集成的难度变大,甚至难以集成。
  • 持续集成并不能消除Bug,而是让它们非常容易发现和改正。持续集成的目的,就是让产品可以快速迭代,同时还能保持高质量。它的核心措施是,代码集成到主干之前,必须通过自动化测试。只要有一个测试用例失败,就不能集成。

持续交付

  • 持续交付(Continuous delivery)指的是,频繁地将软件的新版本,交付给质量团队或者用户,以供评审。如果评审通过,代码就进入生产阶段。
  • 持续交付在持续集成的基础上,将集成后的代码部署到更贴近真实运行环境的「类生产环境」(production-like environments)中。持续交付优先于整个产品生命周期的软件部署,建立在高水平自动化持续集成之上。
  • 持续交付可以看作持续集成的下一步。它强调的是,不管怎么更新,软件是随时随地可以交付的。

持续部署CD

  • 持续部署(continuous deployment)是持续交付的下一步,指的是代码通过评审以后,自动部署到生产环境。
  • 持续部署的目标是,代码在任何时刻都是可部署的,可以进入生产阶段。
  • 持续部署的前提是能自动化完成测试、构建、部署等步骤。

小结

  • 总的来说,持续集成、持续交付、持续部署提供了一个优秀的 DevOps 环境。对于整个开发团队来说,能很大地提升开发效率,好处与挑战并行。无论如何,频繁部署、快速交付以及开发测试流程自动化都将成为未来软件工程的重要组成部分。

Jenkins

Jenkins是什么

  • Jenkins是一款开源 CI&CD 软件,用于自动化各种任务,包括构建、测试和部署软件。Jenkins 支持各种运行方式,可通过系统包、Docker 或者通过一个独立的 Java 程序。
  • 官网:https://www.jenkins.io/zh/
  • 官方文档:https://www.jenkins.io/zh/doc/
  • Jenkins特性:
    • 开源的java语言开发持续集成工具,支持CI,CD;
    • 易于安装部署配置:可通过yum安装,或下载war包以及通过docker容器等快速实现安装部署,可方便web界面配置管理;
    • 消息通知及测试报告:集成RSS/E-mail通过RSS发布构建结果或当构建完成时通过e-mail通知,生成JUnit/TestNG测试报告;
    • 分布式构建:支持Jenkins能够让多台计算机一起构建/测试;
    • 文件识别:
    • Jenkins能够跟踪哪次构建生成哪些jar,哪次构建使用哪个版本的jar等;
    • 丰富的插件支持:支持扩展插件,你可以开发适合自己团队使用的工具,如git,svn,maven,docker等。

Jenkins安装

准备工作

  • 机器需求:
* 256 MB 内存,建议大于 512 MB
* 10 GB 的硬盘空间(用于 Jenkins 和 Docker 镜像)
* Java 8 ( JRE 或者 JDK 都可以)
* Docker

安装启动

  • 下载安装包,并启动:
wget http://mirrors.jenkins.io/war-stable/latest/jenkins.war
nohup java -jar jenkins.war > jenkins.log 2>&1 &
  • 查看启动日志:

Jenkins持续集成&部署_第2张图片

访问

  • 配置hosts:
root$ vim /etc/hosts
myjenkins.com	192.168.254.120
  • 打开浏览器,访问地址:http://myjenkins.com:8080/

Jenkins持续集成&部署_第3张图片

  • 看到以下界面就是正常的:

Jenkins持续集成&部署_第4张图片

  • 这里我选择安装推荐的插件

Jenkins持续集成&部署_第5张图片

  • 上面等插件安装完后,就进入到下面界面,提示要创建第一个admin用户,并设置用户名密码。

Jenkins持续集成&部署_第6张图片

  • 点击保存并完成,然后进行实例配置,提示配置jenkins URL,这里保持默认即可,继续点击保存并完成

Jenkins持续集成&部署_第7张图片

  • 提示jenkins已经就绪,现在就可以开始使用jenkins了。

Jenkins持续集成&部署_第8张图片

Jenkins持续集成&部署_第9张图片

Jenkins配置

## Path:        Development/Jenkins
## Description: Jenkins Automation Server
## Type:        string
## Default:     "/var/lib/jenkins"
## ServiceRestart: jenkins
#
# Directory where Jenkins store its configuration and working
# files (checkouts, build reports, artifacts, ...).
#
JENKINS_HOME="/var/lib/jenkins"

## Type:        string
## Default:     ""
## ServiceRestart: jenkins
#
# Java executable to run Jenkins
# When left empty, we'll try to find the suitable Java.
#
JENKINS_JAVA_CMD=""

## Type:        string
## Default:     "jenkins"
## ServiceRestart: jenkins
#
# Unix user account that runs the Jenkins daemon
# Be careful when you change this, as you need to update
# permissions of $JENKINS_HOME and /var/log/jenkins.
#
JENKINS_USER="jenkins"

## Type:        string
## Default: "false"
## ServiceRestart: jenkins
#
# Whether to skip potentially long-running chown at the
# $JENKINS_HOME location. Do not enable this, "true", unless
# you know what you're doing. See JENKINS-23273.
#
#JENKINS_INSTALL_SKIP_CHOWN="false"

## Type: string
## Default:     "-Djava.awt.headless=true"
## ServiceRestart: jenkins
#
# Options to pass to java when running Jenkins.
#
JENKINS_JAVA_OPTIONS="-Djava.awt.headless=true"

## Type:        integer(0:65535)
## Default:     8080
## ServiceRestart: jenkins
#
# Port Jenkins is listening on.
# Set to -1 to disable
#
JENKINS_PORT="8080"

## Type:        string
## Default:     ""
## ServiceRestart: jenkins
#
# IP address Jenkins listens on for HTTP requests.
# Default is all interfaces (0.0.0.0).
#
JENKINS_LISTEN_ADDRESS=""

## Type:        integer(0:65535)
## Default:     ""
## ServiceRestart: jenkins
#
# HTTPS port Jenkins is listening on.
# Default is disabled.
#
JENKINS_HTTPS_PORT=""

## Type:        string
## Default:     ""
## ServiceRestart: jenkins
#
# Path to the keystore in JKS format (as created by the JDK 'keytool').
# Default is disabled.
#
JENKINS_HTTPS_KEYSTORE=""

## Type:        string
## Default:     ""
## ServiceRestart: jenkins
#
# Password to access the keystore defined in JENKINS_HTTPS_KEYSTORE.
# Default is disabled.
#
JENKINS_HTTPS_KEYSTORE_PASSWORD=""

## Type:        string
## Default:     ""
## ServiceRestart: jenkins
#
# IP address Jenkins listens on for HTTPS requests.
# Default is disabled.
#
JENKINS_HTTPS_LISTEN_ADDRESS=""


## Type:        integer(1:9)
## Default:     5
## ServiceRestart: jenkins
#
# Debug level for logs -- the higher the value, the more verbose.
# 5 is INFO.
#
JENKINS_DEBUG_LEVEL="5"

## Type:        yesno
## Default:     no
## ServiceRestart: jenkins
#
# Whether to enable access logging or not.
#
JENKINS_ENABLE_ACCESS_LOG="no"

## Type:        integer
## Default:     100
## ServiceRestart: jenkins
#
# Maximum number of HTTP worker threads.
#
JENKINS_HANDLER_MAX="100"

## Type:        integer
## Default:     20
## ServiceRestart: jenkins
#
# Maximum number of idle HTTP worker threads.
#
JENKINS_HANDLER_IDLE="20"

## Type:        string
## Default:     ""
## ServiceRestart: jenkins
#
# Pass arbitrary arguments to Jenkins.
# Full option list: java -jar jenkins.war --help
#
JENKINS_ARGS=""

主程序目录

Jenkins持续集成&部署_第10张图片

JDK配置

Jenkins持续集成&部署_第11张图片

  • Global Tool Configuration:先把JDK安装到Linux服务器,且配置完善

Jenkins持续集成&部署_第12张图片

maven配置

  • 首先在服务器上安装并配置好maven

Jenkins持续集成&部署_第13张图片

  • jenkins 配置:

Jenkins持续集成&部署_第14张图片

插件安装

  • 如果jenkins需要安装什么插件,可以直接安装即可。
  • Maven Integration plugin 安装此插件才能构建maven项目

Jenkins持续集成&部署_第15张图片

  • Deploy to container Plugin 安装此插件,才能将打好的包部署到tomcat上

Jenkins持续集成&部署_第16张图片

系统设置

Jenkins持续集成&部署_第17张图片

  • 如果没安装 maven 插件就没有下面这个配置:

Jenkins持续集成&部署_第18张图片

git配置

  • git地址错误:这是由于git客户端版本过低造成的!或者系统中没有安装git所造成的
    Jenkins持续集成&部署_第19张图片
  • 所以,先安装git
wget https://mirrors.edge.kernel.org/pub/software/scm/git/git-2.1.1.tar.gz
tar -zxvf git-2.1.1.tar.gz -C /usr/apps/
cd /usr/apps/git-2.1.1/
# 编译安装
make prefix=/usr/local/git all
make prefix=/usr/local/git install

Jenkins持续集成&部署_第20张图片

持续构建

构建maven项目

  • 新建 Item,名字随便起,选择构建一个maven项目。

Jenkins持续集成&部署_第21张图片

构建配置

Jenkins持续集成&部署_第22张图片

  • 源码地址:

Jenkins持续集成&部署_第23张图片

  • 触发构建器:

Jenkins持续集成&部署_第24张图片

构建成功

Jenkins持续集成&部署_第25张图片

持续部署

执行shell脚本

#!/bin/bash

# 这一句很重要,这样指定了,项目启动之后才不会被Jenkins杀掉。
export BUILD_ID=dontKillMe

# 指定最后编译好的 jar 存放的位置
deploy_path=/usr/apps/vshop/vshop-seckill

# Jenkins中编译好的 jar 的位置
jar_path=/root/.jenkins/workspace/VSHOP-SECKILL/vshop-web/target

# Jenkins中编译好的 jar 名称
jar_name=seckill-web.jar

# 将编译好的 jar 复制到最后指定的位置
cp $jar_path/$jar_name  $deploy_path

# 找到之前部署项目的PID
PID=`jps | grep seckill-web.jar | awk '{print $1}'`

# 杀掉以前可能启动的项目进程
if [ -n "$PID" ]; then
	kill -9 $PID
    rm -rf *.log
fi

# 启动
nohup java -jar $deploy_path/$jar_name --server.port=8888 > $deploy_path/seckill-web.log 2>&1 &

# 将进程ID存入到seckill-web.pid文件中
echo $! > $deploy_path/seckill-web.pid
  • 以上脚本执行完毕,就会自动启动相应的项目。配置位置如下:

Jenkins持续集成&部署_第26张图片

  • 注意:必须加上 #!/bin/bash,否则不能启动起来。

执行完毕

Jenkins持续集成&部署_第27张图片

  • 我们发现项目可以访问了:http://192.168.254.120:8888/doc.html

你可能感兴趣的:(DevOps,CI/CD,Jenkins)