当前位置: 首页 > 知识库问答 >
问题:

Spring云配置服务器是否也可以将配置更新推送到远程git repo?

弘思聪
2023-03-14

在Spring云配置服务器克隆git repo并正确地提供文件后,它还可以对这些文件进行更改并将其推回远程git repo吗?或者该功能必须在运行配置服务器的应用程序中编写?

共有2个答案

朱修真
2023-03-14

对于其他感兴趣的人,我自动连接了SpringJgitenEnvironmentRepository,并包装了一些附加功能。我使用FileUtils来处理文件操作,然后使用JGitBean编写了一个基本服务:

@Autowired private JGitEnvironmentRepository jgit;

@Value("${spring.cloud.config.server.git.uri}.git")
private String remoteRepoURL;

@Value("${spring.cloud.config.server.git.username}")
private String username;

@Value("${spring.cloud.config.server.git.password}")
private String password;

private Git git = null;
private Repository localRepo ;
private CredentialsProvider creds;

public File getWorkingDirectory(){
    return jgit.getBasedir();
}

public void updateLocalRepo() throws Exception {
    log.info("Updating the local repository.");
    init();
    git.pull()
        .setCredentialsProvider( creds )
        .call();
}

public void commitAndPushRepository(String commitMessage) throws Exception {
    init();
    git.commit()
        .setAll(true)
        .setMessage(commitMessage)
        .call();

    git.push()
        .setCredentialsProvider( creds )
        .call();

    log.info("Pushed local repository with message [" + commitMessage+"].");
}//end commitAndPush

private void init() throws IOException {
    if(git!=null) return;

    String repoPath = jgit.getBasedir().getPath();
    localRepo = new FileRepository(repoPath + "/.git");
    git = new Git(localRepo);
    StoredConfig config = git.getRepository().getConfig();
    config.setString("remote", "origin", "url", remoteRepoURL);
    config.save();
    creds = new UsernamePasswordCredentialsProvider(username, password);
    log.info("Initialized local repository at path " + repoPath);
}

这里是文件服务:

@Autowired private GitService gitService;

public void updateFile(String author, String fileName, String newContent) throws Exception{
    Assert.hasLength(fileName, "File name must not be null.");
    Assert.hasLength(newContent, "File must contain content.");
    Assert.hasLength(author, "Unable to update file without author logging.");

    gitService.updateLocalRepo();

    File workingDirectory = gitService.getWorkingDirectory();

    log.info("Updating file [" + fileName + "] in the working dir " + workingDirectory);

    File matchingFile = findFileWithName(workingDirectory, fileName);
    Assert.notNull(matchingFile, "No file with name " + fileName + " was found.");

    FileUtils.write(matchingFile, newContent);
    gitService.commitAndPushRepository( buildCommitMessage(author, fileName) );
}//end updateFile

public String getConfigFileContents(String fileName) throws Exception {
    gitService.updateLocalRepo();
    File file = findFileWithName(gitService.getWorkingDirectory(), fileName);
    Assert.notNull(file, "No file with name " + fileName + " found.");
    return FileUtils.readFileToString( file );
}

public Collection<String> getAllConfigFileNames() throws Exception{
    gitService.updateLocalRepo();
    Collection<String> fileNames = new ArrayList<>();
    Collection<File> allFiles = FileUtils.listFiles(gitService.getWorkingDirectory(), TrueFileFilter.INSTANCE, TrueFileFilter.INSTANCE);
    for(File file : allFiles) {
        fileNames.add(file.getName());
    }//end foreach file

    return fileNames;
}

private String buildCommitMessage(String author, String fileName) {
    return "Author of commit on [" + fileName + "]: " + author;
}

private File findFileWithName(File workingDirectory, String fileName) {
    Collection<File> allFiles = FileUtils.listFiles(workingDirectory, TrueFileFilter.INSTANCE, TrueFileFilter.INSTANCE);
    for(File file : allFiles) {
        if(fileName.equals(file.getName())){
            return file;
        }//endif found
    }//end foreach file

    return null;
}//end findFileWIthName
幸经艺
2023-03-14

不,它不会写字。配置服务器是远程git存储库的只读客户端。

 类似资料:
  • 我正在使用Spring Cloud Config服务器,能够检测来自git存储库的更改并将其传递给配置客户机。 有两种方法,我已经实现了: null 所以两者都工作得很好,那么使用Spring Cloud Bus有什么好处吗?或者在生产环境中,不使用Spring Cloud Bus会有什么问题吗?因为将需要额外的工作来设置RabbitMQ集群(HA)作为生产中的Spring云总线。 谢谢,大卫

  • 我想实现以下目标: 在“开发”模式下,在当前webapp中执行Spring云配置 因此,当前webapp的类路径包含对配置服务器和客户端的依赖关系: 在开发模式下,并在引导程序中具有以下属性。yml,没问题(嵌入式配置服务器已配置并启动) 当不在'dev'模式(例如spring.profiles.active=prod)时,当前的webapp不会启动:它无法自动装配我的属性(我猜嵌入式服务器是以错

  • 我已经使用spring开发了配置服务器。 我的申请书。java是 我的bootstrap.properties档案 我的配置服务器客户端开发。属性文件 我使用了git init、git add和git commit命令将我的文件添加到本地git。 但是当我运行应用程序并进入http://localhost:8888/client-config/development 它不显示我的属性值。 应用程序

  • 我正在尝试设置一个SpringCloudConfig服务器,它使用SSH密钥从GitRepo获取配置。它使用SpringBootVersion2.1运行。0.0版本和springCloudVersion格林威治。M3。 当在下面的配置中使用带有用户名和密码的https bitbucket URI时,配置服务工作正常,没有问题: 但我们必须迁移到使用ssh密钥,而不是使用以下配置的用户名和密码: i

  • 我正在尝试创建SpringCloudConfigServer,以便使用SSHURI连接到git存储库(bitbucket)。我正在关注Spring云配置 我使用ssh-keygen实用工具生成了密钥对,并粘贴了。发布文件内容在我的bitbucket帐户的ssh部分,但当我运行作为spring启动应用程序的服务器时,我得到无效的privateKey异常。 我也使用了这个堆栈溢出帖子中提供的建议,但是

  • 我正在使用Spring Cloud配置服务器,我需要为每个阶段的产品测试和开发创建一个配置文件,我已经为默认配置文件创建了4个yml文件application.yml,为每个配置文件创建了应用程序-{配置文件},所以我的问题是如何通过环境变量加载特定的配置,并在每个配置文件配置和端口上运行配置服务器,我已经创建了一个bootstrap.yml但我不能解决这个问题。如果有人能指导我完成这些步骤来满足