目标:
软件开发生命周期又叫做SDLC(Software Development Life Cycle),它是集合了计划、开发、测试和部署过程的集合。如下图所示 :
这是生命周期的第一阶段,根据项目需求,团队执行一个可行性计划的分析。项目需求可能是公司内部或者客户提出的。这阶段主要是对信息的收集,也有可能是对现有项目的改善和重新做一个新的项目。还要分析项目的预算多长,可以从哪方面受益及布局,这也是项目创建的目标。
第二阶段就是设计阶段,系统架构和满意状态(就是要做成什么样子,有什么功能),和创建一个项目计划。计划可以使用图表,布局设计或者文字的方式呈现。
第三阶段就是实现阶段,项目经理创建和分配工作给开者,开发者根据任务和在设计阶段定义的目标进行开发代码。依据项目的大小和复杂程度,可以需要数月或更长时间才能完成。
测试人员进行代码测试 ,包括功能测试、代码测试、压力测试等。
最后进阶段就是对产品不断的进化改进和维护阶段,根据用户的使用情况,可能需要对某功能进行修改,bug修复,功能增加等。
项目立项前:
项目立项后:
开发,联调测试,测试,上线
瀑布模型是最著名和最常使用的软件开发模型。瀑布模型就是一系列的软件开发过程。它是由制造业繁衍出来的。一个高度化的结构流程在一个方向上流动,有点像生产线一样。在瀑布模型创建之初,没有其它开发的模型,有很多东西全靠开发人员去猜测,去开发。这样的模型仅适用于那些简单的软件开发(传统项目), 但是已经不适合现在的开发了。
下图对软件开发模型的一个阐述。
优势 | 劣势 |
---|---|
简单易用和理解 | 各个阶段的划分完全固定,阶段之间产生大量的文档,极大地增加了工作量。 |
当前一阶段完成后,您只需要去关注后续阶段。 | 由于开发模型是线性的,用户只有等到整个过程的末期才能见到开发成果,从而增加了开发风险。 |
为项目提供了按阶段划分的检查节点 | 瀑布模型的突出缺点是不适应用户需求的变化。 |
敏捷开发(Agile Development) 的核心是迭代开发(Iterative Development) 与 增量开发(Incremental Development)。
对于大型软件项目,传统的开发方式是采用一个大周期(比如一年)进行开发,整个过程就是一次"大开发";迭代开发的方式则不一样,它将开发过程拆分成多个小周期,即一次"大开发"变成多次"小开发",每次小开发都是同样的流程,所以看上去就好像重复在做同样的步骤。
举例来说,SpaceX 公司想造一个大推力火箭,将人类送到火星。但是,它不是一开始就造大火箭,而是先造一个最简陋的小火箭 Falcon 1。结果,第一次发射就爆炸了,直到第四次发射,才成功进入轨道。然后,开发了中型火箭 Falcon 9,九年中发射了70次。最后,才开发 Falcon 重型火箭。如果SpaceX 不采用迭代开发,它可能直到现在还无法上天。
软件的每个版本,都会新增一个用户可以感知的完整功能。也就是说,按照新增功能来划分迭代。
举例来说,房产公司开发一个10栋楼的小区。如果采用增量开发的模式,该公司第一个迭代就是交付一号楼,第二个迭代交付二号楼......每个迭代都是完成一栋完整的楼。而不是第一个迭代挖好10栋楼的地基,第二个迭代建好每栋楼的骨架,第三个迭代架设屋顶......
虽然敏捷开发将软件开发分成多个迭代,但是也要求,每次迭代都是一个完整的软件开发周期,必须按照软件工程的方法论,进行正规的流程管理。
敏捷开发有什么好处?
敏捷开发的第一个好处,就是早期交付,从而大大降低成本。 还是以上一节的房产公司为例,如果按照传统的"瀑布开发模式",先挖10栋楼的地基、再盖骨架、然后架设屋顶,每个阶段都等到前一个阶段完成后开始,可能需要两年才能一次性交付10栋楼。也就是说,如果不考虑预售,该项目必须等到两年后才能回款。 敏捷开发是六个月后交付一号楼,后面每两个月交付一栋楼。因此,半年就能回款10%,后面每个月都会有现金流,资金压力就大大减轻了。
敏捷开发的第二个好处是,及时了解市场需求,降低产品不适用的风险。 请想一想,哪一种情况损失比较小:10栋楼都造好以后,才发现卖不出去,还是造好第一栋楼,就发现卖不出去,从而改进或停建后面9栋楼?
持续集成( Continuous integration , 简称 CI )指的是,频繁地(一天多次)将代码集成到主干,编码->构建-》集成--》测试-》交付---》》部署。
持续集成的组成要素
一个自动构建过程, 从检出代码、 编译构建、 运行测试、 结果记录、 测试统计等都是自动完成的, 无需人工干预。
一个代码存储库,即需要版本控制软件来保障代码的可维护性,同时作为构建过程的素材库,一般使用SVN或Git。
一个持续集成服务器, Jenkins 就是一个配置简单和使用方便的持续集成服务器。
1、降低风险,由于持续集成不断去构建,编译和测试,可以很早期发现问题,所以修复的代价就少; 2、对系统健康持续检查,减少发布风险带来的问题; 3、减少重复性工作; 4、持续部署,提供可部署单元包; 5、持续交付可供使用的版本; 6、增强团队信心;
gmall-gateway
执行jar包,发现错误原因:在需要部署运行springboot项目中缺少springbootmaven打包插件
解决:在gmall-gateway
、gmall-service
这两个模块中增加插件
<build>
<finalName>app</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
再次执行install安装,在本地进行测试,出现以下错误
java -Dfile.encoding=utf-8 -jar gmall-gateway-1.0.jar
将测试过jar包上传到linux服务器
后台采用守护进程启动springboot应用
Jenkins 是一款流行的开源持续集成(Continuous Integration)工具,广泛用于项目开发,具有自动化构建、测试和部署等功能。官网: http://jenkins-ci.org/。
Jenkins的特征:
Jenkins安装和持续集成环境配置
1 )首先,开发人员每天进行代码提交,提交到Git仓库
2)然后,Jenkins作为持续集成工具,使用Git工具到Git仓库拉取代码到集成服务器,再配合JDK,Maven等软件完成代码编译,代码测试与审查,测试,打包等工作,在这个过程中每一步出错,都重新再执行一次整个流程。
3)最后,Jenkins把生成的jar或war包分发到测试服务器或者生产服务器,测试人员或用户就可以访问应用。
给启动脚本权限
chmod 777 start.sh
执行启动脚本启动jenkins服务
./start.sh
管理后台初始化设置 http://192.168.200.128:9090/
看图如图页面:
需要输入管理密码, 在以下位置查看:
cat /root/.jenkins/secrets/initialAdminPassword
如图:
把14ff0f85aa
复制到页面的输入框,点击右下角的继续
选择推荐安装插件设置,把建议的插件都安装上
这一步等待时间较长, 如果安装插件失败,修改Jenkins插件源
安装完成之后, 创建管理员用户:
用户名/密码:atguigu/123456
配置访问地址:
配置完成之后, 会进行重启, 之后可以看到管理后台:
在实现持续集成之前, 需要确保以下插件安装成功。
安装方法:
进入【系统管理(Manage Jenkins)】-【插件管理(Manage Plugins)】
点击标签页的【可选插件】
在过滤框中搜索插件名称
方式一:yum 安装方式git
yum -y install git
如果之前有安装旧版本, 先做卸载, 没有安装则忽略
yum remove git
检查git版本
[root@localhost jenkins]# git version
git version 1.8.3.1
下载地址: https://maven.apache.org/download.cgi(资料里有)
mkdir /opt/soft
将资料里apache-maven-3.6.3-bin.tar.gz上传到soft目录下
解压安装包
cd /opt/soft
tar -zvxf apache-maven-3.6.3-bin.tar.gz
配置
环境变量配置
vi /etc/profile
增加以下配置
export MAVEN_HOME=/opt/soft/apache-maven-3.6.3
export PATH=$PATH:$MAVEN_HOME/bin
如果权限不够,则需要增加当前目录的权限
chmod 777 /opt/soft/apache-maven-3.6.3/bin/
刷新配置
source /etc/profile
查看maven
mvn -v
可以看到输出内容
创建maven本地仓库文件夹
mkdir /opt/soft/apache-maven-3.6.3/repository
需要对这个目录设置权限
chmod 777 /opt/soft/apache-maven-3.6.3/repository
修改镜像仓库配置:
vi /opt/soft/apache-maven-3.6.3/conf/settings.xml
指定本地仓库目录
<localRepository>/opt/soft/apache-maven-3.6.3/repository</localRepository>
如图:
配置阿里云镜像
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>https://maven.aliyun.com/repository/public</url>
<mirrorOf>central</mirrorOf>
</mirror>
如图:
如果不清楚docker的安装的目录,可以使用whereis docker
命令查看docker的安装的目录
将本地项目上传到gitee仓库中
提供Git忽略文件
在gitee新建仓库,用于存放项目
在gitee上创建仓库,将代码上传到gitee仓库
在本地git bash执行
git init
touch README.md
git add README.md
git add .
git commit -m "first commit"
git remote add origin https://gitee.com/xxx.git
git push -u origin "master"
在微服务运行之前需要在本地仓库中先去install所依赖的jar包,所以第一步应该是从git中拉取代码,并且把基础的依赖部分安装到仓库中
(1)新创建一个item,起名为sph-parent
(2)配置当前sph-parent
选中git,输入git的仓库地址(前提条件,需要把代码上传到gitee仓库中),最后输入getee的用户名和密码
如果没有配置Credentials,可以选择添加,然后输入用户名密码即可
其中构建触发器与构建环境暂不设置
设置构建配置
选择Invoke top-level Maven targets
maven版本:就是之前在jenkins中配置的maven
目标:输入maven的命令 clean install -Dmaven.test.skip=true
跳过测试安装
(3)启动项目
创建完成以后可以在主页上看到这个item
启动项目:点击刚才创建的项目,然后Build Now
在左侧可以查看构建的进度:
点进去以后,可以查看构建的日志信息
构建的过程中,会不断的输入日志信息,如果报错也会提示错误信息
jenkins会先从git仓库中拉取代码,然后执行maven的install命令,把代码安装到本地仓库中
最终如果是success则为构建成功
当构建成功完成后,持续集成服务器结果
(1)创建启动/停止服务脚本,在Jenkins中构建项目gmall-gateway-1.0.jar成功后,调用脚本完成项目启动,停止
在linux目录中创建运行目录
mkdir /opt/app
cd /opt/app
新建start.sh脚本
vi start.sh
内容如下
#!/bin/bash
echo "应用启动中...."
nohup java -Dfile.encoding=utf-8 -jar gmall-gateway-1.0.jar > gmall-gateway.log 2>&1 &
sleep 10
tail -n 200 gmall-gateway.log
echo "启动成功"
新建stop.sh脚本
vi stop.sh
内容如下:
#!/bin/bash
echo "stop gmall-gateway"
pid=`ps -ef | grep gmall-gateway-1.0.jar | grep -v grep | awk '{print $2}'`
if [ -n "$pid" ]
then
echo “应用进程id:$pid”
kill -9 $pid
echo "应用已关闭."
rm -f gmall-gateway.log
fi
(2)新建item,以gmall-gateway
微服务为例
(2)配置
添加执行shell命令
添加内容如下:
#*.sh文件的读、写、运行权限
chmod 777 /opt/app/*.sh
# 进入运行目录
cd /opt/app
#执行停止脚本
./stop.sh
# 将运行目录中的jar包删除
rm -rf /opt/app/gmall-gateway-1.0.jar
# 复制新的jar包
cp /root/.jenkins/workspace/sph-parent/gmall-gateway/target/*.jar /opt/app/
# 项目启动后不会被Jenkins杀掉
BUILD_ID=dontKillMe
#执行启动脚本
./start.sh
到此就配置完毕了,保存即可
(3)构建该项目 Build Now
下载基础镜像centos:7
docker pull centos:7
将资料中jdk8安装包并上传至已创建的特定目录(此处使用/opt/soft/jdkdockerimage)
mkdir -p /opt/soft/jdkdockerimage
相同目录下创建vi Dockerfile
#1、指定构建的基础镜像
FROM centos:7
#2、指明该镜像的作者和电子邮箱
MAINTAINER atguigu "atguigu@qq.com"
#3、在构建镜像时,指定镜像的工作目录,之后的命令都是基于此工作目录,如果不存在,则会创建目录
WORKDIR /usr/local/docker
#4、一个复制命令,把jdk安装文件复制到镜像中,语法 ADD SRC DEST ,ADD命令具有自动解压功能
ADD jdk-8u144-linux-x64.tar.gz /usr/local/docker
#5、配置环境变量,此处目录为tar.gz包解压后的名称,需提前解压知晓:
ENV JAVA_HOME=/usr/local/docker/jdk1.8.0_144
ENV CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV PATH=$JAVA_HOME/bin:$PATH
CMD ["java","-version"]
在Dockerfile所在目录执行构建命令
docker build -t jdk:8 .
测试jdk容器,进入容器测试
docker run -it --name=jdk1 jdk:8 /bin/bash
https://spring.io/guides/gs/spring-boot-docker/
每个微服务使用的dockerfile的方式进行构建镜像后创建容器,需要在每个微服务中添加docker相关的配置
(1)在/opt/app目录下创建dock-gateway.sh
# 查看进程是否存在
docker ps | grep gmall-gateway-docker &> /dev/null
if [ $? -ne 0 ]
then
echo "容器不存在"
else
echo "容器存在"
#删除容器
docker stop gmall-gateway-docker
docker rm -f gmall-gateway-docker
fi
echo "start docker image run"
cd /root/.jenkins/workspace/sph-parent/gmall-gateway
docker build -t gmall-gateway-docker .
docker run -d --name=gmall-gateway-docker -p 80:80 gmall-gateway-docker
(2)在idea中每个微服务(以gateway微服务为例)的gateway模块根目录下创建Dockerfile文件,如下:
# 设置JAVA版本
FROM jdk:8
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} app.jar
CMD java -Dfile.encoding=utf-8 -jar app.jar
(3)将新增Dockerfile推送到git远程仓库。运行 基础项目 构建任务
(4)在Jenkins创建一个Maven项目构建任务gmall-gateway-docker
添加描述
源码设置
选择执行shell
在execute shell中设置
#*.sh文件的读、写、运行权限
chmod 777 /opt/app/*.sh
cd /opt/app
./dock-gateway.sh
先执行sph-parent
模块的构建,拉取最新代码
在执行gmall-gateway-docker
模块的构建
url从构建任务中复制:http://192.168.137.136:9090/sph-parent