欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

通过jgit一次性升级fastjson版本

程序员文章站 2022-05-10 09:08:50
背景:笔者所在公司经历了三次fastjson的升级,由于集群,工程数量众多,每次升级都很麻烦。因此开发了一个java的升级工具。 功能介绍: 功能介绍:一个jar文件,通过java jar命令,输入用户名,密码,所负责的git项目主目录,即可对所负责的本地工作区目录下的项目工程中的pom.xml文件 ......

背景:笔者所在公司经历了三次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 发布!
架构设计@工程设计@服务稳定性之路