赞
踩
目录
微服务开发模式已经成为当下java主流,微服务在给团队开发协作带来便利,也给项目快速交付提供高效支撑的同时,也给服务的部署、运维等工作提出了更高的要求。可持续集成(CI/CD)的实践,让繁杂的部署运维工作以高效的方式进行协作,本篇将详细介绍可持续集成环境的搭建。
尽管微服务架构有许多优点,如灵活性、可伸缩性和独立部署等,但也存在一些缺点,包括:
除了微服务自身的一些挑战,还有一个不可忽视的要素,那就是给后续的运维带来的一系列挑战,具体来说,主要包括下面几点:
综上所述,微服务架构的实施给运维团队带来了一些挑战,需要团队具备更多的技术和管理能力来应对这些挑战,确保系统的稳定性和可靠性
在当今快节奏的软件开发环境中,持续集成(Continuous Integration)和持续交付(Continuous Delivery)已经成为构建高效软件交付流程的关键组成部分。这两个实践不仅提高了团队的效率,还能够确保软件质量、加速交付并降低风险。
持续集成是一种实践,开发者在频繁的将代码集成到代码仓库中,就可以对代码进行自动构建、部署,以便尽早地发现和解决集成问题。持续集成旨在减少集成问题的积累,确保代码在集成到主干分支之前是稳定和可靠的。
持续交付是在持续集成的基础上进一步发展的实践。它强调自动化的部署流程,使得每次代码更改都可以自动部署到生产环境中,从而实现频繁的软件交付。持续交付能够将新功能、修复和改进快速地交付到用户手中,同时降低发布过程中的风险。
可持续集成(Continuous Integration,CI)是一种软件开发实践,旨在通过将团队成员的代码频繁集成到共享存储库中,并自动进行构建和测试,以确保软件质量、减少集成问题、提高开发效率。可持续集成的核心理念包括:
频繁集成:团队成员每天将代码提交到共享存储库,确保代码库保持最新状态。
自动化构建:每次代码提交后,自动触发构建流程,包括编译、打包等操作,生成可执行的软件。
自动化测试:自动运行各种测试,包括单元测试、集成测试、功能测试等,快速发现问题并及时修复。
及时反馈:及时向开发人员反馈构建和测试结果,帮助他们尽早发现和解决问题。
通过可持续集成,团队能够减少集成问题、提高软件质量、加快交付速度,促进团队协作和沟通。这种持续集成的方式可以让开发团队更快速地交付高质量的软件产品,从而提升整体开发效率和质量水平。
了解了微服务的痛点之后,可持续集成的优势是很明显的,主要包括:
微服务架构是一种分布式系统设计方法,将整个应用拆分为小而自治的服务单元,每个服务都可以独立开发、部署和运行。在微服务架构中,由于服务之间的相互依赖性较强,因此需要对每个微服务进行持续集成,以确保整个系统的稳定性和可靠性。以下是微服务需要可持续集成的主要原因:
快速迭代:微服务架构下,每个服务都可以独立开发和部署,因此需要频繁地进行集成和测试,以实现快速的迭代和发布。
复杂度管理:微服务架构中可能涉及多个不同的服务和团队协作,通过持续集成可以帮助管理复杂度,确保各个服务能够正常协同工作。
隔离风险:微服务架构下,一个服务的变更可能会影响到其他服务,通过持续集成可以及时发现问题并减少风险。
自动化测试:微服务架构通常涉及多个服务之间的交互,通过自动化测试可以确保各个服务的功能和接口都正常工作。
系统完整性:通过持续集成可以确保每次集成都是可运行的,保证系统的完整性和稳定性。
综上所述,微服务架构下的可持续集成是确保系统稳定性、可靠性和高效性的重要手段,有助于团队更好地管理和发展微服务应用。
经过多年的行业经验的沉淀和发展,业内也逐渐形成了一些比较成熟的解决方案,下面列举一些常用的可持续集成方案。
一些常用的可持续集成工具包括:
Jenkins:是一个开源的持续集成工具,可以实现自动化构建、测试和部署流程,支持丰富的插件和扩展功能。
GitLab CI/CD:与GitLab版本控制系统集成,提供完整的CI/CD功能,支持自动化构建、测试、部署等操作。
CircleCI:是一个基于云的持续集成平台,提供简单易用的CI/CD功能,支持多种编程语言和环境。
Travis CI:也是一个基于云的持续集成平台,支持GitHub等版本控制系统,能够快速配置和运行持续集成任务。
TeamCity:是JetBrains开发的持续集成工具,支持多种项目类型和构建环境,具有灵活的配置和定制能力。
Bamboo:是Atlassian公司的持续集成工具,与Jira等软件开发工具集成紧密,提供全面的CI/CD功能。
GoCD:是ThoughtWorks开发的持续交付工具,支持复杂的CI/CD管道配置和多阶段流水线。
以上是一些常见的可持续集成工具,团队可以根据自身需求和项目特点选择适合的工具来实现持续集成和持续交付。每个工具都有其特点和优势,可以根据具体情况进行评估和选择。
一些常见的可持续集成解决方案包括:
自建方案
团队可以自行搭建持续集成环境,使用开源工具如Jenkins、GitLab CI等,根据项目需求和规模定制化配置持续集成流程。
云端托管服务
一些云服务提供商如AWS CodePipeline、Azure DevOps、Google Cloud Build等提供了托管的持续集成解决方案,能够快速搭建并管理持续集成流程。
集成开发平台
一些集成开发平台如GitHub Actions、GitLab CI/CD等提供了集成的CI/CD功能,能够与代码仓库无缝集成,简化持续集成流程。
企业级解决方案
一些企业级的持续集成解决方案如TeamCity、Bamboo等提供了更加完善和复杂的持续集成功能,适用于大型企业项目。
容器化解决方案
使用容器技术如Docker、Kubernetes等构建持续集成环境,能够实现快速部署、灵活扩展和环境隔离。
专业的持续集成服务提供商
一些专业的持续集成服务提供商如CircleCI、Travis CI等提供了稳定、可靠的持续集成解决方案,支持多种项目类型和编程语言。
以上是一些常见的可持续集成解决方案,团队可以根据自身的需求、技术栈和预算选择合适的方案来实现持续集成,提高软件开发效率和质量。
Jenkins是一个开源的持续集成工具,用于自动化构建、测试和部署软件项目。它支持多种插件和扩展功能,可以与各种版本控制工具(如Git、SVN等)和构建工具(如Maven、Gradle等)集成,提供灵活、可定制的持续集成解决方案。
在可持续集成中,Jenkins是一个非常常用且强大的工具,以下是Jenkins在可持续集成中的使用方式:
自动化构建:Jenkins可以通过配置Pipeline或Job来自动化构建代码。当团队成员提交新的代码变更时,Jenkins会自动触发构建过程,编译代码、运行测试,并生成构建报告。
持续集成:Jenkins支持持续集成,可以定期或基于代码提交等事件来触发构建流程。持续集成有助于快速发现问题、减少错误,确保代码库的稳定性和质量。
自动化测试:Jenkins可以集成各种测试工具,如JUnit、Selenium等,自动运行单元测试、集成测试、端到端测试等。通过自动化测试,Jenkins能够帮助团队及时发现问题,保证软件质量。
集成部署:Jenkins可以与部署工具(如Ansible、Docker)等集成,实现自动化部署。一旦构建成功,Jenkins可以自动将代码部署到测试环境、预生产环境甚至生产环境。
版本控制集成:Jenkins可以与版本控制系统(如Git、SVN)进行集成,监测代码仓库的变化,触发构建流程。这样可以确保每次构建都是基于最新的代码。
持续交付:通过Jenkins实现持续集成和自动化部署,能够加速软件交付周期,使新功能或改进快速地交付给用户,提高团队的生产力和响应速度。
报告和通知:Jenkins可以生成构建报告、测试结果报告,并通过邮件、Slack等渠道发送通知给团队成员,让大家了解构建状态和结果。
综上所述,Jenkins在可持续集成中发挥着关键作用,能够帮助团队实现自动化构建、持续集成、自动化测试、持续交付等,提高软件开发效率和质量。通过合理配置和优化Jenkins的使用,团队可以更好地实现持续集成的目标。
本篇以jekins为基础,然后集成docker,对微服务项目进行打包构建,并做成镜像,推送镜像仓库,最后由可视化工具或其他方式对构建的镜像统一运维管理。整体的流程如下:
搭建上述的部署流程,预计需要至少3台机器(推荐),可以结合自身的情况酌情选择
服务器 | 配置(推荐) | 作用 | 备注 |
192.168.1.11 | 2C8G | 部署jenkins | jenkins比较吃资源,需要安装较多的插件,建议宽带不要太低 |
192.168.1.12 | 2C2G | 部署gitlab | 代码仓库,一般来说企业为了保护代码的安全,会自建代码仓库 |
192.168.1.12 | 2C4G | 部署容器管理平台 | jenkins最后构建出来的包要做出镜像需要推送到镜像仓库 |
yum install -y yum-utils device-mapper-persistent-data lvm2
加速镜像的下载
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum -y install docker-ce-20.10.10-3.el7
检查下docker版本
使用下面的命令启动docker
systemctl start docker
查看docker的启动状态
systemctl status docker
因为后面安装jenkins并配置插件的时候,可以基于jenkins自身进行自动安装,当然,可以在jenkins服务器上安装maven,然后再在jenkins上进行引用也可以。
这里选择3.6.3的版本
wget https://archive.apache.org/dist/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz
如果是直接在服务器上进行下载,可以跳过上传这一步直接解压
tar -zxvf apache-maven-3.6.3-bin.tar.gz
- mkdir repo
- cd apache-maven-3.6.3
- cd conf
- cp settings.xml settings.xml.bk
将下面的配置文件拷贝到setting.xml中
- <localRepository>/usr/local/soft/mvn/repo</localRepository>
-
- #使用阿里镜像下载
- <mirror>
- <id>alimaven</id>
- <name>aliyun maven</name>
- <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
- <mirrorOf>central</mirrorOf>
- </mirror>
- #改环境变量
- vi /etc/profile
-
- #复制下面三行到最下面(路径要根据自己情况改)
- #maven
- export MAVEN_HOME=/usr/local/soft/mvn/apache-maven-3.6.3
- export PATH=$PATH:$MAVEN_HOME/bin
-
- #保存退出,然后重载配置
- source /etc/profile
- #查看
- mvn -v
-
- #检查
- mvn -version
搭建jenkins目前主要有两种方式,可以通过docker安装,也可以通过yum或源码包的方式安装,为了减少后面的踩坑和各种插件安装失败的问题,建议使用yum或源码包的方式安装,这里将两种安装方式都贴出来,方便学习和参考。
mkdir -p /usr/local/docker/jenkins
使用下面的命令启动jenkins容器
- docker run -d \
- -u root \
- --name docker_jenkins \
- -p 9302:8080 \
- -v /usr/local/docker/jenkins:/var/jenkins_home \
- -v /var/run/docker.sock:/var/run/docker.sock \
- -v /usr/bin/docker:/usr/bin/docker \
- jenkins/jenkins:2.319.3-lts-jdk11
参数说明:
-u root,使用root用户运行容器;
--name docker_jenkins,jenkins的容器命名,方便后续查找;
-p 9302:8080,主机的9302端口映射容器的8080端口,浏览器可以通过9302访问;
-v /usr/local/docker/jenkins:/var/jenkins_home
将左边宿主机的目录映射为容器的 /var/jenkins_home 目录,即数据的本地持久化;
-v /var/run/docker.sock:/var/run/docker.sock \ 与 -v /usr/bin/docker:/usr/bin/docker \
把宿主机上面的docker.sock文件映射在容器中docker.sock文件,这么做目的是为了方便容器中的jenkins可以与主机中的docker进行通讯;
jenkins/jenkins:2.319.3-lts-jdk11,指定使用哪一个镜像源,指定标签和版本信息;
第一次运行,下载镜像会比较慢
后面需要在jenkins上面安装各种插件,如果不配置加速地址,将会从远程下载安装比较慢,建议配置一下。修改宿主机 Jenkins 工作目录下的hudson.model.UpdateCenter.xml
文件。
vi /var/jenkins_home/hudson.model.UpdateCenter.xml
原始内容如下:
URL修改为国内清华大学的官方镜像地址,内容如下:
- <?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
jenkins的运行需要依赖java环境,因此需要安装一下java环境
基于yum安装jdk
sudo yum install -y fontconfig java-11-openjdk
查看jdk安装位置
- vim /etc/profile
-
- #在文件最后添加
- export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-11.0.20.0.8-1.el7_9.x86_64
- export PATH=$PATH:$JAVA_HOME/bin
-
- #立即生效文件
- source /etc/profile
-
- #检查是否配置成功
- echo $JAVA_HOME
yum install git
- sudo yum upgrade
-
- sudo yum install -y ca-certificates
-
- sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo
-
- sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io-2023.key
-
- sudo yum install -y jenkins
过程截图
vi /usr/lib/systemd/system/jenkins.service
修改User和Group为root
修改端口号为9302(可以改为其他任何端口)
- sudo systemctl start jenkins
-
- # 开机就启动jenkins
- sudo systemctl enable jenkins
紧接着上面的操作,jenkins服务启动之后,访问地址 http://IP:9302/(自行替换IP),看到如下界面
找到/var/lib/jenkins/secrets/initialAdminPassword 路径下的密码
cat /var/lib/jenkins/secrets/initialAdminPassword
选择安装推荐的插件
等待插件安装完成(这个过程可能有点漫长,根据你的网速)
创建管理员账户
注意保管好这个账户和登录密码,否则后面找回密码比较麻烦
使用jenkins进行持续集成,可以说就是熟练掌握jenkins的各种配置的过程。根据你的需求场景,需要做不同的配置,这里以java为例进行基础环境的配置以及相关插件的安装。
maven是java微服务项目的打包构建工具,参照下面的步骤进行配置
进入配置工具界面
点击新增 Maven
配置Maven版本,选择3.6.3版本,并点击保存。
上面保存maven的配置之后,在jenkins的目录下,会找到maven的文件目录
找到下面的配置镜像的标签,改为阿里云的镜像仓库地址
- <mirror>
- <id>alimaven</id>
- <name>aliyun maven</name>
- <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
- <mirrorOf>central</mirrorOf>
- </mirror>
修改完成后,建议重启下jenkins
sudo systemctl restart jenkins
只需要执行yum命令安装即可
yum install git
这里暂时只配置后面打包构建使用的几个必备的插件,点击插件管理
安装 docker 插件
等待安装完成
安装maven插件
安装之后重启Jenkins
sudo systemctl stop jenkins
sudo systemctl start jenkins
点击 凭证管理 按钮
点击 全局 按钮
点击 add credentials 按钮
输入你的gitee的账号和密码,点击创建按钮。
本地快速搭建一个springboot工程,核心依赖如下
- <?xml version="1.0" encoding="UTF-8"?>
- <project xmlns="http://maven.apache.org/POM/4.0.0"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
- <modelVersion>4.0.0</modelVersion>
-
- <groupId>com.congge</groupId>
- <artifactId>boot-docker</artifactId>
- <version>1.0-SNAPSHOT</version>
-
- <parent>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-parent</artifactId>
- <version>2.5.5</version>
- <relativePath/> <!-- lookup parent from repository -->
- </parent>
-
- <properties>
- <docker.image.prefix>dcloud</docker.image.prefix>
- </properties>
-
- <dependencies>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-web</artifactId>
- </dependency>
-
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-test</artifactId>
- <scope>test</scope>
- </dependency>
-
- </dependencies>
-
- <build>
- <finalName>boot-docker</finalName>
- <plugins>
- <plugin>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-maven-plugin</artifactId>
- <executions>
- <execution>
- <goals>
- <goal>repackage</goal>
- </goals>
- </execution>
- </executions>
- <configuration>
- <fork>true</fork>
- <addResources>true</addResources>
- </configuration>
- </plugin>
-
- <!-- <plugin>
- <groupId>com.spotify</groupId>
- <artifactId>dockerfile-maven-plugin</artifactId>
- <version>1.4.10</version>
- <configuration>
- <repository>${docker.image.prefix}/${project.artifactId}</repository>
- <buildArgs>
- <JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE>
- </buildArgs>
- </configuration>
- </plugin>-->
- </plugins>
- </build>
-
- </project>
在项目的根目录下,提供一个Dockerfile文件,内容如下:
- FROM java:8
- ADD target/boot-docker.jar boot-docker.jar
- ENTRYPOINT ["java","-jar","/boot-docker.jar"]
由于比较简单,这里就不再过多赘述了,工程中提供一个如下的测试接口
- @RestController
- public class TestController {
-
- //localhost:8088/test
- @GetMapping("/test")
- public String test(){
- return "test";
- }
- }
工程启动之后,访问测试一下
参照如下步骤,登录之后,创建一个空的gitee仓库
idea安装gitee插件
创建本地git仓库
右键项目文件–>Git–>Add
选中项目,鼠标右键项目目录,点击”Git—>Commit Directory”
最后选中项目右键直接提交,此时会弹出一个需要输入你的gitee远程仓库地址,然后输入你的账户和密码即可,当然也可以首先检出远程仓库地址
最后push即可
上述所做的一切都是为了创建jenkins任务做准备的,接下来基于上面的配置,我们将创建一个jenkins任务展现完整的springboot项目从拉取代码到构建部署的完整流程。
配置Gitee代码地址和凭证
配置 Pre Steps
这里简单执行以下maven的打包安装命令即可,然后再在任务列表中就可以看到这个任务,点击执行
在build的高级选项这里,建议自定义构建的文件目录,方便后续查找项目构建后的包的位置
基本上这几步就完成了
任务执行后,从gitee上面拉代码之后,进行install 命令时,由于需要从maven中央仓库拉代码,需要耗费很长时间,因此需要修改maven的镜像仓库地址,找到上述jenkins中配置的maven配置文件,修改下setting.xml文件中的镜像地址(这个在上已经完成)
等待执行完成即可
最后在构建完成的产物中,进入到工程的target目录下,可以看到构建完成的jar包,这是一个springboot工程构建出来的jar,因此可以直接运行和访问
再次确认springboot工程中的dockerfile文件
- FROM java:8
- ADD target/boot-docker.jar boot-docker.jar
- ENTRYPOINT ["java","-jar","/boot-docker.jar"]
在上述构建完成之后的工程目录结构下,可以看到一个Dockerfile文件,即我们在springboot工程中编写的dockerfile
其他的配置保持不变,需要修改的位置如下
Post Steps编写使用Dockerfile构建镜像的脚本
再次执行任务,运行成功成功之后
通过docker命令,可以看到镜像已经成功构建出来
基于当前的docker镜像,后面可以在当前服务器直接启动,也可以在jenkins中执行命令将镜像推送到其他的镜像仓库进行后续使用。
本文通过较大的篇幅详细介绍了可持续集成的相关理论和常用的解决方案,同时通过实际操作演示了jenkins的搭建配置全过程,最后通过jenkins配置任务的形式集成springboot进行可持续集成的过程,后续将会以此为基础,进一步深入介绍与镜像仓库的整合使用,从而完成一个更加完整的全生命周期的集成过程,本篇到此结束感谢观看。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。