在研发体系的交付下,更加期望的是编写代码完成后,能够进行自动化的环境部署和自动化测试的冒烟测试,这样就可以节省很多的人力成本的验证时间。毕竟在SAAS的架构模式下,会拥有很多的微服务,这些微服务每天都在不停的更新代码,也需要每天不停的进行测试验证。那么在这样的一个过程中,可以完全结合Docker的技术以及结合Jenkins的持续集成的思路,打造一个可持续交付的自动化测试验证的一个过程。
具体的思路就是编写代码完成后,使用Dockerfile自动化的构建镜像,然后使用docker-compose来自动的启动服务后,进行自动化的冒烟测试。当然在这样的一个设计思考中,存在的缺陷是就是下次自动的构建中服务没有停止,同时镜像没有删除,会导致Dockerfile构建镜像的过程中直接失败,因为的原因是镜像已存在。那么可以做一个初始化的处理,也就是前置的动作,在构建镜像前先停止之前的服务,然后删除原来的镜像,这样在后期每次更新代码后进行构建,就不会因为初始化这部分导致流水线失败,这样也就可以打造可持续交付的流水线的作业交付,具体如图所示:
下面详细的介绍下具体实现的细节,这里以SpringBoot为案例,首先需要在项目的src/main的目录下创建docker文件夹,里面编写Dockerfile的文件,文件内容具体如下:
FROM java:8
MAINTAINER 无涯
VOLUME /tmp
RUN mkdir /app
COPY app-0.0.1-SNAPSHOT.jar /app/app.jar
WORKDIR /app
EXPOSE 8081
CMD ["java","-Djava.security.egd=file:/dev/./urandom","-jar","app.jar"]
Dcokerfile文件里面详细的定义了构建镜像的过程,下来同理在docker的文件夹下创建docker-compose.yml的文件,文件的内容具体为:
version: '3.2'
services:
app:
image: app:0.0.1-SNAPSHOT
hostname: localhost
ports:
- "8081:8081"
networks:
- mynetwork
networks:
mynetwork:
external: true
主要定义了启动服务的过程,下面需要在pom.xml的文件里面引入docker,具体内容如下:
<!--Docker Maven依赖插件-->
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<configuration>
<imageName>${project.name}:${project.version}</imageName>
<!--Dockerfile文件存储目录-->
<dockerDirectory>${project.basedir}/src/main/docker</dockerDirectory>
<skipDockerBuild>false</skipDockerBuild>
<resources>
<resource>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
做好这一切的配置好后,下来编写具体的冒烟测试代码,和整合到CI持续集成的平台上,涉及到的脚本如下:
pipeline{
agent any
stages{
stage('init'){
steps{
sh '''cd /Applications/code/workSpace/data/app/src/main/docker
docker-compose down
sleep 6s
docker rmi app:0.0.1-SNAPSHOT
sleep 10s
'''
}
}
stage('build the image'){
steps{
sh '''cd /Applications/code/workSpace/data/app
mvn clean package -Dmaven.test.skip=true docker:build'''
}
}
stage('run the container'){
steps{
sh '''cd /Applications/code/workSpace/data/app/src/main/docker
docker-compose up -d '''
}
}
stage('smoke test'){
steps{
sh '''cd /Applications/code/workSpace/data/app/src/main/docker
sleep 10s
python3 -m pytest -v test_springboot.py'''
}
}
}
}
结合如上的具体实现细节,就可以打造Docker下的持续交付的过程,也就实现了自动化部署和自动化测试的过程,这样的好处就是拥有很多的微服务也是无所谓的,也是可以使用该思想和具体的技术来打造可持续的交付流水线。