目录
一、前言
二、微服务带来的挑战
2.1 微服务有哪些问题
2.2微服务给运维带来的挑战
三、可持续集成与交付概述
3.1可持续集成与交付概念
3.1.1持续集成
3.1.2持续交付
3.1.3 可持续集成与交付核心理念
3.2 可持续集成优点
3.3微服务为什么需要可持续集成
四、可持续集成方案
4.1 可持续集成常用工具
4.2常用可持续集成方案
4.3jenkins介绍
五、环境准备
5.1 部署架构与流程
5.2服务器准备
5.3搭建docker环境
5.3.1安装yml
5.3.2 设置阿里云镜像仓库
5.3.3安装docker
5.3.4启动docker
5.4安装maven(非必须)
5.4.1下载maven
5.4.2上传并解压
5.4.3配置仓库地址和镜像
5.4.4配置环境变量
5.4.5验证maven是否配置成功
六、安装jenkins
6.2 docker安装
6.2.1 创建持久化目录
6.2.2运行jenkins容器
6.2.3配置jenkins镜像加速
6.3使用yum 安装jenkins
6.3.1 安装jdk
6.3.2设置java环境变量
6.3.3 安装git
6.3.4配置yum源以及安装jenkins
6.3.5修改Jenkins配置文件
6.3.6启动jenkins服务
6.4 jenkins初始化配置
七、jenkins配置
7.1 配置maven
7.1.1 修改maven的镜像地址
7.2配置git
7.3配置jenkins插件
7.4 配置Gitee访问凭证
八、搭建springboot工程并推送gitee
8.1 搭建springboot工程
8.2gitee创建一个仓库
8.3 将本地工程推送至gitee
九、配置jenkins任务
9.1 创建Maven类型的项目任务
9.2构建docker镜像
9.2.1 编写Dockerfile文件
9.2.2修改jenkins任务脚本
9.2.3 再次运行任务
十、写在文末
一、前言
微服务开发模式已经成为当下java主流,微服务在给团队开发协作带来便利,也给项目快速交付提供高效支撑的同时,也给服务的部署、运维等工作提出了更高的要求。可持续集成(CI/CD)的实践,让繁杂的部署运维工作以高效的方式进行协作,本篇将详细介绍可持续集成环境的搭建。
二、微服务带来的挑战
2.1 微服务有哪些问题
尽管微服务架构有许多优点,如灵活性、可伸缩性和独立部署等,但也存在一些缺点,包括:
-
复杂性增加
- 微服务架构中涉及多个小型服务,会增加系统整体的复杂性,包括服务间通信、数据一致性、服务发现等方面
-
运维成本增加
- 由于涉及多个服务,运维和监控工作量会增加,需要更多的人力和资源来管理各个服务的部署、运行和监控
-
分布式系统挑战
- 微服务架构是一种分布式系统设计,需要解决分布式事务、服务发现、负载均衡等问题,增加了开发和维护的难度
-
服务间通信开销
- 微服务之间通过网络进行通信,可能导致网络延迟和通信开销增加,影响系统的性能和响应速度
-
数据管理困难
- 微服务架构中每个服务都有自己的数据库存储,可能导致数据管理和一致性维护方面的困难,需要额外的工作来处理数据同步和一致性问题
-
安全性挑战
- 由于涉及多个服务,微服务架构面临更多的安全风险,需要加强对服务间通信、身份验证、权限控制等方面的安全防护
2.2微服务给运维带来的挑战
除了微服务自身的一些挑战,还有一个不可忽视的要素,那就是给后续的运维带来的一系列挑战,具体来说,主要包括下面几点:
-
运维复杂性增加
- 微服务架构中涉及多个独立的服务单元,每个服务都需要独立部署、监控和维护,增加了整体系统的复杂性
-
部署和版本控制
- 由于涉及多个服务,需要进行频繁的部署和版本控制,可能导致部署过程复杂、耗时增加
-
监控与故障排查难度增加
- 微服务架构下的服务数量庞大,需要更加细致的监控和日志记录,以便快速发现问题并进行故障排查
-
负载均衡与容错机制
- 在微服务架构中,需要考虑服务间的负载均衡和容错机制,确保各个服务能够稳定运行
-
安全管理要求增加
- 由于涉及多个服务之间的通信,安全管理方面面临更多挑战,需要加强对服务间通信、身份验证、权限控制等方面的安全防护
-
持续集成与交付
- 微服务架构需要频繁进行持续集成和交付,确保各个服务的版本兼容性和稳定性,运维团队需要搭建自动化的CI/CD流程
-
容量规划与扩展性
- 微服务架构下,需要灵活地进行容量规划和扩展,根据业务需求和流量变化来调整服务的数量和规模
综上所述,微服务架构的实施给运维团队带来了一些挑战,需要团队具备更多的技术和管理能力来应对这些挑战,确保系统的稳定性和可靠性
三、可持续集成与交付概述
3.1可持续集成与交付概念
在当今快节奏的软件开发环境中,持续集成(Continuous Integration)和持续交付(Continuous Delivery)已经成为构建高效软件交付流程的关键组成部分。这两个实践不仅提高了团队的效率,还能够确保软件质量、加速交付并降低风险。
3.1.1持续集成
持续集成是一种实践,开发者在频繁的将代码集成到代码仓库中,就可以对代码进行自动构建、部署,以便尽早地发现和解决集成问题。持续集成旨在减少集成问题的积累,确保代码在集成到主干分支之前是稳定和可靠的。
3.1.2持续交付
持续交付是在持续集成的基础上进一步发展的实践。它强调自动化的部署流程,使得每次代码更改都可以自动部署到生产环境中,从而实现频繁的软件交付。持续交付能够将新功能、修复和改进快速地交付到用户手中,同时降低发布过程中的风险。
3.1.3 可持续集成与交付核心理念
可持续集成(Continuous Integration,CI)是一种软件开发实践,旨在通过将团队成员的代码频繁集成到共享存储库中,并自动进行构建和测试,以确保软件质量、减少集成问题、提高开发效率。可持续集成的核心理念包括:
-
频繁集成:团队成员每天将代码提交到共享存储库,确保代码库保持最新状态。
-
自动化构建:每次代码提交后,自动触发构建流程,包括编译、打包等操作,生成可执行的软件。
-
自动化测试:自动运行各种测试,包括单元测试、集成测试、功能测试等,快速发现问题并及时修复。
-
及时反馈:及时向开发人员反馈构建和测试结果,帮助他们尽早发现和解决问题。
通过可持续集成,团队能够减少集成问题、提高软服务器托管件质量、加快交付速度,促进团队协作和沟通。这种持续集成的方式可以让开发团队更快速地交付高质量的软件产品,从而提升整体开发效率和质量水平。
3.2 可持续集成优点
了解了微服务的痛点之后,可持续集成的优势是很明显的,主要包括:
-
快速发现问题
- 通过频繁地集成、构建和测试代码,可以更早地发现和解决问题,减少错误在后续阶段的修复成本。
-
提高软件质量
- 持续集成能够确保每次集成都是可运行的,通过自动化测试和代码检查等手段,有助于提高软件质量。
-
减少集成风险
- 定期进行集成和测试可以降低集成风险,避免长时间分支导致的集成问题,保证代码库的稳定性。
-
加速交付周期
- 持续集成可以实现快速、频繁地发布软件,并促进持续交付,加速新功能和改进的上线速度。
-
增强团队合作
- 通过持续集成,团队成员可以及时分享代码变更和解决方案,促进团队协作和沟通,提高工作效率。
-
自动化流程
- 持续集成倡导自动化构建、测试和部署流程,减少人工干预,提高生产力和效率。
-
追踪项目进度
- 持续集成工具可以记录每次集成的结果和日志,帮助团队追踪项目进度和代码变更历史。
3.3微服务为什么需要可持续集成
微服务架构是一种分布式系统设计方法,将整个应用拆分为小而自治的服务单元,每个服务都可以独立开发、部署和运行。在微服务架构中,由于服务之间的相互依赖性较强,因此需要对每个微服务进行持续集成,以确保整个系统的稳定性和可靠性。以下是微服务需要可持续集成的主要原因:
-
快速迭代:微服务架构下,每个服务都可以独立开发和部署,因此需要频繁地进行集成和测试,以实现快速的迭代和发布。
-
复杂度管理:微服务架构中可能涉及多个不同的服务和团队协作,通过持续集成可以帮助管理复杂度,确保各个服务能够正常协同工作。
-
隔离风险:微服务架构下,一个服务的变更可能会影响到其他服务,通过持续集成可以及时发现问题并减少风险。
-
自动化测试:微服务架构通常涉及多个服务之间的交互,通过自动化测试可以确保各个服务的功能和接口都正常工作。
-
系统完整性:通过持续集成可以确保每次集成都是可运行的,保证系统的完整性和稳定性。
综上所述,微服务架构下的可持续集成是确保系统稳定性、可靠性和高效性的重要手段,有助于团队更好地管理和发展微服务应用。
四、可持续集成方案
经过多年的行业经验的沉淀和发展,业内也逐渐形成了一些比较成熟的解决方案,下面列举一些常用的可持续集成方案。
4.1 可持续集成常用工具
一些常用的可持续集成工具包括:
-
Jenkins:是一个开源的持续集成工具,可以实现自动化构建、测试和部署流程,支持丰富的插件和扩展功能。
-
GitLab CI/CD:与GitLab版本控制系统集成,提供完整的CI/CD功能,支持自动化构建、测试、部署等操作。
-
CircleCI:是一个基于云的持续集成平台,提供简单易用的CI/CD功能,支持多种编程语言和环境。
-
Travis CI:也是一个基于云的持续集成平台,支持GitHub等版本控制系统,能够快速配置和运行持续集成任务。
-
TeamCity:是JetBrains开发的持续集成工具,支持多种项目类型和构建环境,具有灵活的配置和定制能力。
-
Bamboo:是Atlassian公司的持续集成工具,与Jira等软件开发工具集成紧密,提供全面的CI/CD功能。
-
GoCD:是ThoughtWorks开发的持续交付工具,支持复杂的CI/CD管道配置和多阶段流水线。
以上是一些常见的可持续集成工具,团队可以根据自身需求和项目特点选择适合的工具来实现持续集成和持续交付。每个工具都有其特点和优势,可以根据具体情况进行评估和选择。
4.2常用可持续集成方案
一些常见的可持续集成解决方案包括:
-
自建方案
-
团队可以自行搭建持续集成环境,使用开源工具如Jenkins、GitLab CI等,根据项目需求和规模定制化配置持续集成流程。
-
-
云端托管服务
-
一些云服务提供商如AWS CodePipeline、Azure DevOps、Google Cloud Build等提供了托管的持续集成解决方案,能够快速搭建并管理持续集成流程。
-
-
集成开发平台
-
一些集成开发平台如GitHub Actions、GitLab CI/CD等提供了集成的CI/CD功能,能够与代码仓库无缝集成,简化持续集成流程。
-
-
企业级解决方案
-
一些企业级的持续集成解决方案如TeamCity、Bamboo等提供了更加完善和复杂的持续集成功能,适用于大型企业项目。
-
-
容器化解决方案
-
使用容器技术如Docker、Kubernetes等构建持续集成环境,能够实现快速部署、灵活扩展和环境隔离。
-
-
专业的持续集成服务提供商
-
一些专业的持续集成服务提供商如CircleCI、Travis CI等提供了稳定、可靠的持续集成解决方案,支持多种项目类型和编程语言。
-
以上是一些常见的可持续集成解决方案,团队可以根据自身的需求、技术栈和预算选择合适的方案来实现持续集成,提高软件开发效率和质量。
4.3jenkins介绍
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的使用,团队可以更好地实现持续集成的目标。
五、环境准备
5.1 部署架构与流程
本篇以jekins为基础,然后集成docker,对微服务项目进行打包构建,并做成镜像,推送镜像仓库,最后由可视化工具或其他方式对构建的镜像统一运维管理。整体的流程如下:
5.2服务器准备
搭建上述的部署流程,预计需要至少3台机器(推荐),可以结合自身的情况酌情选择
服务器 | 配置(推荐) | 作用 | 备注 |
192.168.1.11 | 2C8G | 部署jenkins | jenkins比较吃资源,需要安装较多的插件,建议宽带不要太低 |
192.168.1.12 | 2C2G | 部署gitlab | 代码仓库,一般来说企业为了保护代码的安全,会自建代码仓库 |
192.168.1.12 | 2C4G | 部署容器管理平台 | jenkins最后构建出来的包要做出镜像需要推送到镜像仓库 |
5.3搭建docker环境
5.3.1安装yml
yum install -y yum-utils device-mapper-persistent-data lvm2
5.3.2 设置阿里云镜像仓库
加速镜像的下载
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
5.3.3安装docker
yum -y install docker-ce-20.10.10-3.el7
检查下docker版本
5.3.4启动docker
使用下面的命令启动docker
systemctl start docker
查看docker的启动状态
systemctl status docker
5.4安装maven(非必须)
因为后面安装jenkins并配置插件的时候,可以基于jenkins自身进行自动安装,当然,可以在jenkins服务器上安装maven,然后再在jenkins上进行引用也可以。
5.4.1下载maven
这里选择3.6.3的版本
wget https://archive.apache.org/dist/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz
5.4.2上传并解压
如果是直接在服务器上进行下载,可以跳过上传这一步直接解压
tar -zxvf apache-maven-3.6.3-bin.tar.gz
5.4.3配置仓库地址和镜像
mkdir repo
cd apache-maven-3.6.3
cd conf
cp settings.xml settings.xml.bk
将下面的配置文件拷贝到setting.xml中
/usr/local/soft/mvn/repo
#使用阿里镜像下载
alimaven
aliyun maven
http://maven.aliyun.com/nexus/content/groups/public/
central
5.4.4配置环境变量
#改环境变量
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
5.4.5验证maven是否配置成功
#查看
mvn -v
#检查
mvn -version
六、安装jenkins
搭建jenkins目前主要有两种方式,可以通过docker安装,也可以通过yum或源码包的方式安装,为了减少后面的踩坑和各种插件安装失败的问题,建议使用yum或源码包的方式安装,这里将两种安装方式都贴出来,方便学习和参考。
6.2 docker安装
6.2.1 创建持久化目录
mkdir -p /usr/local/docker/jenkins
6.2.2运行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,指定使用哪一个镜像源,指定标签和版本信息;
第一次运行,下载镜像会比较慢
6.2.3配置jenkins镜像加速
后面需要在jenkins上面安装各种插件,如果不配置加速地址,将会从远程下载安装比较慢,建议配置一下。修改宿主机 Jenkins 工作目录下的hudson.model.UpdateCenter.xml
文件。
vi /var/jenkins_home/hudson.model.UpdateCenter.xml
原始内容如下:
URL修改为国内清华大学的官方镜像地址,内容如下:
default
https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
修改完成后,重启jenkins
6.3使用yum 安装jenkins
jenkins的运行需要依赖java环境,因此需要安装一下java环境
6.3.1 安装jdk
基于yum安装jdk
sudo yum install -y fontconfig java-11-openjdk
查看jdk安装位置
6.3.2设置java环境变量
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
6.3.3 安装git
yum install git
6.3.4配置yum源以及安装jenkins
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
过程截图
6.3.5修改Jenkins配置文件
vi /usr/lib/systemd/system/jenkins.service
修改User和Group为root
修改端口号为9302(可以改为其他任何端口)
6.3.6启动jenkins服务
sudo systemctl start jenkins
# 开机就启动jenkins
sudo systemctl enable jenkins
6.4 jenkins初始化配置
紧接着上面的操作,jenkins服务启动之后,访问地址 http://IP:9302/(自行替换IP),看到如下界面
找到/var/lib/jenkins/secrets/initialAdminPassword 路径下的密码
cat /var/lib/jenkins/secrets/initialAdminPassword
选择安装推荐的插件
等待插件安装完成(这个过程可能有点漫长,根据你的网速)
创建管理员账户
注意保管好这个账户和登录密码,否则后面找回密码比较麻烦
七、jenkins配置
使用jenkins进行持续集成,可以说就是熟练掌握jenkins的各种配置的过程。根据你的需求场景,需要做不同的配置,这里以java为例进行基础环境的配置以及相关插件的安装。
7.1 配置maven
maven是java微服务项目的打包构建工具,参照下面的步骤进行配置
进入配置工具界面
点击新增 Maven
配置Maven版本,选择3.6.3版本,并点击保存。
7.1.1 修改maven的镜像地址
上面保存maven的配置之后,在jenkins的目录下,会找到maven的文件目录
找到下面的配置镜像的标签,改为阿里云的镜像仓库地址
alimaven
aliyun maven
http://maven.aliyun.com/nexus/content/groups/public/
central
修改完成后,建议重启下jenkins
sudo systemctl restart jenkins
7.2配置git
只需要执行yum命令安装即可
yum install git
7.3配置jenkins插件
这里暂时只配置后面打包构建使用的几个必备的插件,点击插件管理
安装 docker 插件
等待安装完成
安装maven插件
安装之后重启Jenkins
sudo systemctl stop jenkins
sudo systemctl start jenkins
7.4 配置Gitee访问凭证
点击 凭证管理 按钮
点击 全局 按钮
点击 add credentials 按钮
输入你的gitee的账号和密码,点击创建按钮。
八、搭建springboot工程并推送gitee
8.1 搭建springboot工程
本地快速搭建一个springboot工程,核心依赖如下
4.0.0
com.congge
boot-docker
1.0-SNAPSHOT
org.springframework.boot
spring-boot-starter-parent
2.5.5
dcloud
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-test
test
boot-docker
org.springframework.boot
spring-boot-maven-plugin
repackage
true
true
在项目的根目录下,提供一个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
@G服务器托管etMapping("/test")
public String test(){
return "test";
}
}
工程启动之后,访问测试一下
8.2gitee创建一个仓库
参照如下步骤,登录之后,创建一个空的gitee仓库
8.3 将本地工程推送至gitee
idea安装gitee插件
创建本地git仓库
右键项目文件–>Git–>Add
选中项目,鼠标右键项目目录,点击”Git—>Commit Directory”
最后选中项目右键直接提交,此时会弹出一个需要输入你的gitee远程仓库地址,然后输入你的账户和密码即可,当然也可以首先检出远程仓库地址
最后push即可
九、配置jenkins任务
上述所做的一切都是为了创建jenkins任务做准备的,接下来基于上面的配置,我们将创建一个jenkins任务展现完整的springboot项目从拉取代码到构建部署的完整流程。
9.1 创建Maven类型的项目任务
配置Gitee代码地址和凭证
配置 Pre Steps
这里简单执行以下maven的打包安装命令即可,然后再在任务列表中就可以看到这个任务,点击执行
在build的高级选项这里,建议自定义构建的文件目录,方便后续查找项目构建后的包的位置
基本上这几步就完成了
任务执行后,从gitee上面拉代码之后,进行install 命令时,由于需要从maven中央仓库拉代码,需要耗费很长时间,因此需要修改maven的镜像仓库地址,找到上述jenkins中配置的maven配置文件,修改下setting.xml文件中的镜像地址(这个在上已经完成)
等待执行完成即可
最后在构建完成的产物中,进入到工程的target目录下,可以看到构建完成的jar包,这是一个springboot工程构建出来的jar,因此可以直接运行和访问
9.2构建docker镜像
9.2.1 编写Dockerfile文件
再次确认springboot工程中的dockerfile文件
FROM java:8
ADD target/boot-docker.jar boot-docker.jar
ENTRYPOINT ["java","-jar","/boot-docker.jar"]
在上述构建完成之后的工程目录结构下,可以看到一个Dockerfile文件,即我们在springboot工程中编写的dockerfile
9.2.2修改jenkins任务脚本
其他的配置保持不变,需要修改的位置如下
Post Steps编写使用Dockerfile构建镜像的脚本
9.2.3 再次运行任务
再次执行任务,运行成功成功之后
通过docker命令,可以看到镜像已经成功构建出来
基于当前的docker镜像,后面可以在当前服务器直接启动,也可以在jenkins中执行命令将镜像推送到其他的镜像仓库进行后续使用。
十、写在文末
本文通过较大的篇幅详细介绍了可持续集成的相关理论和常用的解决方案,同时通过实际操作演示了jenkins的搭建配置全过程,最后通过jenkins配置任务的形式集成springboot进行可持续集成的过程,后续将会以此为基础,进一步深入介绍与镜像仓库的整合使用,从而完成一个更加完整的全生命周期的集成过程,本篇到此结束感谢观看。
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net