国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

DevOps系列文章 之 Java使用jgit管理git倉(cāng)庫(kù)

這篇具有很好參考價(jià)值的文章主要介紹了DevOps系列文章 之 Java使用jgit管理git倉(cāng)庫(kù)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

最近設(shè)計(jì)基于gitops新的CICD方案,需要通過(guò)java讀寫git倉(cāng)庫(kù),這里簡(jiǎn)單記錄下。

在jgit中,存在最核心的三個(gè)組件:Git類,Repository類。Git類中包含了push commit之類的常見(jiàn)git操作,而Repository則實(shí)現(xiàn)了倉(cāng)庫(kù)的初始化和基本的管理功能。
Git類的實(shí)例都會(huì)持有一個(gè)Repository實(shí)例。

Repository類的初始化

針對(duì)一個(gè)git倉(cāng)庫(kù),我們一般會(huì)有三種方式獲得
1.新建一個(gè)空倉(cāng)庫(kù)

 Git git = Git.init().setDirectory(localPath).call()

2.加載一個(gè)已存在的倉(cāng)庫(kù)

Repository repository = builder.setGitDir(repoDir)
                .readEnvironment() // scan environment GIT_* variables
                .findGitDir() // scan up the file system tree
                .build()

3.從遠(yuǎn)程倉(cāng)庫(kù)下載

Git result = Git.cloneRepository()
                .setURI(REMOTE_URL)
                .setDirectory(localPath)
                .call()

JGit是一款pure java的軟件包,可以讀寫git倉(cāng)庫(kù),下面介紹基本使用。

引入jgit#

DevOps系列文章 之 Java使用jgit管理git倉(cāng)庫(kù),git

maven引入:

        <!-- jgit -->
        <dependency>
            <groupId>org.eclipse.jgit</groupId>
            <artifactId>org.eclipse.jgit</artifactId>
            <version>5.8.0.202006091008-r</version>
        </dependency>
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.6</version>
        </dependency>

jgit 有一個(gè)Git類,可以用來(lái)執(zhí)行常規(guī)的git操作

憑證管理#

通過(guò)CredentialsProvider管理憑證,常用的是UsernamePasswordCredentialsProvider

通過(guò)下面代碼初始化:

public static CredentialsProvider createCredential(String userName, String password) {
        return new UsernamePasswordCredentialsProvider(userName, password);
}

clone遠(yuǎn)程倉(cāng)庫(kù)#

git 命令:

git clone {repoUrl}

通過(guò)Git.cloneRepository 來(lái)clone遠(yuǎn)程倉(cāng)庫(kù),如果需要憑證,則需要指定credentialsProvider

 public static Git fromCloneRepository(String repoUrl, String cloneDir, CredentialsProvider provider) throws GitAPIException {
        Git git = Git.cloneRepository()
            .setCredentialsProvider(provider)
            .setURI(repoUrl)
            .setDirectory(new File(cloneDir)).call();
        return git;
}

commit#

git 命令:

git commit -a -m '{msg}'

commit比較簡(jiǎn)單,對(duì)應(yīng)commit方法, 注意需要先add

public static void commit(Git git, String message, CredentialsProvider provider) throws GitAPIException {
        git.add().addFilepattern(".").call();
        git.commit()
            .setMessage(message)
            .call();
}

push#

git 命令:

git push origin branchName

push直接調(diào)用push即可, 需要指定credentialsProvider

   public static void push(Git git, CredentialsProvider provider) throws GitAPIException, IOException {
        push(git,null,provider);
    }

    public static void push(Git git, String branch, CredentialsProvider provider) throws GitAPIException, IOException {
        if (branch == null) {
            branch = git.getRepository().getBranch();
        }
        git.push()
            .setCredentialsProvider(provider)
            .setRemote("origin").setRefSpecs(new RefSpec(branch)).call();
    }

讀取已有倉(cāng)庫(kù)#

如果git已經(jīng)clone了,想直接讀取,怎么辦?

 public static Repository getRepositoryFromDir(String dir) throws IOException {
        return new FileRepositoryBuilder()
            .setGitDir(Paths.get(dir, ".git").toFile())
            .build();
 }

讀取倉(cāng)庫(kù)日志#

