使用 Maven 服务,我们可以很方便的处理 JAVA 工程的软件包依赖和编译打包。如果我们构建的工程是运行在 Docker 容器化平台中的话,我们后面还需要将构建好的包,打到镜像中并推送到镜像仓库。第二个步骤中的制作容器镜像和推送到远程仓库的操作,我们可以编写到 Maven 服务的配置文件中,从而减少我们的手动操作,提高效率。
创建了一个 dingtalk 工程,用于将 Prometheus alert 的 Webhook 警报信息转发到钉钉上去。在这一步中,工程的POM 文件中只需要配置好需要的依赖(dependencies)即可。
mvn package
命令将项目打包成jar 或者war 包。
<properties> <java.version>1.8</java.version> <docker.repostory>registry-vpc.cn-shenzhen.aliyuncs.com</docker.repostory> <docker.registry.name>devops-lyz</docker.registry.name> </properties> <build> #指定资源文件 #Directory 指定资源dockerfile 文件的路径 #targetPath 目标文件,指定dockerfile 拷贝的目标地址和JAR 包文件生成的目录 <resources> <resource> <directory>${project.basedir}/src/main/docker</directory> <filtering>true</filtering> <includes> <include>**/Dockerfile</include> </includes> <targetPath>${project.basedir}/target/docker</targetPath> </resource> </resources> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> <plugin> #Maven 用于创建容器镜像使用到的插件 <groupId>com.spotify</groupId> <artifactId>docker-maven-plugin</artifactId> <version>1.0.0</version> <configuration> #镜像的名称 <imageName>${docker.repostory}/${docker.registry.name}/${project.artifactId}</imageName> #镜像的目录 <dockerDirectory>${project.basedir}/target/docker</dockerDirectory> <imageTags> #镜像的版本信息 <imageTag>${project.version}</imageTag> </imageTags> <resources> <resource> <targetPath>/</targetPath> <directory>${project.build.directory}</directory> <include>${project.build.finalName}.${project.packaging}</include> </resource> </resources> </configuration> </plugin> </plugins> </build>
打包命令: mvn -f pom_2_by_dockerfile.xml clean package -DskipTests docker:build
绑定 Docker 命令到 Maven 各个阶段,可以把 Docker 分为 build、tag、push,然后分别绑定 Maven 的 package、deploy 等阶段。这样,我们只需要执行 mvn deploy 就可以完成整个 build、tag、push 操作了。
当我们执行 mvn build 就只完成 build、tag 操作。
此外当想跳过某些步骤或者只执行某个步骤时,不需要修改 POM 文件,只需要指定跳过 docker 某个步骤即可。
<plugin> #Maven 用于创建容器镜像使用到的插件 <groupId>com.spotify</groupId> <artifactId>docker-maven-plugin</artifactId> <version>1.0.0</version> <executions> <execution> <id>build-image</id> <phase>package</phase> <goals> <goal>build</goal> </goals> </execution> <execution> <id>tag-image</id> <phase>package</phase> <goals> <goal>tag</goal> </goals> </execution> <execution> <id>push-image</id> <phase>deploy</phase> <goals> <goal>push</goal> </goals> </execution> </executions> </plugin>
当我们执行 mvn package 时,执行 build、tag 操作。当执行 mvn deploy 时,执行 build、tag、push 操作。
如果想跳过 docker 某个过程时,只需要添加参数:
例:我们想执行 package 时,跳过 tag 过程,那么就需要 mvn package -DskipDockerTag。