`
frank1998819
  • 浏览: 751642 次
  • 性别: Icon_minigender_1
  • 来自: 南京
文章分类
社区版块
存档分类

持续集成测试(1) -- docker-maven-plugin初探(转)

 
阅读更多

背景

最近想搞持续集成测试,初步构想是使用Git、jekins、maven、Docker作为持续集成的基础组件,当然也是最常用的基础组件。
初步是想将Java的测试用例塞到docker容器中进行测试,测试环境部署只一次就好,镜像推送到仓库,随测随拉,直接使用docker命令运行,好处是环境一致,不需要重新部署测试代码所依附的环境;坏处是docker,docker,docker,也就是想运行测试用例必备的基础环境docker。

junit的命令行执行

我们最常见的执行测试用例多数是通过eclipse的run as,或者是mvn test执行测试用例。如果将测试用例塞到容器内,要么将mvn装到容器内,要么在物理机构建,并将构建后的环境也就是jar包塞到容器内使用java执行。
衡量了下,还是决定在物理机进行构建,将构建结果塞到容器内.
1. 重复构建mvn环境浪费时间;
2. 将mvn塞到容器内浪费资源;
3. blablabla,反正就是不爽

鉴于本人学艺不精,这里转载一篇对于junitcore使用的文章:

命令行执行使用java -cp *.jar org.junit.runner.JUnitCore classname可参考该篇文章了解及执行。

执行示例

使用junit简单的输出语句,没有功能,只是作为示例演示:

public class startTest {

    @Before
    public void setup(){
        System.out.println("this is setup...");
    }

    @After
    public void teardown(){
        System.out.println("this is teardown...");
    }

    @Test
    public void test1(){
        System.out.println("this is test1...");
    }
}



命令行之行junit:

java -cp $CLASS_PATH:target/test-classes org.junit.runner.JUnitCore $CLASS_NAME

遇到的问题及解决办法

由于对java执行junit测试用例实在不是很熟,mvn打完包后,执行

java -cp $CLASS_PATH org.junit.runner.JUnitCore $CLASS_NAME

总是找不到测试类(本人技术不熟,喷子勿喷^o^),原因是由于jar包内默认查询的是src/main下的文件,而测试用例大都在src/test下

mv src/test src/main
mvn clean package -DskipTests=true
java -cp $CLASS_PATH org.junit.runner.JUnitCore $CLASS_NAME
bingo

或者指定classpath,指定去target/test-classes目录下查找测试类

java -cp $CLASS_PATH:target/test-classes org.junit.runner.JUnitCore $CLASS_NAME
进入主题

该插件有两种使用方式:
1. 不使用dockerfile
2. 使用dockerfile

不使用dockerfile

顾名思义就是不依赖于dockerfile构建镜像,即通过标签来定义镜像构建过程。

<plugin>
  <groupId>com.spotify</groupId>
  <artifactId>docker-maven-plugin</artifactId>
  <version>0.4.13</version>
  <configuration>
    <imageName>registry.test.com/example</imageName>
    <baseImage>registry.test.com/base_image</baseImage>
    <entryPoint>["sh", "start.sh"]</entryPoint>
    <resources>
      <resource>
        <targetPath>/</targetPath>
        <directory>${project.build.directory}</directory>
        <include>**/*</include>
      </resource>
    </resources>
  </configuration>
</plugin>


其中:

imageName:即将构建的镜像名
baseImage: 构建镜像时需要的基础镜像,类似于Dockerfile的From
entryPoint: 容器启动时执行的命令
resources:拷贝一些额外的文件到指定路径下,比如${project.build.finalName}.jar文件
一些maven的内置变量

${basedir} 项目根目录
${project.build.directory} 构建目录,默认为target
${project.build.outputDirectory} 构建过程输出目录,默认为target/classes,target/test-classes
${project.build.finalName} 打包后生成的结果名称,默认为${project.artifactId}-${project.version}
\${project.packaging} 打包类型,默认为jar
maven一些标签

targetPath:指定build资源到哪个目的目录,默认是base directory
directory:指定属性文件的目录,build的过程需要找到它,并且将其放到targetPath下。
includes:指定包含文件的patterns,符合样式并且在directory目录下的文件将会是包含进project的资源文件
excludes:指定不包含在内的patterns,如果includes与excludes有冲突,那么excludes胜利,那些符合冲突样式的文件还是不会包含进来的
使用dockerfile

依赖于Dockerfile构建镜像,需指定dockerDirectory 来查找Dockerfile所在文件目录,指定dockerDirectory 后,baseImage, maintainer, cmd和entryPoint等标签均失效。dockerDirectory目录下的所有内容默认会被复制到${project.build.directory}/docker目录下。

<plugin>
  <groupId>com.spotify</groupId>
  <artifactId>docker-maven-plugin</artifactId>
  <version>0.4.13</version>
  <configuration>
    <imageName>registry.test.com/example</imageName>
    <dockerDirectory>${project.basedir}/</dockerDirectory>
    <resources>
      <resource>
        <targetPath>/</targetPath>
        <directory>${project.build.directory}</directory>
        <include>${project.build.finalName}.jar</include>
      </resource>
    </resources>
  </configuration>
</plugin>

我的根目录结构为:

-rw-r--r-- 1 ** **  437 Sep 21 10:38 Dockerfile
drwxr-xr-x 2 ** ** 4096 Sep 20 13:59 lib
drwxr-xr-x 3 ** ** 4096 Sep 20 11:18 logs
-rwxrwxrwx 1 ** ** 3015 Sep 20 18:40 pom.xml
-rwxr-xr-x 1 ** ** 3102 Sep 20 18:54 pom.xml.undocker
drwxrwxrwx 3 ** ** 4096 Sep 20 11:18 src
-rw-r--r-- 1 ** ** 1028 Sep 20 10:27 start.sh

我的Dockerfile指定在根目录下,当执行 mvn clean package docker:build后会生成一target文件,查看target目录后默认生成docker文件夹,继续查看docker文件夹时可见,根目录的所有内容都被copy到该文件夹下,在进行docker build的过程中也是在target/docker目录下根据Dockerfile执行。

Dockerfile文件内容如下,安装了jdk,添加测试代码所需的一些库:

From registry.test.com/base_image:centos6.6

ADD target/test-classes /data1/target/test-classes
ADD target/dockermaven/lib /data1/target/dockermaven/lib
ADD start.sh /data1/
ADD lib/jdk-1.8.0_77-2.el6.x86_64.rpm /jdk-1.8.0_77-2.el6.x86_64.rpm
RUN rpm -ivh /jdk-1.8.0_77-2.el6.x86_64.rpm
ENV JAVA_HOME /usr/local/jdk1.8.0_77
ENV PATH $PATH:$JAVA_HOME/bin
RUN chmod +x /data1/start.sh
WORKDIR /data1
CMD sh start.sh

构建命令

# maven打包并构建镜像
mvn clean package -DskipTests=true docker:build
# maven打包构建镜像并push到仓库
mvn clean package docker:build -DpushImage
# maven打包构建镜像,将指定tag的镜像push到仓库,该命令需使用
# <imageTags><imageTag>...</imageTag></imageTags>标签
mvn clean package docker:build -DpushImageTag

<plugin>
  <configuration>
    ...
    <imageTags>
       <imageTag>${project.version}</imageTag>
       <imageTag>latest</imageTag>
    </imageTags>
  </configuration>
</plugin>

# 关于tags配置也可在命令行直接设置
mvn ... docker:build -DpushImageTags -DdockerImageTag=latest -DdockerImageTag=another-tag

参考自:
http://blog.csdn.net/neven7/article/details/46675845
https://github.com/spotify/docker-maven-plugin
https://www.zybuluo.com/babydragon/note/352069
http://dockone.io/article/582
http://www.cnblogs.com/puroc/p/5799228.html

 

分享到:
评论

相关推荐

    docker-maven-plugin:用于运行和创建Docker映像的Maven插件

    这是一个Maven插件,用于构建Docker映像和管理用于集成测试的容器。 它适用于Maven 3.0.5和Docker 1.6.0或更高版本。 目标 目标 描述 默认生命周期阶段 创建并启动容器 整合前测试 停止并销毁容器 整合后测试 ...

    Gitllab+Jenkins+Docker+Harbor 自动化部署流程

    3. 镜像构建:Jenkins 服务器使用 Docker-maven-plugin 插件生成 Docker 镜像。 4. 镜像推送:Jenkins 服务器将 Docker 镜像推送到 Harbor 服务器上。 5. 部署应用程序:Harbor 服务器提供了一个安全的环境来部署...

    java8源码-springBoot-docker:springBoot和docker的集成

    docker-maven-plugin 插件,直接将 spring boot 应用一键发布到 docker 容器中。 文末会提供源码 Git 地址。 笔者 docker 部署于一台 Centos 7.2 的云服务器,换做 VM 虚拟机的 Linux 也是一样的。 用到的所涉及的...

    Jenkins常用插件大全jenkins-plugin-war.tar.gz

    5. **持续集成实践**:Jenkins不仅用于自动化构建,还可以进行单元测试、集成测试、代码质量检查等。通过设置多阶段作业,可以在不同的步骤中执行不同任务,如编译、测试、部署等,确保代码的质量和稳定性。 6. **...

    docker-compose部署配置jenkins的详细教程

    在本教程中,我们将使用 Docker Compose 部署 Jenkins,一个流行的持续集成和持续交付(CI/CD)平台。 1. **Docker Compose 文件配置**: 在 `docker-compose.yml` 文件中,我们指定了 Jenkins 服务的配置。`version...

    Jmeter+Jenkins+maven接口自动化集成.rar

    在这个项目中,我们将利用JMeter、Jenkins和Maven三个强大的工具进行接口自动化集成,实现持续集成和自动化测试。 **JMeter** 是一个开源的性能测试工具,主要适用于Web应用的压力和负载测试,但也可以用于接口测试...

    gradle-0.12.0.zip

    docker-maven-plugin.zip,一个插件,用来包装DockerAPI,为集成测试准备Docker图像。测试容器可以

    项目管理软件Maven2.0

    3. **测试支持**:Maven可以集成JUnit或其他测试框架,对Struts2应用进行单元测试和集成测试。 4. **部署**:Maven可以将Struts2应用打包成WAR文件,方便部署到Web服务器,如Tomcat。 总结,Maven2.0作为项目管理...

    testMaven:测试Maven Jenkins

    4. **Maven插件**:Maven插件扩展了生命周期,如maven-surefire-plugin用于执行单元测试,maven-failsafe-plugin用于执行集成测试。 **Jenkins知识点** 1. **Jenkins安装与配置**:Jenkins可以通过下载war文件或...

    plugin2.zip

    Jenkins 是一款强大的持续集成(Continuous Integration, CI)和持续部署(Continuous Deployment, CD)工具,广泛应用于软件开发过程中的自动化构建、测试和部署。"plugin2.zip" 文件很可能包含了用于扩展 Jenkins ...

    Maven-telesens项目

    5. **Maven插件**:项目可能会使用多种Maven插件,如maven-compiler-plugin用于编译Java源代码,maven-surefire-plugin用于运行单元测试,maven-jar-plugin用于打包成JAR文件,maven-war-plugin用于打包Web应用等。...

    jenkins部署war配置

    Jenkins 是一个开源的持续集成(CI)工具,被广泛应用于自动化构建、测试和部署等环节。本文主要介绍如何利用Jenkins来实现WAR包的应用部署。通过具体步骤展示整个流程,包括Jenkins的安装、插件安装配置、环境变量...

    手把手教你配置android持续集成开发环境1

    此外,还可以考虑与其他服务集成,如SonarQube进行代码质量检查,Docker进行容器化部署,以及使用Artifactory或Maven仓库管理依赖。持续集成不仅可以简化日常开发工作,还能提升产品质量,是现代软件开发不可或缺的...

    jenkins所需的插件等

    Jenkins 是一款强大的持续集成(Continuous Integration, CI)工具,被广泛用于自动化各种软件开发任务,如构建、测试和部署。在本主题中,我们主要关注 Jenkins 的插件及其在 Linux 环境中的应用。 标题提及的 ...

    Java微服务架构l零从基础到精通高清视频教程全套 163课

    073 使用 MyBatis Maven Plugin 自动生成代码 074 集成 MyBatis-测试查询 第7章 项目实战 075项目简介 076 创建依赖管理项目 077 创建通用工具项目 078 创建数据库管理项目 079 创建领域模型项目 080 创建管理...

    plugins.zip

    1. **Maven Integration Plugin**:与Apache Maven集成,使得基于Maven的项目能够自动构建、测试和部署。 2. **Git Plugin**:支持从Git仓库获取源代码,使得Jenkins可以监听代码仓库的变更并触发构建。 3. **...

    springboot改造购物车项目

    - **Spring Boot Test**:提供单元测试和集成测试的支持,可以对Controller、Service、Repository等层进行测试。 - MockMvc:模拟Web请求,测试Controller层的逻辑。 8. **构建与部署**: - 使用Maven或Gradle...

    Java微服务架构163课

    073 使用 MyBatis Maven Plugin 自动生成代码 074 集成 MyBatis-测试查询 第7章 项目实战 075项目简介 076 创建依赖管理项目 077 创建通用工具项目 078 创建数据库管理项目 079 创建领域模型项目 080 ...

Global site tag (gtag.js) - Google Analytics