可以通過(guò)RevWalk讀取倉(cāng)庫(kù)日志。

  • revWalk.parseCommit 可讀取一條commit
  • 遍歷revWalk,可讀取所有日志
 public static List<String> getLogs(Repository repository) throws IOException {
        return getLogsSinceCommit(repository, null, null);
    }

    public static List<String> getLogsSinceCommit(Repository repository, String commit) throws IOException {
        return getLogsSinceCommit(repository, null, commit);
    }

    public static List<String> getLogsSinceCommit(Repository repository, String branch, String commit) throws IOException {
        if (branch == null) {
            branch = repository.getBranch();
        }
        Ref head = repository.findRef("refs/heads/" + branch);
        List<String> commits = new ArrayList<>();
        if (head != null) {
            try (RevWalk revWalk = new RevWalk(repository)) {
                revWalk.markStart(revWalk.parseCommit(head.getObjectId()));
                for (RevCommit revCommit : revWalk) {
                    if (revCommit.getId().getName().equals(commit)) {
                        break;
                    }
                    commits.add(revCommit.getFullMessage());
                    System.out.println("\nCommit-Message: " + revCommit.getFullMessage());
                }
                revWalk.dispose();
            }
        }

        return commits;
    }

測(cè)試#

我們來(lái)先clone倉(cāng)庫(kù),然后修改,最后push

package com.devops.autocicdstore.git;

import org.apache.commons.io.FileUtils;
import org.eclipse.jgit.api.Git;
import org.eclipse.jgit.api.errors.GitAPIException;
import org.eclipse.jgit.transport.CredentialsProvider;

import java.io.File;
import java.io.IOException;
import java.nio.file.Paths;

import static com.devops.autocicdstore.git.GetRepositoryMgr.*;

/**
 * @Author 虎哥
 * @Description //TODO
 * |要帶著問(wèn)題去學(xué)習(xí),多猜想多驗(yàn)證|
 **/
public class TestMain {
    public static void main(String[] args) throws GitAPIException, IOException {
        String yaml = "dependencies:\n" +
                "- name: springboot-rest-demo\n" +
                "  version: 0.0.5\n" +
                "  repository: http://hub.hubHOST.com/chartrepo/ainote\n" +
                "  alias: demo\n" +
                "- name: exposecontroller\n" +
                "  version: 2.3.82\n" +
                "  repository: http://chartmuseum.jenkins-x.io\n" +
                "  alias: cleanup\n";
        CredentialsProvider provider = createCredential("USR_NAME", "PASSWORD");

        String cloneDir = "/tmp/test";

        Git git = fromCloneRepository("https://gitee.com/JavaBigDataStudy/auto-cicd-store.git", cloneDir, provider);

        // 修改文件

        FileUtils.writeStringToFile(Paths.get(cloneDir, "env", "requirements.yaml").toFile(), yaml, "utf-8");

        // 提交
        commit(git, "deploy(app): deploy  springboot-rest-demo:0.0.5 to env test", provider);
        // push 到遠(yuǎn)程倉(cāng)庫(kù)
        push(git, "master", provider);

        git.clean().call();
        git.close();

        FileUtils.deleteDirectory(new File(cloneDir));
    }
}
package com.devops.autocicdstore.git;

import org.eclipse.jgit.api.Git;
import org.eclipse.jgit.api.errors.GitAPIException;
import org.eclipse.jgit.lib.Ref;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.revwalk.RevCommit;
import org.eclipse.jgit.revwalk.RevWalk;
import org.eclipse.jgit.storage.file.FileRepositoryBuilder;
import org.eclipse.jgit.transport.CredentialsProvider;
import org.eclipse.jgit.transport.RefSpec;
import org.eclipse.jgit.transport.UsernamePasswordCredentialsProvider;

import java.io.File;
import java.io.IOException;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;

/**
 * @Author 虎哥
 * @Description //TODO
 * |要帶著問(wèn)題去學(xué)習(xí),多猜想多驗(yàn)證|
 **/
public class GetRepositoryMgr {
    public static CredentialsProvider createCredential(String userName, String password) {
        return new UsernamePasswordCredentialsProvider(userName, password);
    }

    public static void main(String[] args) throws GitAPIException, IOException {
//        String localPath = "D:\\SoftwareDev\\Code\\auto-cicd-store\\git-res";
//        String remotePath = "https://gitee.com/JavaBigDataStudy/auto-cicd-store.git";
//        CredentialsProvider provider = createCredential("XXXX","XXX");
//        //1
//
//        Git git = fromCloneRepository(remotePath,localPath,provider);
//        //2
//        commit(git,"test",provider);
//        //3
//        push(git,"dev",provider);
//        //4
//      //  getLogs()l

        Repository repository = getRepositoryFromDir("D:\\\\SoftwareDev\\\\Code\\\\auto-cicd-store\\\\git-res");
        List<String> logs = getLogs(repository);
        System.out.println(logs);

    }

