CI修改微服务Dockerfile和pom.xml文件

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;
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值