持续集成
持续交付
这是将构建交付到运行时环境以进行集成、质量保证或预生产的过程。在此阶段,将对应用程序运行功能和性能测试。
由于许多团队除了生产之外还使用多种软件开发环境,包括开发和测试,因此 CD 可以帮助团队有效地使用自动化来快速将代码更改推送到每个环境。
持续部署
更频繁的代码部署
与多种环境无缝协作
推动回归测试
通过自动化测试,可以识别构建何时通过或失败,工程师还可以通过回归测试移动代码。回归测试有助于确保代码在与其他主干合并时不会破坏软件构建,并确认代码按预期工作。
要求开发人员在所有环境中运行回归测试是一个好主意,这样开发人员只有在所有测试通过后才将测试发送到版本控制。
改善项目协作和质量
由于采用 CI/CD 的开发人员更频繁地提交代码,因此团队可以使用较小的代码包快速识别质量问题,而不是沿着项目时间线稍后创建较大的代码包。此外,当开发人员的提交周期较短时,他们可能不会编辑相同的代码并需要合并。
使用 CI/CD 的团队也倾向于预先加载质量检查,例如从版本控制配置和实践定义开始。除了经常检查代码之外,开发人员还将在不同的时间线上管理功能和修复,然后可以控制哪些代码和功能已准备好投入生产。
降低开发成本
生成反馈
当团队获得有关方法的反馈时,功能会更快地推进。反馈使团队能够衡量结果,以便他们有确凿的证据作为新项目的基础。当团队快速获得关于哪些工作流程和方法可以成功构建的答案时,这些知识就会融入到未来的每个构建中。
Jenkins 是一个开源持续集成 (CI) 服务器。它管理和控制软件交付过程的多个阶段,包括构建、文档、自动化测试、打包和静态代码分析。Jenkins 是一种非常流行的 DevOps 工具,被数千个开发团队使用。
Jenkins 自动化通常由 GitHub、Bitbucket 和 GitLab 等存储库中的代码更改触发,并与 Maven 和 Gradle 等构建工具集成。
Jenkins 支持使用 Docker 和 Kubernetes 等容器技术来测试和打包软件版本,但它既不是 Kubernetes 原生解决方案,也不是容器原生 CI 解决方案。
持续集成是一种开发实践,可以将代码集成到共享存储库中。
该实践使用自动验证来及早发现代码问题。
持续集成触发构建以查找和识别代码中存在的错误。
它增加了构建过程的一致性。
这是一种更快地构建事物并防止代码损坏的方法。
Jenkins 在每次提交源代码存储库(通常是开发分支)时都会触发构建。
Jenkins 可以配置为运行初始的单元测试套件,以确保提交不会“破坏构建”。如果测试未通过,可以立即通知开发人员采取纠正措施。这就解决了“谁破坏建造?”的问题。因为很容易确定哪个提交导致构建失败。如果所有单元测试都通过,那么构建管道可以进入下一阶段的集成测试,这通常需要更长的时间来运行。
Jenkins 提供了在多台机器上并行运行构建的能力,以最大限度地减少完成许多这些活动所需的总时间。最后,Jenkins 可以将构建部署到允许在将其发布到生产环境之前进行任何所需的用户验收测试 (UAT) 的环境。这些简化的步骤体现了持续集成 (CI) 环境的精神。
Jenkins 并不是当今唯一的 CI 工具 - GitHub Actions、GitLab、Travis CI 和 CircleCI 是一些使用更广泛的替代品。那么是什么让 Jenkins 脱颖而出,成为大多数开发人员的首选呢?
开源:这显然是 Jenkins 受到广泛欢迎的一个关键原因。它是免费的,因此任何组织都可以开始使用它,而不受预算限制。它也很
容易安装:Jenkins 是作为一个独立的 Java 程序开发的,这意味着它可以在大多数设备和操作系统上运行。
社区支持:由于它是开源的,并且多年来一直是首选 CI 工具,Jenkins 现在拥有强大的社区支持。这增强了 Jenkins 的受欢迎程度,因为很容易找到教程和其他资源来充分利用它。
插件: Jenkins 的主要优点之一是可以扩展其功能的庞大插件目录。据最新统计,Jenkins 拥有超过 1,800 个社区开发的插件,允许任何组织调整或增强基本功能以适应自己的 DevOps 环境。除了插件之外,Jenkins 还易于修改和扩展,以满足大多数组织的需求。
分布式:对于复杂的项目来说,一台服务器就足够了,因此 Jenkins 使用主从架构来管理分布式构建。主服务器是“主”服务器,然后它可以将工作负载分配给其他“从”服务器,从而允许同时运行多个构建和测试环境。例如,这种方法可用于在不同操作系统上构建和测试代码。
本文章使用版本:Jenkins 2.426.1 (November 2023) and newer
需要支持Java版本:Java 11, Java 17 or Java 21
准备环境
[root@Jenkins ~]# cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)
[root@Jenkins ~]# uname -r
3.10.0-1160.el7.x86_64
[root@Jenkins ~]# setenforce 0
[root@Jenkins ~]# sed -i.bak '7s/enforcing/disabled/' /etc/selinux/config
[root@Jenkins ~]# systemctl stop firewalld
[root@Jenkins ~]# systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
Active: inactive (dead)
Docs: man:firewalld(1)
[root@Jenkins ~]# firewall-cmd --state
not running
下载安装
# 下载安装java 11
[root@Jenkins ~]# yum install java-11-openjdk java-11-openjdk-devel
#############################################################################################################
# 下载安装指定稳定版Jenkns
[root@Jenkins ~]# wget https://mirrors.jenkins-ci.org/redhat-stable/jenkins-2.346.1-1.1.noarch.rpm
[root@Jenkins ~]# rpm -ivh jenkins-2.346.1-1.1.noarch.rpm
#############################################################################################################
# 下载安装最新稳定版Jenkins (当前2.426.1)
[root@Jenkins ~]# wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo
[root@Jenkins ~]# rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io-2023.key
[root@Jenkins ~]# yum install jenkins
[root@Jenkins ~]# yum list | grep jenkins
jenkins.noarch 2.426.1-1.1 @jenkins
[root@Jenkins ~]# rpm -ql jenkins
/usr/bin/jenkins # jenkins安装目录,WAR包会放在这里。
/usr/lib/systemd/system/jenkins.service # Jenkins配置文件、端口、JENKINS_HOME等配置信息
/usr/share/java/jenkins.war # jenkins.war默认位置
/usr/share/jenkins/migrate # 关于迁移
/var/cache/jenkins # 缓存目录
/var/lib/jenkins # 默认的JENKINS_HOME
[root@Jenkins ~]# chown -R root.root /var/cache/jenkins /var/lib/jenkins
修改配置
# 默认配置
[root@Jenkins ~]# egrep -v "^$|^#" /usr/lib/systemd/system/jenkins.service
[Unit]
Description=Jenkins Continuous Integration Server
Requires=network.target
After=network.target
[Service]
Type=notify
NotifyAccess=main
ExecStart=/usr/bin/jenkins
Restart=on-failure
SuccessExitStatus=143
User=jenkins
Group=jenkins
Environment="JENKINS_HOME=/var/lib/jenkins"
WorkingDirectory=/var/lib/jenkins
Environment="JENKINS_WEBROOT=%C/jenkins/war"
Environment="JAVA_OPTS=-Djava.awt.headless=true"
Environment="JENKINS_PORT=8080"
[Install]
WantedBy=multi-user.target
# 修改如下内容
[root@Jenkins ~]# vim /usr/lib/systemd/system/jenkins.service
...
...
# 修改用户及属组
#User=jenkins
#Group=jenkins
User=root
Group=root
...
...
# 修改端口号
#Environment="JENKINS_PORT=8080" 默认端口
Environment="JENKINS_PORT=8989"
...
...
# 开启日志
#Environment="JENKINS_ENABLE_ACCESS_LOG=false" 默认关闭
Environment="JENKINS_ENABLE_ACCESS_LOG=true"
启动 Jenkins
[root@Jenkins ~]# systemctl start jenkins
[root@Jenkins ~]# java --version
openjdk 11.0.21 2023-10-17 LTS
OpenJDK Runtime Environment (Red_Hat-11.0.21.0.9-1.el7_9) (build 11.0.21+9-LTS)
OpenJDK 64-Bit Server VM (Red_Hat-11.0.21.0.9-1.el7_9) (build 11.0.21+9-LTS, mixed mode, sharing)
[root@Jenkins ~]# jenkins --version
2.426.1
[root@Jenkins ~]# netstat -ntpl | grep 8989
tcp6 0 0 :::8989 :::* LISTEN 1687/java
[root@Jenkins ~]#
[root@Jenkins ~]# ps -ef | grep jenkins
jenkins 1687 1 4 16:28 ? 00:00:12 /usr/bin/java -Djava.awt.headless=true -jar /usr/share/java/jenkins.war --webroot=%C/jenkins/war --httpPort=8989 --accessLoggerClassName=winstone.accesslog.SimpleAccessLogger --simpleAccessLogger.format=combined --simpleAccessLogger.file=/var/log/jenkins/access_log
root 1967 1427 0 16:33 pts/1 00:00:00 grep --color=auto jenkins
打开浏览器进入链接 http://IP:PORT
[root@Jenkins ~]# cat /var/lib/jenkins/secrets/initialAdminPassword
1d6f364f60a44f449f9253b5cee0893c