使用Maven、jenkins、docker实现持续集成

之前使用过jenkins+maven的方法自动构建项目并推送到tomcat的方法–>传送门

由于spring boot/cloud等的微服务的流行,人们更喜欢即开即用的方式。docker作为一个免费开源的容器,越来越多的应用也都会存在一个docker版本(比如jenkins、gitlab)。不过spring boot只需要一句命令就能启动也可以不需要创建一个docker版本。

安装

必须的系统环境:

  • Jdk(推荐还是用Oracle JDK,Jenkins执行编译的过程还是需要Oracle JDK的,方便起见替换掉系统的openjdk)
  • Maven
  • Docker
  • Git
  • Jenkins

docker hub 配置

使用docker官方的registry保存镜像,并不知道有没有限制。 create repo 创建一个私有Repo,repository的名称将作为镜像的名称

Maven配置

使用Maven构建docker镜像的话需要使用docker-maven-plugin

pom.xml添加插件和配置信息,根据官方的实例修改配置

    <plugin>
      <groupId>com.spotify</groupId>
      <artifactId>docker-maven-plugin</artifactId>
      <version>0.4.11</version>
      <configuration>
        <!-- 目标位置 --> 
        <serverId>docker-hub</serverId>
        <!-- 用户名/镜像名 --> 
        <imageName>tusik/web</imageName>
        <!-- Dockerfile的位置 --> 
        <dockerDirectory>src/main/docker</dockerDirectory>
        <pushImage>true</pushImage>
        <!-- 镜像的标签,project.version在properties标签下添加 --> 
        <imageTags>
           <imageTag>${project.version}</imageTag>
           <imageTag>latest</imageTag>
        </imageTags>
        <entryPoint>["java", "-jar", "/${project.build.finalName}.jar"]</entryPoint>
        <!-- copy the service's jar file from target into the root directory of the image --> 
        <resources>
           <resource>
             <targetPath>/</targetPath>
             <directory>${project.build.directory}</directory>
             <include>${project.build.finalName}.jar</include>
           </resource>
        </resources>
      </configuration>
    </plugin>

根据上面的配置在Maven的setting.xml下添加全局的docker hub信息

<servers>
  <server>
    <id>docker-hub</id>
    <username>foo</username>
    <password>secret-password</password>
    <configuration>
      <email>foo@foo.bar</email>
    </configuration>
  </server>
</servers>

可以此时进入项目运行

mvn clean package docker:build -DpushImageTag

or

mvn clean package docker:build -DpushImage

进行测试能否正常工作,如果出现Permission denied的错误提示则需要把jenkins用户加入docker用户组sudo usermod -aG docker jenkins,或者直接chmod 777 /var/run/docker.sock

Dockerfile

可以根据自己需求修改内容

FROM frolvlad/alpine-oraclejdk8:slim
VOLUME /tmp
ADD web-0.0.1-SNAPSHOT.jar app.jar
RUN sh -c 'touch /app.jar'
ENV JAVA_OPTS=""
ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar" ]

Jenkins

创建项目并设置完git仓库地址和hook只后配置maven部分 maven setting 当git中触发push事件之后就会请求hook,jenkins开始拉取并开始使用maven构建项目,完成之后根据Dockerfile将jar打包进image并上传到docker hub 只是要注意tag,相同的tag将会被覆盖