目录
什么是持续集成?什么是持续交付?CI/CD 管道的各个阶段CI/CD 的好处什么是 Jenkins?Jenkins 中的“持续集成”是什么?Jenkins 架构Jenkins 如何工作?Jenkins的好处Jenkins 搭建过程正文
什么是持续集成?
持续集成(CI)是在软件开发过程中自动化和集成许多团队成员的代码更改和更新的过程。在 CI 中,自动化工具在集成之前确认软件代码是有效且无错误的,这有助于检测错误并加快新版本的发布。什么是持续交付?
持续交付 (CD) 是指每天多次将新软件投入生产,自动将应用程序交付到基础设施环境的能力。CD 是 DevOps 的一部分,有助于缩短软件开发生命周期。CI/CD 管道的各个阶段
持续集成
在第一阶段,开发人员将他们的代码更改与其项目的主代码存储库合并。当开发人员推出代码时,他们会自动触发软件构建。持续交付
这是将构建交付到运行时环境以进行集成、质量保证或预生产的过程。在此阶段,将对应用程序运行功能和性能测试。
由于许多团队除了生产之外还使用多种软件开发环境,包括开发和测试,因此 CD 可以帮助团队有效地使用自动化来快速将代码更改推送到每个环境。
持续部署
在这个阶段,代码被部署到生产环境,包括公有云和混合云。部署会自动启动软件并将其分发给最终用户。自动化工具将经过测试和集成的软件移动到可以部署给最终用户的地方,例如应用程序商店。CI/CD 的好处
更频繁的代码部署
构建 CI/CD 管道的组织可以更快地推出代码。通过标准化构建、开发测试和自动化部署,团队可以将更多时间用于改进应用程序,而将更少的时间用于将代码交付到不同环境的技术流程。与多种环境无缝协作
软件开发团队通常访问多个开发和测试环境来测试和审查应用程序代码。借助 CI/CD,团队仍然可以将代码引入各种环境,而不必担心项目无法按计划进行。推动回归测试
通过自动化测试,可以识别构建何时通过或失败,工程师还可以通过回归测试移动代码。回归测试有助于确保代码在与其他主干合并时不会破坏软件构建,并确认代码按预期工作。
要求开发人员在所有环境中运行回归测试是一个好主意,这样开发人员只有在所有测试通过后才将测试发送到版本控制。
改善项目协作和质量
由于采用 CI/CD 的开发人员更频繁地提交代码,因此团队可以使用较小的代码包快速识别质量问题,而不是沿着项目时间线稍后创建较大的代码包。此外,当开发人员的提交周期较短时,他们可能不会编辑相同的代码并需要合并。
使用 CI/CD 的团队也倾向于预先加载质量检查,例如从版本控制配置和实践定义开始。除了经常检查代码之外,开发人员还将在不同的时间线上管理功能和修复,然后可以控制哪些代码和功能已准备好投入生产。
降低开发成本
借助一套通用、一致的开发和测试工具,软件开发团队可以避免与管理和许可不同应用程序相关的额外成本。当 CI/CD 支持自动化时,团队可以在开发和发布应用程序方面获得规模经济。生成反馈 当团队获得有关方法的反馈时,功能会更快地推进。反馈使团队能够衡量结果,以便他们有确凿的证据作为新项目的基础。当团队快速获得关于哪些工作流程和方法可以成功构建的答案时,这些知识就会融入到未来的每个构建中。
什么是 Jenkins?
Jenkins 是一个开源持续集成 (CI) 服务器。它管理和控制软件交付过程的多个阶段,包括构建、文档、自动化测试、打包和静态代码分析。Jenkins 是一种非常流行的 DevOps 工具,被数千个开发团队使用。
Jenkins 自动化通常由 GitHub、Bitbucket 和 GitLab 等存储库中的代码更改触发,并与 Maven 和 Gradle 等构建工具集成。
Jenkins 支持使用 Docker 和 Kubernetes 等容器技术来测试和打包软件版本,但它既不是 Kubernetes 原生解决方案,也不是容器原生 CI 解决方案。
Jenkins 中的“持续集成”是什么?
持续集成是一种开发实践,可以将代码集成到共享存储库中。
该实践使用自动验证来及早发现代码问题。
持续集成触发构建以查找和识别代码中存在的错误。
它增加了构建过程的一致性。
这是一种更快地构建事物并防止代码损坏的方法。
Jenkins 架构
Jenkins 如何工作?
Jenkins 在每次提交源代码存储库(通常是开发分支)时都会触发构建。
Jenkins 可以配置为运行初始的单元测试套件,以确保提交不会“破坏构建”。如果测试未通过,可以立即通知开发人员采取纠正措施。这就解决了“谁破坏建造?”的问题。因为很容易确定哪个提交导致构建失败。如果所有单元测试都通过,那么构建管道可以进入下一阶段的集成测试,这通常需要更长的时间来运行。
Jenkins 提供了在多台机器上并行运行构建的能力,以最大限度地减少完成许多这些活动所需的总时间。最后,Jenkins 可以将构建部署到允许在将其发布到生产环境之前进行任何所需的用户验收测试 (UAT) 的环境。这些简化的步骤体现了持续集成 (CI) 环境的精神。
Jenkins的好处
Jenkins 并不是当今唯一的 CI 工具 - GitHub Actions、GitLab、Travis CI 和 CircleCI 是一些使用更广泛的替代品。那么是什么让 Jenkins 脱颖而出,成为大多数开发人员的首选呢?
开源:这显然是 Jenkins 受到广泛欢迎的一个关键原因。它是免费的,因此任何组织都可以开始使用它,而不受预算限制。它也很
容易安装:Jenkins 是作为一个独立的 Java 程序开发的,这意味着它可以在大多数设备和操作系统上运行。
社区支持:由于它是开源的,并且多年来一直是首选 CI 工具,Jenkins 现在拥有强大的社区支持。这增强了 Jenkins 的受欢迎程度,因为很容易找到教程和其他资源来充分利用它。
插件: Jenkins 的主要优点之一是可以扩展其功能的庞大插件目录。据最新统计,Jenkins 拥有超过 1,800 个社区开发的插件,允许任何组织调整或增强基本功能以适应自己的 DevOps 环境。除了插件之外,Jenkins 还易于修改和扩展,以满足大多数组织的需求。
分布式:对于复杂的项目来说,一台服务器就足够了,因此 Jenkins 使用主从架构来管理分布式构建。主服务器是“主”服务器,然后它可以将工作负载分配给其他“从”服务器,从而允许同时运行多个构建和测试环境。例如,这种方法可用于在不同操作系统上构建和测试代码。
Jenkins 搭建过程
本文章使用版本:Jenkins 2.426.1 (November 2023) and newer
需要支持Java版本:Java 11, Java 17 or Java 21准备环境
[root@Jenkins ~]# cat /etc/redhat-releaseCentOS Linux release 7.9.2009 (Core)[root@Jenkins ~]# uname -r3.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 --statenot 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 jenkinsjenkins.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 ServerRequires=network.targetAfter=network.target[Service]Type=notifyNotifyAccess=mainExecStart=/usr/bin/jenkinsRestart=on-failureSuccessExitStatus=143User=jenkinsGroup=jenkinsEnvironment="JENKINS_HOME=/var/lib/jenkins"WorkingDirectory=/var/lib/jenkinsEnvironment="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=jenkinsUser=rootGroup=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 --versionopenjdk 11.0.21 2023-10-17 LTSOpenJDK 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 --version2.426.1[root@Jenkins ~]# netstat -ntpl | grep 8989tcp6 0 0 :::8989 :::* LISTEN 1687/java[root@Jenkins ~]#[root@Jenkins ~]# ps -ef | grep jenkinsjenkins 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_logroot 1967 1427 0 16:33 pts/1 00:00:00 grep --color=auto jenkins打开浏览器进入链接 http://IP:PORT
[root@Jenkins ~]# cat /var/lib/jenkins/secrets/initialAdminPassword1d6f364f60a44f449f9253b5cee0893c