Если у вас действительно есть проблема из-за локальных изменений в Readme.Rmd
, вы можете игнорировать эти изменения с помощью:
git update-index --assume-unchanged -- Readme.Rmd
Затем проверьте еще раз, если ваша проблема сохраняется.
Я не думаю поддержки знатока, развертывающиеся в несколько репозиториев для единственного профиля, но возможно представляет, мог изменить идентификатор и URL репозитория.
<distributionManagement>
<repository>
<id>${repo-id}</id>
<name>${repo-name}</name>
<url>${repo-url}</url>
</repository>
</distributionManagement>
Затем используйте профили для выбора который repo развернуться к:
<profiles>
<profile>
<id>repo1</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<repo-id>repo1</repo-id>
<repo-name>Repo1 Name </repo-name>
<repo-url>http://url.com/maven2</repo-url>
</properties>
</profile>
<profile>
<id>repo2</id>
<properties>
<repo-id>repo2</repo-id>
<repo-name>Repo2 Name </repo-name>
<repo-url>http://url2.com/maven2</repo-url>
</properties>
</profile>
</profiles>
Artifactory действительно имеет автоматическую функцию экспорта. Из документации:
Можно автоматически и периодически создавать резервную копию целой системы Artifactory. Процесс резервного копирования создает каталог с меткой времени (или zip-файл) в целевом резервном dir и в основном идентичен выполнению полного системного экспорта с метаданными. [...] Каждое резервное копирование может иметь свое собственное расписание и исключило определенные репозитории [...]
Содержание резервного копирования (при извлечении) находится в стандартном формате Знатока и может быть загружено в любой внешний репозиторий Знатока [...]
Поддержки Artifactory, создающие резервную копию инкрементно к тому же целевому каталогу (названный "текущим") в целевом резервном dir. Этот вид резервного копирования только пишет дельты в выходной dir, приводя к чрезвычайно быстрым резервным копиям.
Не то, что точно, в чем Вы нуждаетесь? Для передачи файлов можно или смонтировать общий каталог к удаленному серверу и сделать резервное копирование там или сделать резервное копирование локально и затем rsync это.
Я думаю в Artifactory, по умолчанию, он поддерживает различные логические репозитории для загрузки снимков и неснимков. Используя полномочия, можно сделать репозиторий снимка видимым только некоторым.
Если это не достаточно, другое решение, которое работает с Artifactory 2.0, состоит в том, чтобы сделать, чтобы Artifactory использовал базу данных MySQL, которая делает асинхронную репликацию к другой базе данных MySQL, которая в свою очередь читается отдельной установкой Artifactory. Если это - слишком реальное время, у Вас может просто быть две различных установки, которые делают обновления на основе бизнес-правил.
Если вы хотите использовать настраиваемый подключаемый модуль, вы можете настроить Maven для развертывания в списке «зеркальных» расположений одновременно со стандартным развертыванием. Я бы рекомендовал определить это в профиле, чтобы вы могли контролировать, какие развертывания зеркалируются (это может быть нецелесообразно делать это при каждой сборке).
Чтобы определить новый плагин, вам необходимо создать новый проект Maven и указать POM имеет упаковку maven-plugin :
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>name.seller.rich</groupId>
<artifactId>maven-mirror-plugin</artifactId>
<packaging>maven-plugin</packaging>
<version>0.0.1</version>
<dependencies>
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-plugin-api</artifactId>
<version>2.2.0</version>
</dependency>
<dependency>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.4</version>
</dependency>
</dependencies>
</project>
В src / main / java определите Mojo. В приведенном ниже коде объявляется «зеркальная» цель, требуется список элементов mirrorRepository (содержащий repositoryId и url) для зеркалирования развертывания артефакта. Плагин использует тот же подход к развертыванию, что и maven-deploy-plugin, и принимает большинство тех же параметров.
Обратите внимание, что вам все равно нужно определить сервер в ваших настройках. xml для каждого репозитория с соответствующими разрешениями на развертывание, иначе сборка завершится неудачно!
package name.seller.rich;
import java.io.File;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.deployer.ArtifactDeployer;
import org.apache.maven.artifact.deployer.ArtifactDeploymentException;
import org.apache.maven.artifact.metadata.ArtifactMetadata;
import org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.artifact.repository.ArtifactRepositoryFactory;
import org.apache.maven.artifact.repository.layout.ArtifactRepositoryLayout;
import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.MojoFailureException;
import org.apache.maven.project.MavenProject;
import org.apache.maven.project.artifact.ProjectArtifactMetadata;
/**
* @goal mirror
* @phase deploy
*/
public class MirrorMojo extends AbstractMojo {
/**
* @parameter expression=
* "${component.org.apache.maven.artifact.deployer.ArtifactDeployer}"
* @required
* @readonly
*/
private ArtifactDeployer deployer;
/**
* Map that contains the layouts
*
* @component role=
* "org.apache.maven.artifact.repository.layout.ArtifactRepositoryLayout"
*/
private Map repositoryLayouts;
/**
* Component used to create a repository
*
* @component
*/
private ArtifactRepositoryFactory repositoryFactory;
/**
* The type of remote repository layout to deploy to. Try <i>legacy</i> for
* a Maven 1.x-style repository layout.
*
* @parameter expression="${repositoryLayout}" default-value="default"
* @required
*/
private String repositoryLayout;
/**
* Parameter used to update the metadata to make the artifact as release.
*
* @parameter expression="${updateReleaseInfo}" default-value="false"
*/
private boolean updateReleaseInfo;
/**
* Whether to deploy snapshots with a unique version or not.
*
* @parameter expression="${uniqueVersion}" default-value="true"
*/
private boolean uniqueVersion;
/**
* @parameter expression="${mirrorRepositories}"
* @required
*/
private MirrorRepository[] mirrorRepositories;
/**
* @parameter expression="${localRepository}"
* @required
* @readonly
*/
private ArtifactRepository localRepository;
/**
* @parameter expression="${project}"
* @required
* @readonly
*/
private MavenProject project;
/**
* Deploy all artifacts for the project to each mirror repository.
*/
public void execute() throws MojoExecutionException, MojoFailureException {
ArtifactRepositoryLayout layout;
layout = (ArtifactRepositoryLayout) repositoryLayouts
.get(repositoryLayout);
for (int i = 0; i < mirrorRepositories.length; i++) {
MirrorRepository mirrorRepository = mirrorRepositories[i];
ArtifactRepository deploymentRepository = repositoryFactory
.createDeploymentArtifactRepository(mirrorRepository
.getRepositoryId(), mirrorRepository.getUrl(),
layout, uniqueVersion);
String protocol = deploymentRepository.getProtocol();
if ("".equals(protocol) || protocol == null) {
throw new MojoExecutionException("No transfer protocol found.");
}
deployToRepository(deploymentRepository);
}
}
/**
* Deploy all artifacts to the passed repository.
*/
private void deployToRepository(ArtifactRepository repo)
throws MojoExecutionException {
String protocol = repo.getProtocol();
if (protocol.equalsIgnoreCase("scp")) {
File sshFile = new File(System.getProperty("user.home"), ".ssh");
if (!sshFile.exists()) {
sshFile.mkdirs();
}
}
File pomFile = project.getFile();
Artifact artifact = project.getArtifact();
// Deploy the POM
boolean isPomArtifact = "pom".equals(project.getPackaging());
if (!isPomArtifact) {
ArtifactMetadata metadata = new ProjectArtifactMetadata(artifact,
pomFile);
artifact.addMetadata(metadata);
}
if (updateReleaseInfo) {
artifact.setRelease(true);
}
try {
List attachedArtifacts = project.getAttachedArtifacts();
if (isPomArtifact) {
deployer.deploy(pomFile, artifact, repo, localRepository);
} else {
File file = artifact.getFile();
if (file != null && !file.isDirectory()) {
deployer.deploy(file, artifact, repo, localRepository);
} else if (!attachedArtifacts.isEmpty()) {
getLog()
.info(
"No primary artifact to deploy, deploy attached artifacts instead.");
} else {
String message = "The packaging for this project did not assign a file to the build artifact";
throw new MojoExecutionException(message);
}
}
for (Iterator i = attachedArtifacts.iterator(); i.hasNext();) {
Artifact attached = (Artifact) i.next();
deployer.deploy(attached.getFile(), attached, repo,
localRepository);
}
} catch (ArtifactDeploymentException e) {
throw new MojoExecutionException(e.getMessage(), e);
}
}
}
Mojo ссылается на тип MirrorRepository для инкапсуляции repositoryId и url, это простой bean-компонент:
package name.seller.rich;
public class MirrorRepository {
private String repositoryId;
private String url;
public String getRepositoryId() {
return repositoryId;
}
public void setRepositoryId(String repositoryId) {
this.repositoryId = repositoryId;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
}
Вот пример конфигурации с использованием подключаемого модуля. Обратите внимание, что поддерживаются все форматы развертывания (http, scp, ftp):
<plugin>
<groupId>name.seller.rich</groupId>
<artifactId>maven-mirror-plugin</artifactId>
<executions>
<execution>
<id>mirror</id>
<phase>deploy</phase>
<goals>
<goal>mirror</goal>
</goals>
</execution>
</executions>
<configuration>
<mirrorRepositories>
<mirrorRepository>
<repositoryId>mirror</repositoryId>
<url>http://path/to/mirror</url>
</mirrorRepository>
</mirrorRepositories>
<!--any other deploy configuration needed-->
</configuration>
</plugin>