转载地址:https://blog.csdn.net/weixin_41947378/article/details/111559374
一、什么是持续集成?
持续集成是一个开发的实践,需要开发人员定期集成代码到共享存储库。这个概念是为了消除发现的问题,后来出现在构建生命周期的问题。持续集成要求开发人员有频繁的构建。最常见的做法是,每当一个代码提交时,构建应该被触发。
1. CI/DI简介
互联网软件的开发和发布,已经形成了一套标准流程,假如把开发工作流程分为以下几个阶段:
编码 --> 构建 --> 集成 --> 测试 --> 交付 --> 部署
如上图所示,[持续集成(Continuous Integration)]
、[持续交付(Continuous Delivery)]
和[持续部署(Continuous Deployment)]
有着不同的软件自动化交付周期。
交付就是发布一个版本,该版本已经测试没有问题了。
2. 持续集成[CI]
上面整个流程中最重要的组成部分就是持续集成(Continuous integration,简称CI)。
持续集成指的是,频繁地(一天多次)将代码集成到主干。将软件个人研发的部分向软件整体部分交付,频繁进行集成以便更快地发现其中的错误。
它的好处主要有两个:
- 1. 快速发现错误。每完成一点更新,就集成到主干,可以快速发现错误,定位错误也比较容易;
- 2. 防止分支大幅偏离主干。如果不是经常集成,主干又在不断更新,会导致以后集成的难度变大,甚至难以集成。
持续集成并不能消除Bug,而是让它们非常容易发现和改正。持续集成的目的,就是让产品可以快速迭代,同时还能保持高质量。它的核心措施是,代码集成到主干之前,必须通过自动化测试。只要有一个测试用例失败,就不能集成。
3. 持续交付
持续交付(Continuous delivery)指的是,频繁地将软件的新版本,交付给质量团队或者用户,以供评审。如果评审通过,代码就进入生产阶段。
持续交付在持续集成的基础上,将集成后的代码部署到更贴近真实运行环境的「类生产环境」(production-like environments)中。持续交付优先于整个产品生命周期的软件部署,建立在高水平自动化持续集成之上
即 预发环境验收
持续交付可以看作持续集成的下一步。它强调的是,不管怎么更新,软件是随时随地可以交付的。
4. 持续部署[CD]
持续部署(continuous deployment)是持续交付的下一步,指的是代码通过评审以后,自动部署到生产环境。
持续部署的目标是,代码在任何时刻都是可部署的,可以进入生产阶段。
持续部署的前提是能自动化完成测试、构建、部署等步骤。
总的来说,持续集成、持续交付、持续部署提供了一个优秀的 DevOps 环境。对于整个开发团队来说,能很大地提升开发效率,好处与挑战并行。无论如何,频繁部署、快速交付以及开发测试流程自动化都将成为未来软件工程的重要组成部分。
二、Jenkins
1. 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,有时人们还可能看到它与Hudson关联。Hudson是由 Sun Microsystems 开发的一个非常流行的开源,基于Java 的持续集成工具,后来被Oracle收购。Sun被Oracle收购之后,一个从 Hudson 源代码的分支由 Jenkins 创建出台
2. Jenkins安装
2.1 系统要求
最低推荐配置:
- 256MB可用内存
- 1GB可用磁盘空间(作为一个Docker容器运行jenkins的话推荐10GB)
为小团队推荐的硬件配置:
- 1GB+可用内存
- 50 GB+ 可用磁盘空间
软件配置:
- Java 8—无论是Java运行时环境(JRE)还是Java开发工具包(JDK)都可以。
注意: 如果将Jenkins作为Docker 容器运行,这不是必需的
2.2 War方式安装
有很多种安装方式,这里我们用war方式安装。
3. 安装后设置向导
3.1 解锁 Jenkins
当您第一次访问新的Jenkins实例时,系统会要求您使用自动生成的密码对其进行解锁。
- 浏览到 http://localhost:8080(或安装时为Jenkins配置的任何端口),并等待 解锁 Jenkins 页面出现。
- 从Jenkins控制台日志输出中,复制自动生成的字母数字密码(在两组星号之间)。
# 执行该命令直接查看密码 cat /var/lib/jenkins/secrets/initialAdminPassword
- 1
- 2
- 在 解锁Jenkins 页面上,将此 密码 粘贴到管理员密码字段中,然后单击 继续
注意:
- 如果您以分离模式在Docker中运行Jenkins,则可以从Docker日志(above) 访问Jenkins控制台日志。
- Jenkins控制台日志显示可以获取密码的位置(在Jenkins主目录中)。 必须在新Jenkins安装中的安装向导中输入此密码才能访问Jenkins的主UI。 如果您在设置向导中跳过了后续的用户创建步骤, 则此密码还可用作默认admininstrator帐户的密码(使用用户名“admin”)
3.2 自定义jenkins插件
解锁 Jenkins之后,在 Customize Jenkins 页面内, 您可以安装任何数量的有用插件作为您初始步骤的一部分。
两个选项可以设置:
- 安装建议的插件 - 安装推荐的一组插件,这些插件基于最常见的用例.
- 选择要安装的插件 - 选择安装的插件集。当你第一次访问插件选择页面时,默认选择建议的插件。
如果您不确定需要哪些插件,请选择 安装建议的插件 。 您可以通过Jenkins中的Manage Jenkins > Manage Plugins 页面在稍后的时间点安装(或删除)其他Jenkins插件 。
设置向导显示正在配置的Jenkins的进程以及您正在安装的所选Jenkins插件集。这个过程可能需要几分钟的时间
这里我选择
安装推荐的插件
3.3 创建第一个管理员用户
最后,在customizing Jenkins with plugins之后,Jenkins要求您创建第一个管理员用户。出现“ 创建第一个管理员用户 ”页面时, 请在各个字段中指定管理员用户的详细信息,然后单击 保存完成 。当 Jenkins准备好了 出现时,单击开始使用 Jenkins。
注意:这个页面可能显示 Jenkins几乎准备好了! 相反,如果是这样,请单击 重启 。如果该页面在一分钟后不会自动刷新,请使用Web浏览器手动刷新页面。如果需要,请使用您刚刚创建的用户的凭据登录到Jenkins,并准备好开始使用Jenkins!
这里我直接创建用户名为admin,密码自定义:
点击
保存并完成
,然后进行实例配置:提示配置jenkins URL,这里保持默认即可,继续点击
保存并完成
提示jenkins已经就绪,现在就可以开始使用jenkins了:
3.4 jenkins实例似乎已离线问题
解决方案:
-
1. 直接访问插件配置页面进行修改:/jenkins/pluginManager/advanced
-
2. 修改升级站点的url
https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
http://mirror.xmission.com/jenkins/updates/update-center.json
http://ftp.tsukuba.wide.ad.jp/software/jenkins/updates/current/update-center.json
http://updates.jenkins.io/update-center.json -
3. 重启Jenkins
重启后再次输入密码进入就是正常的啦,正常的页面如下:
4. Jekins相关配置
4.1 Jenkins配置文件
#查看jenkins的配置文件,定义了home、JAVA_CMD、user、port等基础配置,保持默认即可
cat /etc/sysconfig/jenkins
- 1 JENKINS_PORT:jekins启动的端口
- 2 JENKINS_USER:jekins用户名
需要关注两个配置,可以按需修改:
- JENKINS_PORT:jekins启动的端口
- JENKINS_USER:jekins用户名
1 ## Path: Development/Jenkins 2 ## Description: Jenkins Automation Server 3 ## Type: string 4 ## Default: "/var/lib/jenkins" 5 ## ServiceRestart: jenkins 6 # 7 # Directory where Jenkins store its configuration and working 8 # files (checkouts, build reports, artifacts, ...). 9 # 10 JENKINS_HOME="/var/lib/jenkins" 11 12 ## Type: string 13 ## Default: "" 14 ## ServiceRestart: jenkins 15 # 16 # Java executable to run Jenkins 17 # When left empty, we'll try to find the suitable Java. 18 # 19 JENKINS_JAVA_CMD="" 20 21 ## Type: string 22 ## Default: "jenkins" 23 ## ServiceRestart: jenkins 24 # 25 # Unix user account that runs the Jenkins daemon 26 # Be careful when you change this, as you need to update 27 # permissions of $JENKINS_HOME and /var/log/jenkins. 28 # 29 JENKINS_USER="jenkins" 30 31 ## Type: string 32 ## Default: "false" 33 ## ServiceRestart: jenkins 34 # 35 # Whether to skip potentially long-running chown at the 36 # $JENKINS_HOME location. Do not enable this, "true", unless 37 # you know what you're doing. See JENKINS-23273. 38 # 39 #JENKINS_INSTALL_SKIP_CHOWN="false" 40 41 ## Type: string 42 ## Default: "-Djava.awt.headless=true" 43 ## ServiceRestart: jenkins 44 # 45 # Options to pass to java when running Jenkins. 46 # 47 JENKINS_JAVA_OPTIONS="-Djava.awt.headless=true" 48 49 ## Type: integer(0:65535) 50 ## Default: 8080 51 ## ServiceRestart: jenkins 52 # 53 # Port Jenkins is listening on. 54 # Set to -1 to disable 55 # 56 JENKINS_PORT="8080" 57 58 ## Type: string 59 ## Default: "" 60 ## ServiceRestart: jenkins 61 # 62 # IP address Jenkins listens on for HTTP requests. 63 # Default is all interfaces (0.0.0.0). 64 # 65 JENKINS_LISTEN_ADDRESS="" 66 67 ## Type: integer(0:65535) 68 ## Default: "" 69 ## ServiceRestart: jenkins 70 # 71 # HTTPS port Jenkins is listening on. 72 # Default is disabled. 73 # 74 JENKINS_HTTPS_PORT="" 75 76 ## Type: string 77 ## Default: "" 78 ## ServiceRestart: jenkins 79 # 80 # Path to the keystore in JKS format (as created by the JDK 'keytool'). 81 # Default is disabled. 82 # 83 JENKINS_HTTPS_KEYSTORE="" 84 85 ## Type: string 86 ## Default: "" 87 ## ServiceRestart: jenkins 88 # 89 # Password to access the keystore defined in JENKINS_HTTPS_KEYSTORE. 90 # Default is disabled. 91 # 92 JENKINS_HTTPS_KEYSTORE_PASSWORD="" 93 94 ## Type: string 95 ## Default: "" 96 ## ServiceRestart: jenkins 97 # 98 # IP address Jenkins listens on for HTTPS requests. 99 # Default is disabled. 100 # 101 JENKINS_HTTPS_LISTEN_ADDRESS="" 102 103 104 ## Type: integer(1:9) 105 ## Default: 5 106 ## ServiceRestart: jenkins 107 # 108 # Debug level for logs -- the higher the value, the more verbose. 109 # 5 is INFO. 110 # 111 JENKINS_DEBUG_LEVEL="5" 112 113 ## Type: yesno 114 ## Default: no 115 ## ServiceRestart: jenkins 116 # 117 # Whether to enable access logging or not. 118 # 119 JENKINS_ENABLE_ACCESS_LOG="no" 120 121 ## Type: integer 122 ## Default: 100 123 ## ServiceRestart: jenkins 124 # 125 # Maximum number of HTTP worker threads. 126 # 127 JENKINS_HANDLER_MAX="100" 128 129 ## Type: integer 130 ## Default: 20 131 ## ServiceRestart: jenkins 132 # 133 # Maximum number of idle HTTP worker threads. 134 # 135 JENKINS_HANDLER_IDLE="20" 136 137 ## Type: string 138 ## Default: "" 139 ## ServiceRestart: jenkins 140 # 141 # Pass arbitrary arguments to Jenkins. 142 # Full option list: java -jar jenkins.war --help 143 # 144 JENKINS_ARGS=""
4.2 主程序目录
1 ls /var/lib/jenkins/ #查看程序主目录 2 3 config.xml nodes 4 hudson.model.UpdateCenter.xml plugins 5 hudson.plugins.git.GitTool.xml queue.xml.bak 6 identity.key.enc secret.key 7 jenkins.CLI.xml secret.key.not-so-secret 8 jenkins.install.InstallUtil.lastExecVersion secrets 9 jenkins.install.UpgradeWizard.state updates 10 jenkins.model.JenkinsLocationConfiguration.xml userContent 11 jobs users 12 logs workflow-libs 13 nodeMonitors.xml
- jobs 浏览器上面创建的任务都会存放在这里
- logs 存放jenkins相关的日志
- nodes 多节点时用到
- plugins 插件所在目录
- secrets 密码秘钥所在目录 //jobs和plugins目录比较重要
5. 插件安装
如果jenkins需要安装什么插件,可以直接安装即可。选择 系统管理 -> 管理插件
1)Maven Integration plugin 安装此插件才能构建maven项目
2)Deploy to container Plugin 安装此插件,才能将打好的包部署到tomcat上
6. 全局工具配置
选择 系统管理 -> 全局工具配置
6.1 JDK配置
先把JDK安装到所在服务器,略,然后在Jenkins 全局工具配置 里,选择新增JDK,配置JAVA_HOME:
6.2 maven配置
6.2.1 安装maven
在所在服务器安装maven:
官网地址:http://maven.apache.org/download.cgi
安装比较简单,解压即可,配置一下本地仓库,镜像地址即可,过程略。
配置环境变量:vim /etc/profile
1 export M2_HOME=/data/apache-maven-3.6.1 2 export M2=$M2_HOME/bin 3 export PATH=$M2:$PATH
6.2.2 Jenkins配置maven
同理在全局工具配置 里,选择新增Maven,配置MAVEN_HOME:
6.3 git配置
6.3.1 git地址错误
原因分析:这是由于git客户端版本过低造成的!或者系统中没有安装git所造成的
Jenkins本机默认使用"yum install -y git" 安装的git版本比较低,应该自行安装更高版本的git
如果想要使用最新版的git,那还是得自己下载源码安装。
6.3.2 安装git
安装git
1 # 安装编译git时需要的依赖 2 yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel 3 yum install gcc perl-ExtUtils-MakeMaker 4 5 # 安装编译源码所需依赖的时候,yum自动帮你安装了git,这时候你需要先卸载这个旧版的git。 6 yum -y remove git 7 8 cd /usr/local/src/ 9 wget https://mirrors.edge.kernel.org/pub/software/scm/git/git-2.1.1.tar.gz # 下载源码包 10 tar -zvxf git-2.1.1.tar.gz 11 cd git-2.1.1 12 13 make prefix=/usr/local/git all # 编译git源码 14 make prefix=/usr/local/git install # 安装git至/usr/local/git路径
添加git到环境变量
1 echo "export PATH=$PATH:/usr/local/git/bin" >> /etc/bashrc 2 source /etc/bashrc
查看更新后的git版本和所在路径
1 git --version 2 whereis git
6.3.3 设置git
同理在全局工具配置 里,配置Git:
查看git安装地址:
Path to Git executable,在此处填入 “whereis git” 查询出的地址 + “/bin/git” (如上面"whereis git"的地址为"/usr/local/git",则应该填入 “/usr/local/git/bin/git”) 并保存