import java.io.*;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
import java.util.stream.Collectors;
/**
* @author oscar
* @date 2021/7/20 17:29
*/
public class JacocoJenkins {
public static void generateNewDockerfile(String fileName, String port) throws IOException {
Path path = Paths.get(fileName);
// File oldFile = new File(fileName);
// if (oldFile.exists() && oldFile.isFile()) {
// oldFile.renameTo(new File("D:\\jacoco\\Dockerfile.tmp"));
// }
// Files.lines(Paths.get("fileName"), StandardCharsets.UTF_8).forEach(System.out::println);
if (port.isEmpty()) port = "6789";
List<String> lines = (Files.lines(path, StandardCharsets.UTF_8)).collect(Collectors.toList());
//添加docker对外开放的端口
for (int i = 0; i < lines.size(); i++) {
String expose = lines.get(i);
if (expose.toUpperCase().contains("EXPOSE")) {
lines.add(i + 1, "EXPOSE " + port);
break;
}
}
//在docker对添加jacocoagent.jar
for (int i = 0; i < lines.size(); i++) {
String expose = lines.get(i);
if (expose.toUpperCase().contains("ADD")) {
lines.add(i + 1, "ADD jacocoagent.jar /tmp/jacocoagent.jar");
break;
}
}
String javaagant = "-javaagent:/tmp/jacocoagent.jar=includes=*,output=tcpserver,port=" + port + ",address=0.0.0.0 ";
//拼接Dockerfile文件ENTRYPOINT指令
for (int i = 0; i < lines.size(); i++) {
String content = lines.get(i);
if (content.toUpperCase().contains("ENTRYPOINT")) {
lines.remove(i);
String str1 = content.substring(0, content.indexOf(" java "));
String result = str1 + " java " + javaagant + content.substring(content.indexOf(" java ") + 6, content.length());
lines.add(i, result);
break;
}
}
writelnF(fileName, lines);
}
public static void generateNewPom(String fileName) throws IOException {
String cc = "<dependency>\n" +
" <groupId>org.jacoco</groupId>\n" +
" <artifactId>org.jacoco.agent</artifactId>\n" +
" <version>0.8.7</version>\n" +
" <classifier>runtime</classifier>\n" +
" </dependency>\n";
Path path = Paths.get(fileName);
boolean flag = false;
List<String> lines = (Files.lines(path, StandardCharsets.UTF_8)).collect(Collectors.toList());
for (int i = 0; i < lines.size(); i++) {
String content = lines.get(i);
if (content.toLowerCase().contains("<dependencies>")) {
lines.add(i + 1, cc);
}
if (content.toLowerCase().contains("<build>"))
flag = true;
}
// 包含编译模块,插入jacoco插件
if (flag) {
for (int i = 0; i < lines.size(); i++) {
String content = lines.get(i);
// System.out.println(content);
if (content.toLowerCase().contains("</plugin>")) {
lines.add(i + 1, getJacocoPlugin());
break;
}
}
} else {
System.out.println("pom.xml文件内容不对,没有包含build模块。");
}
writelnF(fileName, lines);
}
//
// public static void main(String[] args) throws IOException {
// generateNewDockerfile("D:\\jacoco\\Dockerfile", "6789");
// generateNewPom("D:\\jacoco\\pom.xml");
//
//
// }
//
public static void main(String[] args) throws IOException {
// write your code here
if (args.length > 2) {
JacocoJenkins.generateNewDockerfile(args[0], args[1]);
JacocoJenkins.generateNewPom(args[2]);
} else {
System.out.println("至少要有3个参数:\n\njava -jar jacocoTest.jar dockerfile文件(带路径),docker对外端口,pom文件路径 \n如:\njava -jar jacocoTest.jar Dockerfile \"6789\" pom.xml");
}
}
public static void writelnF(String fileName, List<String> lists) {
try {
BufferedWriter bufferedWriter = new BufferedWriter(
new OutputStreamWriter(new FileOutputStream(fileName), "UTF-8"));
for (String s : lists) {
bufferedWriter.write(s.toString());
bufferedWriter.newLine();
bufferedWriter.flush();
}
bufferedWriter.close();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public static String getJacocoPlugin() {
String content = " <plugin>\n" +
" <groupId>org.jacoco</groupId>\n" +
" <artifactId>jacoco-maven-plugin</artifactId>\n" +
" <version>0.8.7</version>\n" +
" <executions>\n" +
" <execution>\n" +
" <id>default-instrument</id>\n" +
" <goals>\n" +
" <goal>instrument</goal>\n" +
" </goals>\n" +
" </execution>\n" +
" <execution>\n" +
" <id>default-restore-instrumented-classes</id>\n" +
" <goals>\n" +
" <goal>restore-instrumented-classes</goal>\n" +
" </goals>\n" +
" </execution>\n" +
" <execution>\n" +
" <id>report</id>\n" +
" <phase>prepare-package</phase>\n" +
" <goals>\n" +
" <goal>report</goal>\n" +
" </goals>\n" +
" </execution>\n" +
" <execution>\n" +
" <id>check</id>\n" +
" <goals>\n" +
" <goal>check</goal>\n" +
" </goals>\n" +
" </execution>\n" +
" <execution>\n" +
" <id>prepare-agent</id>\n" +
" <goals>\n" +
" <goal>prepare-agent</goal>\n" +
" </goals>\n" +
" </execution>\n" +
" </executions>\n" +
" <configuration>\n" +
" <!-- rules里面指定覆盖规则 -->\n" +
" <rules>\n" +
" <rule implementation=\"org.jacoco.maven.RuleConfiguration\">\n" +
" <element>BUNDLE</element>\n" +
" <limits>\n" +
" <!-- 指定方法覆盖到80% -->\n" +
" <limit implementation=\"org.jacoco.report.check.Limit\">\n" +
" <counter>METHOD</counter>\n" +
" <value>COVEREDRATIO</value>\n" +
" <minimum>0.80</minimum>\n" +
" </limit>\n" +
" <!-- 指定指令覆盖到80% -->\n" +
" <limit implementation=\"org.jacoco.report.check.Limit\">\n" +
" <counter>INSTRUCTION</counter>\n" +
" <value>COVEREDRATIO</value>\n" +
" <minimum>0.80</minimum>\n" +
" </limit>\n" +
" <!-- 指定行覆盖到80% -->\n" +
" <limit implementation=\"org.jacoco.report.check.Limit\">\n" +
" <counter>LINE</counter>\n" +
" <value>COVEREDRATIO</value>\n" +
" <minimum>0.80</minimum>\n" +
" </limit>\n" +
" <!-- 指定类覆盖到100%,不能遗失任何类 -->\n" +
" <limit implementation=\"org.jacoco.report.check.Limit\">\n" +
" <counter>CLASS</counter>\n" +
" <value>MISSEDCOUNT</value>\n" +
" <maximum>0</maximum>\n" +
" </limit>\n" +
" </limits>\n" +
" </rule>\n" +
" </rules>\n" +
" </configuration>\n" +
" </plugin>";
return content;
}
}
CI修改微服务Dockerfile和pom.xml文件
最新推荐文章于 2023-03-30 10:40:59 发布