zoukankan      html  css  js  c++  java
  • 通过jgit一次性升级fastjson版本

    背景:笔者所在公司经历了三次fastjson的升级,由于集群,工程数量众多,每次升级都很麻烦。因此开发了一个java的升级工具。
    功能介绍:

    功能介绍:一个jar文件,通过java -jar命令,输入用户名,密码,所负责的git项目主目录,即可对所负责的本地工作区目录下的项目工程中的pom.xml文件进行检测,然后对其依赖的低版本fastjson直接升级到最新版本。
    pom依赖:

     <dependency>
          <groupId>com.alibaba</groupId>
          <artifactId>fastjson</artifactId>
          <version>1.2.61</version>
        </dependency>
        <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <version>4.11</version>
          <scope>test</scope>
        </dependency>
    
        <dependency>
          <groupId>org.eclipse.jgit</groupId>
          <artifactId>org.eclipse.jgit</artifactId>
          <version>5.1.3.201810200350-r</version>
          <optional>true</optional>
        </dependency>
    
    
        <dependency>
          <groupId>org.eclipse.jgit</groupId>
          <artifactId>org.eclipse.jgit.archive</artifactId>
          <version>4.11.0.201803080745-r</version>
        </dependency>
    
        <dependency>
          <groupId>com.jcraft</groupId>
          <artifactId>jsch</artifactId>
          <version>0.1.54</version>
        </dependency>
      </dependencies>
    
      <build>
        <plugins>
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
              <source>8</source>
              <target>8</target>
            </configuration>
          </plugin>
    
          <plugin>
            <artifactId> maven-assembly-plugin </artifactId>
            <configuration>
              <descriptorRefs>
                <descriptorRef>jar-with-dependencies</descriptorRef>
              </descriptorRefs>
              <archive>
                <manifest>
                  <mainClass>com.daojia.qypt.mvnpom.up.GitUtils</mainClass>
                </manifest>
              </archive>
            </configuration>
            <executions>
              <execution>
                <id>make-assembly</id>
                <phase>package</phase>
                <goals>
                  <goal>single</goal>
                </goals>
              </execution>
            </executions>
          </plugin>
    
        </plugins>
    
      </build>
    

    工具包:

    package com.qy.mvnpom.up;
    
    import org.eclipse.jgit.api.Git;
    import org.eclipse.jgit.api.ListBranchCommand;
    import org.eclipse.jgit.lib.Ref;
    import org.eclipse.jgit.transport.CredentialsProvider;
    import org.eclipse.jgit.transport.HttpConfig;
    import org.eclipse.jgit.transport.UsernamePasswordCredentialsProvider;
    
    import java.io.File;
    import java.nio.charset.Charset;
    import java.nio.file.Files;
    import java.nio.file.Paths;
    import java.util.ArrayList;
    import java.util.HashSet;
    import java.util.List;
    import java.util.Set;
    
    /**
     * @Author fanchunshuai
     * @Date 2019/6/27 14
     * @Description:
     */
    public class GitUtils {
    
    
        public static Git getGit(String uri, CredentialsProvider credentialsProvider, String localDir) throws Exception {
            Git git = null;
            if (new File(localDir).exists()) {
                git = Git.open(new File(localDir));
            } else {
                git = Git.cloneRepository().setCredentialsProvider(credentialsProvider).setURI(uri)
                        .setDirectory(new File(localDir)).call();
            }
            //设置一下post内存,否则可能会报错Error writing request body to server
            git.getRepository().getConfig().setInt(HttpConfig.HTTP, null, HttpConfig.POST_BUFFER_KEY, 512 * 1024 * 1024);
            return git;
        }
    
        public static CredentialsProvider getCredentialsProvider(String username, String password) {
            return new UsernamePasswordCredentialsProvider(username, password);
        }
    
        //切换分支
        public static void checkoutBranch(Git git, String localPath, String branchName) {
            String projectURL = localPath + "\.git";
            try {
                git.checkout().setCreateBranch(true).setName(branchName).call();
                git.pull().call();
                System.out.println("切换分支成功");
            } catch (Exception e) {
                System.out.println("已是当前分支,不需要切换!");
            } finally {
                if (git != null) {
                    git.close();
                }
            }
        }
    
        public static void main(String[] args) throws Exception {
            if(args.length<2){
                System.out.println("请输入git用户名&密码!");
                return;
            }
            //获取输入参数
            String username = args[0];
            String password = args[1];
    		//远程项目的git用户组,如http://github.com/fanchunshuai/ 用于从远程下载切换分支代码
            String uri = args[2];
    
            System.out.println("用户名:"+username+",密码:*********");
            CredentialsProvider credentialsProvider = getCredentialsProvider(username, password);
    		//将此工具类的jar文件放到本地所有项目的目录下,与项目代码目录平级
            String localDir = System.getProperty("user.dir");
            System.out.println("当前项目空间:"+localDir);
    
            File file = new File(localDir);
            Set<String> checkSet = new HashSet<>();
    
            for (File childFile : file.listFiles()){
    
                //检查当前项目空中是否有git文件
    
                File [] filex = childFile.listFiles();
                if(filex == null || filex.length == 0){
                    continue;
                }
                boolean b = false;
                for (File file1 : filex){
                    if(file1.getName().endsWith("git")){
                        b = true;
                    }
                }
    
                if(!b){
                    String url = uri+childFile.getName()+".git";
                    System.out.println("url = "+url+" 不在远程git项目里,忽略");
                    continue;
                }
    
                String url = uri+childFile.getName()+".git";
                Git git = getGit(url, credentialsProvider, childFile.getAbsolutePath());
                List<Ref> call = git.branchList().setListMode(ListBranchCommand.ListMode.ALL).call();
                int max = 0;
                String maxBranchs = "";
    
                //分支格式校验
                for (Ref ref : call) {
                    String branchName = ref.getName();
                    if (branchName.contains("-") && branchName.contains("refs/remotes/origin") && branchName.contains("_8-")) {
                        String[] branchArray = branchName.split("_");
                        if(branchArray.length < 3){
                            System.out.println(branchName+"不是标准的分支格式");
                            continue;
                        }
                        if(branchArray[2].split("-").length < 3){
                            System.out.println(branchName+"不是标准的分支格式");
                            continue;
                        }
                        String lastNumber = branchArray[2].split("-")[2];
                        if (max < Integer.parseInt(lastNumber)) {
                            max = Integer.parseInt(lastNumber);
                            maxBranchs = branchName;
                        }
                    }
                }
    
                if(maxBranchs.equals("") || maxBranchs == null){
                    maxBranchs = "refs/remotes/origin/dev/"+childFile.getName()+"_8-0-0";
                }
    
                String newBranch = maxBranchs.replace("refs/remotes/origin/", "");
                System.out.println("需要修复的分支是:" + newBranch);
                checkoutBranch(git, localDir, newBranch);
                for (File childFile2 : childFile.listFiles()) {
                    String path;
                    if (childFile2.isDirectory()) {
                        path = getPomPath(childFile2.getAbsolutePath());
                        if (path == null || path.equals("")) {
                            continue;
                        }
                    } else if (childFile2.isFile() && childFile2.getName().equals("pom.xml")) {
                        path = childFile2.getAbsolutePath();
                    } else {
                        continue;
                    }
                    List<String> lines;
                    try {
                        lines = Files.readAllLines(Paths.get(path), Charset.forName("UTF-8"));
                        System.out.println("POM.xml文件格式为UTF-8........");
                    }catch (Exception e){
                        lines = Files.readAllLines(Paths.get(path), Charset.forName("GBK"));
                        System.out.println("POM.xml文件格式为GBK........");
                    }
                    if(lines.size()<=10){
                        continue;
                    }
                    int i;
                    StringBuilder builder = new StringBuilder();
    
                    String newVersionLine = "";
                    int newIndex = 0;
                    boolean haveTo = false;
                    for (i = 0; i < lines.size(); i++) {
                        String line = lines.get(i);
                        if (line.contains("groupId") && line.contains("com.alibaba")) {
    
                            String artifactIdLine = lines.get(i + 1);
                            builder.append(line + "
    ");
                            if (artifactIdLine.contains("artifactId") && artifactIdLine.contains("fastjson")) {
                                String versionLine = lines.get(i + 2);
                                if (versionLine.contains("version")) {
                                    String[] lineArry = versionLine.split("\.");
                                    //此处进行替换
                                    newVersionLine = lineArry[0] + "." + lineArry[1] + ".60</version>";
                                    newIndex = i + 2;
                                    haveTo = true;
                                }
                            }
                        } else {
                            if (newIndex > 0 && newIndex == i) {
                                builder.append(newVersionLine + "
    ");
                                newIndex = 0;
                                continue;
                            } else {
                                if (i == lines.size() - 1) {
                                    builder.append(line);
                                } else {
                                    builder.append(line + "
    ");
                                }
                            }
                        }
                    }
                    if(!haveTo){
                        checkSet.add(newBranch);
                        continue;
                    }
    
                    Files.write(Paths.get(path), builder.toString().getBytes());
                    git.add().addFilepattern("pom.xml").call();
                    //提交
                    git.commit().setMessage("update fastjson to 1.2.60 auto by qypomup.jar").call();
                    //推送到远程
                    //推送
                    git.push().setCredentialsProvider(credentialsProvider).call();
                    System.out.println("恭喜,自助升级fastjson&代码提交完成!升级分支为:"+newBranch);
                }
            }
    
            if(checkSet.size()>0){
                checkSet.forEach(str->{
                    System.out.println("当前分支["+str+"]中的pom.xml文件中没有包含fastjson依赖,请手工检查!");
                });
            }
        }
    
        private static String getPomPath(String localPath) {
            File file = new File(localPath);
            File[] fileArray = file.listFiles();
            if (fileArray == null || fileArray.length == 0) {
                return "";
            }
            for (File file1 : fileArray) {
                if (file1.isDirectory()) {
                    getPomPath(file1.getAbsolutePath());
                } else {
                    if (file1.isFile() && file1.getName().equals("pom.xml")) {
                        return file1.getAbsolutePath();
                    }
                }
            }
            return "";
        }
    }
    

    通过pom依赖和工具类构件maven jar

    1. 新建需要升级的项目工程的分支
    2. 构建升级jar包,放到项目空间目录中,与其他工程项目同级
    3. cmd打开命令行cd到项目空间目录中,执行命令
      java -jar pomup.jar username password http://github.com/username/xxxx

    说明:pomup.jar:构建的jar包名称
    username,password :git的用户名,密码
    http://github.com/username/xxxx:整体的git项目空间

    本文由博客一文多发平台 OpenWrite 发布!
    架构设计@工程设计@服务稳定性之路

  • 相关阅读:
    C++中虚继承的作用
    游戏程序设计学习初窥简单DirectX代码实现
    vue4.x更改默认端口 larry
    Visual studio 2010几个比较酷的功能
    Web前端编程:勿混淆NodeList与Array
    代码规范之署名
    一则中文文件名引起的问题
    C# WebService调用及数据并行处理
    2010年终总结
    关于DotNetNuke
  • 原文地址:https://www.cnblogs.com/coderManFans/p/11890195.html
Copyright © 2011-2022 走看看