Upgrade fastjson version once through jgit

Keywords: Java git Eclipse xml

Background: the company where I work has experienced three fastjson upgrades. Due to the large number of clusters and projects, each upgrade is very troublesome. So we developed a java upgrade tool.
Function introduction:

Function introduction: a jar file, through the Java jar command, enter the user name, password, and the main directory of git project, you can detect the pom.xml file in the project project project under the directory of your local workspace, and then upgrade the low version fastjson to the latest version directly.
pom dependence:

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

Tool kit:

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();
        }
        //Set the post memory, otherwise Error writing request body to server may be reported
        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);
    }

    //Switching branches
    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("Branch switch succeeded");
        } catch (Exception e) {
            System.out.println("It is already the current branch, no need to switch!");
        } finally {
            if (git != null) {
                git.close();
            }
        }
    }

    public static void main(String[] args) throws Exception {
        if(args.length<2){
            System.out.println("Please input git User name&Password!");
            return;
        }
        //Get input parameters
        String username = args[0];
        String password = args[1];
        //git user groups for remote projects, such as http://github.com/fanchunshuai/ are used to switch branch code from remote Downloads
        String uri = args[2];

        System.out.println("User name:"+username+",Password:*********");
        CredentialsProvider credentialsProvider = getCredentialsProvider(username, password);
        //Put the jar file of this tool class into the directory of all local projects, and level with the project code directory
        String localDir = System.getProperty("user.dir");
        System.out.println("Current project space:"+localDir);

        File file = new File(localDir);
        Set<String> checkSet = new HashSet<>();

        for (File childFile : file.listFiles()){

            //Check whether there is a git file in the air of the current project

            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+" Not in remote git In the project,ignore");
                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 = "";

            //Branch format verification
            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+"Not standard branch format");
                        continue;
                    }
                    if(branchArray[2].split("-").length < 3){
                        System.out.println(branchName+"Not standard branch format");
                        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("The branches that need to be fixed are:" + 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 The file format is UTF-8........");
                }catch (Exception e){
                    lines = Files.readAllLines(Paths.get(path), Charset.forName("GBK"));
                    System.out.println("POM.xml The file format is 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("\\.");
                                //Replace here
                                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();
                //Submission
                git.commit().setMessage("update fastjson to 1.2.60 auto by qypomup.jar").call();
                //Push to remote
                //Push
                git.push().setCredentialsProvider(credentialsProvider).call();
                System.out.println("Congratulations,Self help upgrade fastjson&Code submission completed! Upgrade branch to:"+newBranch);
            }
        }

        if(checkSet.size()>0){
            checkSet.forEach(str->{
                System.out.println("Current branch["+str+"]Medium pom.xml File does not contain fastjson rely on,Please check by hand!");
            });
        }
    }

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

maven jar through pom dependency and tool class component

  1. New branch of project engineering to be upgraded
  2. Build the upgrade jar package and put it in the project space directory, which is the same level as other projects.
  3. cmd open the command line cd to the project space directory and execute the command
    java -jar \pomup.jar username password http://github.com/username/xxxx

Description: pomup.jar: the name of the built jar package
Username, password: the user name and password of GIT
http://github.com/username/xxxx: overall git project space

This article is based on the platform of blog one article multiple sending OpenWrite Release!
Architecture Design @ engineering design @ road to service stability

Posted by bhola on Tue, 19 Nov 2019 06:29:26 -0800