通过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 + "\n");
                        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 + "\n");
                            newIndex = 0;
                            continue;
                        } else {
                            if (i == lines.size() - 1) {
                                builder.append(line);
                            } else {
                                builder.append(line + "\n");
                            }
                        }
                    }
                }
                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 发布!
架构设计@工程设计@服务稳定性之路

posted @ 2019-11-19 16:08  程序男  阅读(908)  评论(0编辑  收藏  举报