记录, 使用jenkins自动打包并向私库推送镜像, 不限制于Harbor。该问题因为一个小点没有想到, 导致调查了一天,多次尝试,阅读大量相关的文章并未解决作者的问题。 所以作为记录,供读者多一个参考的方向。
使用说明, jenkins,github, docker, Harbor, nexus3均已部署, 环境jdk, maven, git 已配置。
nexus3作为maven私库, 其他服务jar包引用使用。
Harbor作为集群镜像服务, 其他子节点配置 “insecure-registries” 并登录即可使用Harbor作为镜像私库。
两者均使用的原因, 无非是Harbor镜像管理优于nexus3.
- 项目配置, parent工程下, 如下配置
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<docker.registry.name>test</docker.registry.name>
<docker.repository>hub.k8s.com</docker.repository>
</properties>
docker.repository: Harbor镜像私库,该域名为本地域名, 需要在本地进行配置(win -> C:\Windows\System32\drivers\etc\hosts liunx -> /etc/hosts)
docker.registry.name: Harbor新建的项目分组
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
- 子工程,(对外接口项目/实现项目)需要在实现的项目内的pom内添加
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<!-- 打包时跳过单元测试 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
<plugin>
<groupId>com.spotify</groupId>
<artifactId>dockerfile-maven-plugin</artifactId>
<version>1.4.13</version>
<executions>
<execution>
<id>default</id>
<goals>
<goal>build</goal>
<goal>push</goal>
</goals>
</execution>
</executions>
<configuration>
<repository>${docker.repository}/${docker.registry.name}/${project.artifactId}</repository>
<tag>${project.version}</tag>
<buildArgs>
<JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE>
</buildArgs>
</configuration>
</plugin>
</plugins>
</build>
本地打包时, 需要将此配置进行注释, 打包时会根据配置进行打镜像, 若本地没有docker启动, 会导致报错。
- 在实现项目下 与pom同目录下配置 Dockerfile (名称一致)
关于Dockerfile各个指令的含义, 作用本文不做解释, 感兴趣的可自行查阅
FROM openjdk:8
MAINTAINER peter <[email protected]>
VOLUME /tmp
ARG JAR_FILE
ADD ${JAR_FILE} app.jar
RUN sh -c 'touch /app.jar'
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
ENV JAVA_OPTS=""
ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar" ]
- jenkins 配置
需要注意, 将 mvn deploy命令 下放到shell中执行。
在parent目录下 执行 mvn clean
然后执行 mvn deploy, 该命令会进行打包,编译, 推送等一系列操作
作者使用参数话构建, 使用tags作为镜像版本, 也可定义其他版本, 如时间等。 - 执行
执行之前确保jenkins指向的docker已进行登录私库。
在控制台输出中, 看到以下信息, 则表示构建,推送成功
并在私库中确认(Harbor)
可以看到打包的私库以进行上传。
说明: 打不同的版本是为了可以对项目进行升级或降级使用。