記錄, 使用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)
可以看到打包的私庫以進行上傳。
說明: 打不同的版本是爲了可以對項目進行升級或降級使用。