    public static Git fromCloneRepository(String repoUrl, String cloneDir, CredentialsProvider provider) throws GitAPIException {
        Git git = Git.cloneRepository()
                .setCredentialsProvider(provider)
                .setURI(repoUrl)
                .setDirectory(new File(cloneDir)).call();
        return git;
    }
    public static Repository getRepositoryFromDir(String dir) throws IOException {
        return new FileRepositoryBuilder()
                .setGitDir(Paths.get(dir, ".git").toFile())
                .build();
    }
    public static void commit(Git git, String message, CredentialsProvider provider) throws GitAPIException {
        git.add().addFilepattern(".").call();
        git.commit()
                .setMessage(message)
                .call();
    }

    public static void push(Git git, CredentialsProvider provider) throws GitAPIException, IOException {
        push(git,null,provider);
    }

    public static void push(Git git, String branch, CredentialsProvider provider) throws GitAPIException, IOException {
        if (branch == null) {
            branch = git.getRepository().getBranch();
        }
        git.push()
                .setCredentialsProvider(provider)
                .setRemote("origin").setRefSpecs(new RefSpec(branch)).call();
    }

    public static List<String> getLogs(Repository repository) throws IOException {
        return getLogsSinceCommit(repository, null, null);
    }

    public static List<String> getLogsSinceCommit(Repository repository, String commit) throws IOException {
        return getLogsSinceCommit(repository, null, commit);
    }

    public static List<String> getLogsSinceCommit(Repository repository, String branch, String commit) throws IOException {
        if (branch == null) {
            branch = repository.getBranch();
        }
        Ref head = repository.findRef("refs/heads/" + branch);
        List<String> commits = new ArrayList<>();
        if (head != null) {
            try (RevWalk revWalk = new RevWalk(repository)) {
                revWalk.markStart(revWalk.parseCommit(head.getObjectId()));
                for (RevCommit revCommit : revWalk) {
                    if (revCommit.getId().getName().equals(commit)) {
                        break;
                    }
                    commits.add(revCommit.getFullMessage());
                    System.out.println("\nCommit-Message: " + revCommit.getFullMessage());
                }
                revWalk.dispose();
            }
        }

        return commits;
    }

}

讀取已有倉(cāng)庫(kù)的日志:文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-520897.html

 Repository repository = getRepositoryFromDir("GIT_DIR");
        List<String> logs = getLogs(repository);
        System.out.println(logs);

        RevCommit head = getLastCommit(repository);
        System.out.println(head.getFullMessage());

到了這里,關(guān)于DevOps系列文章 之 Java使用jgit管理git倉(cāng)庫(kù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • DevOps系列文章之 DevOps 運(yùn)維服務(wù)體系

    DevOps系列文章之 DevOps 運(yùn)維服務(wù)體系

    DevOps 體系是從原始運(yùn)維一步步走過(guò)來(lái)的,原始運(yùn)維好比是本,有了本進(jìn)而想繼續(xù)提升效率、減少出錯(cuò)、優(yōu)化流程,就發(fā)展到了 DevOps,AIOps……各種Ops 首先,運(yùn)維的業(yè)務(wù)職能規(guī)范后形成章程、綱領(lǐng),在互聯(lián)網(wǎng)快速發(fā)展的特點(diǎn)下,形成了一套應(yīng)對(duì)”快”和”變”的體系,并不停

    2024年02月12日
    瀏覽(24)
  • DevOps系列文章 之 Python基礎(chǔ)

    1.定義 1、集合是一個(gè)無(wú)序的,不重復(fù)的數(shù)據(jù)組合,它的主要作用如下: 1.去重,把一個(gè)列表變成集合,就自動(dòng)去重了 2.關(guān)系測(cè)試,測(cè)試兩組數(shù)據(jù)之前的交集、差集、并集等關(guān)系 2、集合類型 1.數(shù)學(xué)上,把set稱做由不同的元素組成的集合,集合(set)的成員通常被稱做集合元素

    2024年02月11日
    瀏覽(22)
  • DevOps系列文章 之 Python 基礎(chǔ)

    考點(diǎn):字符串:str( )、整型數(shù):int( )、浮點(diǎn)數(shù):float( ) 考點(diǎn):條件分支 考點(diǎn):引入隨機(jī)數(shù) 考點(diǎn):while循環(huán)語(yǔ)句 考點(diǎn):for循環(huán)語(yǔ)句 Python語(yǔ)言支持以下類型的運(yùn)算符 以下假設(shè)變量a為10,變量b為20: 運(yùn)算符 描述 實(shí)例 + 加 - 兩個(gè)對(duì)象相加 a + b 輸出結(jié)果 30 - 減 - 得到負(fù)數(shù)或是一個(gè)

    2024年02月11日
    瀏覽(20)
  • DevOps系列文章 之 Springboot單元測(cè)試

    在沒(méi)有代碼生成工具或嘗試一門新的 ORM 框架時(shí),當(dāng)我們希望不去另外寫 Service 和 Controller 來(lái)驗(yàn)證 DAO 層的代碼不希望只通過(guò)接口請(qǐng)求的方式來(lái)驗(yàn)證時(shí),這時(shí)候單元測(cè)試的方式就可以幫助我們滿足這一需求。 在我們開(kāi)發(fā)Web應(yīng)用時(shí),經(jīng)常會(huì)直接去觀察結(jié)果進(jìn)行測(cè)試。雖然也是一

    2024年02月15日
    瀏覽(18)
  • DevOps系列文章 之 linux ab壓力測(cè)試

    1、安裝 2、檢測(cè)版本 3、常用 4、解釋

    2024年02月16日
    瀏覽(27)
  • DevOps系列文章之 GitLab CI/CD

    DevOps系列文章之 GitLab CI/CD

    由于目前公司使用的gitlab,大部分項(xiàng)目使用的CICD是gitlab的CICD,少部分用的是jenkins,使用了gitlab-ci一段時(shí)間后感覺(jué)還不錯(cuò),因此總結(jié)一下 介紹gitlab的CICD之前,可以先了解CICD是什么 我們的開(kāi)發(fā)模式經(jīng)歷了如下的轉(zhuǎn)變:瀑布模型-敏捷開(kāi)發(fā)→DevOps(Development、Operations的組合詞,是

    2024年01月22日
    瀏覽(62)
  • DevOps系列文章 之 Docker in Docker

    一、 ?背景介紹 工作中,要實(shí)現(xiàn)在docker中運(yùn)行docker,實(shí)現(xiàn)鏡像的拉取,創(chuàng)建,修改,上傳等操作。 嘗試過(guò)在docker中,安裝docker。行不通,服務(wù)起不來(lái)。 而且直接在 docker 容器內(nèi)嵌套安裝 docker 未免太過(guò)臃腫。 內(nèi)部安裝與運(yùn)行Docker無(wú)疑增加了服務(wù)器鏡像的大小,同時(shí)還增加D

    2024年02月16日
    瀏覽(20)
  • DevOps系列文章 之 docker 制作kafka鏡像

    Docker制作Kafka鏡像教程 概述 本教程將指導(dǎo)你如何使用Docker制作一個(gè)Kafka鏡像。Kafka是一個(gè)高性能、分布式的消息隊(duì)列系統(tǒng),用于處理大規(guī)模的實(shí)時(shí)數(shù)據(jù)流。使用Docker制作Kafka鏡像可以方便地部署和管理Kafka集群。 整體流程 下面是制作Kafka鏡像的整體流程: 步驟1:安裝Docker 首先

    2024年02月15日
    瀏覽(58)
  • DevOps系列文章之 Spring Boot Docker打包

    DevOps系列文章之 Spring Boot Docker打包

    應(yīng)用準(zhǔn)備容器化,因?yàn)閹资畟€(gè)應(yīng)用從測(cè)試到發(fā)布太麻煩了,而且還會(huì)因?yàn)榄h(huán)境的因素導(dǎo)致部署中出現(xiàn)各種問(wèn)題。為了在開(kāi)發(fā)、測(cè)試、生產(chǎn)都能保持一致的環(huán)境,就引進(jìn)了容器技術(shù),而目前常用的應(yīng)用使用基于spring boot的。 在Spring Boot應(yīng)用中,我們可以約定不同的標(biāo)識(shí)來(lái)定義不

    2024年02月11日
    瀏覽(25)
  • DevOps系列文章-Kubernetes實(shí)現(xiàn)CI與CD配置

    DevOps系列文章-Kubernetes實(shí)現(xiàn)CI與CD配置

    基于 Kubernetes 實(shí)現(xiàn) CI/CD 配置,其實(shí)和往常那些 CI/CD 配置并沒(méi)有太大區(qū)別。都是通過(guò) 提交代碼,拉取代碼,構(gòu)建代碼,發(fā)布代碼來(lái)實(shí)現(xiàn)的。 只不過(guò)要是通過(guò) K8s 來(lái)實(shí)現(xiàn)的話,則是需要將構(gòu)建好的代碼打包成鏡像,通過(guò)鏡像的方式來(lái)運(yùn)行。 CI/CD 流程圖: 開(kāi)發(fā)將代碼提交代碼倉(cāng)

    2024年02月05日
    瀏覽(22)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包