mirror of
https://github.com/theonedev/onedev.git
synced 2025-12-08 18:26:30 +00:00
feat: able to use k8s helper image from custom registry (#1408)
This commit is contained in:
parent
92aa5bcfce
commit
7c56912426
4
pom.xml
4
pom.xml
@ -9,7 +9,7 @@
|
|||||||
<version>1.2.0</version>
|
<version>1.2.0</version>
|
||||||
</parent>
|
</parent>
|
||||||
<artifactId>server</artifactId>
|
<artifactId>server</artifactId>
|
||||||
<version>8.3.4</version>
|
<version>8.3.5</version>
|
||||||
<packaging>pom</packaging>
|
<packaging>pom</packaging>
|
||||||
<build>
|
<build>
|
||||||
<finalName>${project.groupId}.${project.artifactId}-${project.version}</finalName>
|
<finalName>${project.groupId}.${project.artifactId}-${project.version}</finalName>
|
||||||
@ -615,7 +615,7 @@
|
|||||||
</repositories>
|
</repositories>
|
||||||
<properties>
|
<properties>
|
||||||
<commons.version>2.7.16</commons.version>
|
<commons.version>2.7.16</commons.version>
|
||||||
<agent.version>1.8.16</agent.version>
|
<agent.version>1.8.17</agent.version>
|
||||||
<slf4j.version>1.7.36</slf4j.version>
|
<slf4j.version>1.7.36</slf4j.version>
|
||||||
<logback.version>1.2.11</logback.version>
|
<logback.version>1.2.11</logback.version>
|
||||||
<antlr.version>4.7.2</antlr.version>
|
<antlr.version>4.7.2</antlr.version>
|
||||||
|
|||||||
@ -7,7 +7,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>io.onedev</groupId>
|
<groupId>io.onedev</groupId>
|
||||||
<artifactId>server</artifactId>
|
<artifactId>server</artifactId>
|
||||||
<version>8.3.4</version>
|
<version>8.3.5</version>
|
||||||
</parent>
|
</parent>
|
||||||
<build>
|
<build>
|
||||||
<plugins>
|
<plugins>
|
||||||
|
|||||||
@ -5434,4 +5434,27 @@ public class DataMigrator {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void migrate126(File dataDir, Stack<Integer> versions) {
|
||||||
|
for (File file: dataDir.listFiles()) {
|
||||||
|
if (file.getName().startsWith("Settings.xml")) {
|
||||||
|
VersionedXmlDoc dom = VersionedXmlDoc.fromFile(file);
|
||||||
|
for (Element element: dom.getRootElement().elements()) {
|
||||||
|
String key = element.elementTextTrim("key");
|
||||||
|
if (key.equals("JOB_EXECUTORS")) {
|
||||||
|
Element valueElement = element.element("value");
|
||||||
|
if (valueElement != null) {
|
||||||
|
for (Element executorElement: valueElement.elements()) {
|
||||||
|
if (executorElement.getName().contains("KubernetesExecutor")
|
||||||
|
|| executorElement.getName().contains("DockerExecutor")) {
|
||||||
|
executorElement.addElement("imageMappings");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
dom.writeToFile(file, false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -0,0 +1,40 @@
|
|||||||
|
package io.onedev.server.model.support;
|
||||||
|
|
||||||
|
import io.onedev.agent.job.ImageMappingFacade;
|
||||||
|
import io.onedev.server.annotation.Editable;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
|
||||||
|
@Editable
|
||||||
|
public class ImageMapping implements Serializable {
|
||||||
|
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
private String from;
|
||||||
|
|
||||||
|
private String to;
|
||||||
|
|
||||||
|
@Editable(order=100, description = "A Java regular expression matching image (registry/repo:tag)")
|
||||||
|
public String getFrom() {
|
||||||
|
return from;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setFrom(String from) {
|
||||||
|
this.from = from;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Editable(order=200, description = "Target image to use. Note that group reference can be used to " +
|
||||||
|
"refer to part of original image based on defined from pattern")
|
||||||
|
public String getTo() {
|
||||||
|
return to;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTo(String to) {
|
||||||
|
this.to = to;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ImageMappingFacade getFacade() {
|
||||||
|
return new ImageMappingFacade(from, to);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -4,7 +4,7 @@ import java.io.Serializable;
|
|||||||
|
|
||||||
import javax.validation.constraints.NotEmpty;
|
import javax.validation.constraints.NotEmpty;
|
||||||
|
|
||||||
import io.onedev.k8shelper.RegistryLoginFacade;
|
import io.onedev.agent.job.RegistryLoginFacade;
|
||||||
import io.onedev.server.annotation.Editable;
|
import io.onedev.server.annotation.Editable;
|
||||||
import io.onedev.server.annotation.Password;
|
import io.onedev.server.annotation.Password;
|
||||||
|
|
||||||
|
|||||||
@ -1,28 +1,27 @@
|
|||||||
package io.onedev.server.git;
|
package io.onedev.server.git;
|
||||||
|
|
||||||
import java.io.File;
|
|
||||||
import java.io.IOException;
|
|
||||||
|
|
||||||
import javax.annotation.Nullable;
|
|
||||||
|
|
||||||
import org.eclipse.jgit.api.AddCommand;
|
|
||||||
import org.eclipse.jgit.api.CommitCommand;
|
|
||||||
import org.eclipse.jgit.api.Git;
|
|
||||||
import org.eclipse.jgit.api.RmCommand;
|
|
||||||
import org.eclipse.jgit.api.errors.GitAPIException;
|
|
||||||
import org.eclipse.jgit.diff.DiffAlgorithm.SupportedAlgorithm;
|
|
||||||
import org.eclipse.jgit.lib.ConfigConstants;
|
|
||||||
import org.eclipse.jgit.lib.PersonIdent;
|
|
||||||
import org.eclipse.jgit.lib.RefUpdate;
|
|
||||||
import org.junit.Assert;
|
|
||||||
import org.mockito.Mockito;
|
|
||||||
import org.slf4j.Logger;
|
|
||||||
import org.slf4j.LoggerFactory;
|
|
||||||
|
|
||||||
import io.onedev.commons.loader.AppLoader;
|
import io.onedev.commons.loader.AppLoader;
|
||||||
import io.onedev.commons.loader.AppLoaderMocker;
|
import io.onedev.commons.loader.AppLoaderMocker;
|
||||||
import io.onedev.commons.utils.FileUtils;
|
import io.onedev.commons.utils.FileUtils;
|
||||||
import io.onedev.server.git.location.GitLocation;
|
import io.onedev.server.git.location.GitLocation;
|
||||||
|
import org.eclipse.jgit.api.AddCommand;
|
||||||
|
import org.eclipse.jgit.api.CommitCommand;
|
||||||
|
import org.eclipse.jgit.api.Git;
|
||||||
|
import org.eclipse.jgit.api.RmCommand;
|
||||||
|
import org.eclipse.jgit.api.errors.GitAPIException;
|
||||||
|
import org.eclipse.jgit.internal.storage.file.FileRepository;
|
||||||
|
import org.eclipse.jgit.lib.PersonIdent;
|
||||||
|
import org.eclipse.jgit.lib.RefUpdate;
|
||||||
|
import org.eclipse.jgit.storage.file.FileBasedConfig;
|
||||||
|
import org.eclipse.jgit.util.FS;
|
||||||
|
import org.junit.Assert;
|
||||||
|
import org.mockito.Mockito;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import javax.annotation.Nullable;
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
public abstract class AbstractGitTest extends AppLoaderMocker {
|
public abstract class AbstractGitTest extends AppLoaderMocker {
|
||||||
|
|
||||||
@ -38,19 +37,20 @@ public abstract class AbstractGitTest extends AppLoaderMocker {
|
|||||||
protected void setup() {
|
protected void setup() {
|
||||||
gitDir = FileUtils.createTempDir();
|
gitDir = FileUtils.createTempDir();
|
||||||
|
|
||||||
try {
|
try (var ignored = Git.init().setInitialBranch("main").setBare(false).setDirectory(gitDir).call()) {
|
||||||
git = Git.init().setInitialBranch("main").setBare(false).setDirectory(gitDir).call();
|
|
||||||
} catch (IllegalStateException | GitAPIException e) {
|
} catch (IllegalStateException | GitAPIException e) {
|
||||||
throw new RuntimeException(e);
|
throw new RuntimeException(e);
|
||||||
}
|
}
|
||||||
|
|
||||||
var config = git.getRepository().getConfig();
|
|
||||||
config.setEnum(ConfigConstants.CONFIG_DIFF_SECTION, null,
|
|
||||||
ConfigConstants.CONFIG_KEY_ALGORITHM, SupportedAlgorithm.HISTOGRAM);
|
|
||||||
config.setBoolean(ConfigConstants.CONFIG_COMMIT_SECTION, null,
|
|
||||||
ConfigConstants.CONFIG_KEY_GPGSIGN, false);
|
|
||||||
try {
|
try {
|
||||||
config.save();
|
git = Git.wrap(new FileRepository(new File(gitDir, ".git")) {
|
||||||
|
@Override
|
||||||
|
public FileBasedConfig getConfig() {
|
||||||
|
// avoid loading user config
|
||||||
|
return new FileBasedConfig(new File(getDirectory(), "config"), FS.DETECTED);
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
throw new RuntimeException(e);
|
throw new RuntimeException(e);
|
||||||
}
|
}
|
||||||
@ -92,7 +92,7 @@ public abstract class AbstractGitTest extends AppLoaderMocker {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void teardown() {
|
protected void teardown() {
|
||||||
git.close();
|
git.getRepository().close();
|
||||||
FileUtils.deleteDir(gitDir, 3);
|
FileUtils.deleteDir(gitDir, 3);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -6,7 +6,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>io.onedev</groupId>
|
<groupId>io.onedev</groupId>
|
||||||
<artifactId>server</artifactId>
|
<artifactId>server</artifactId>
|
||||||
<version>8.3.4</version>
|
<version>8.3.5</version>
|
||||||
</parent>
|
</parent>
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<dependency>
|
<dependency>
|
||||||
|
|||||||
@ -6,7 +6,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>io.onedev</groupId>
|
<groupId>io.onedev</groupId>
|
||||||
<artifactId>server-plugin</artifactId>
|
<artifactId>server-plugin</artifactId>
|
||||||
<version>8.3.4</version>
|
<version>8.3.5</version>
|
||||||
</parent>
|
</parent>
|
||||||
<build>
|
<build>
|
||||||
<resources>
|
<resources>
|
||||||
|
|||||||
@ -5,7 +5,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>io.onedev</groupId>
|
<groupId>io.onedev</groupId>
|
||||||
<artifactId>server-plugin</artifactId>
|
<artifactId>server-plugin</artifactId>
|
||||||
<version>8.3.4</version>
|
<version>8.3.5</version>
|
||||||
</parent>
|
</parent>
|
||||||
<properties>
|
<properties>
|
||||||
<moduleClass>io.onedev.server.plugin.authenticator.ldap.LdapModule</moduleClass>
|
<moduleClass>io.onedev.server.plugin.authenticator.ldap.LdapModule</moduleClass>
|
||||||
|
|||||||
@ -5,7 +5,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>io.onedev</groupId>
|
<groupId>io.onedev</groupId>
|
||||||
<artifactId>server-plugin</artifactId>
|
<artifactId>server-plugin</artifactId>
|
||||||
<version>8.3.4</version>
|
<version>8.3.5</version>
|
||||||
</parent>
|
</parent>
|
||||||
<properties>
|
<properties>
|
||||||
<moduleClass>io.onedev.server.plugin.buildspec.gradle.GradleModule</moduleClass>
|
<moduleClass>io.onedev.server.plugin.buildspec.gradle.GradleModule</moduleClass>
|
||||||
|
|||||||
@ -5,7 +5,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>io.onedev</groupId>
|
<groupId>io.onedev</groupId>
|
||||||
<artifactId>server-plugin</artifactId>
|
<artifactId>server-plugin</artifactId>
|
||||||
<version>8.3.4</version>
|
<version>8.3.5</version>
|
||||||
</parent>
|
</parent>
|
||||||
<properties>
|
<properties>
|
||||||
<moduleClass>io.onedev.server.plugin.buildspec.maven.MavenModule</moduleClass>
|
<moduleClass>io.onedev.server.plugin.buildspec.maven.MavenModule</moduleClass>
|
||||||
|
|||||||
@ -5,7 +5,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>io.onedev</groupId>
|
<groupId>io.onedev</groupId>
|
||||||
<artifactId>server-plugin</artifactId>
|
<artifactId>server-plugin</artifactId>
|
||||||
<version>8.3.4</version>
|
<version>8.3.5</version>
|
||||||
</parent>
|
</parent>
|
||||||
<properties>
|
<properties>
|
||||||
<moduleClass>io.onedev.server.plugin.buildspec.node.NodePluginModule</moduleClass>
|
<moduleClass>io.onedev.server.plugin.buildspec.node.NodePluginModule</moduleClass>
|
||||||
|
|||||||
@ -6,7 +6,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>io.onedev</groupId>
|
<groupId>io.onedev</groupId>
|
||||||
<artifactId>server-plugin</artifactId>
|
<artifactId>server-plugin</artifactId>
|
||||||
<version>8.3.4</version>
|
<version>8.3.5</version>
|
||||||
</parent>
|
</parent>
|
||||||
<properties>
|
<properties>
|
||||||
<moduleClass>io.onedev.server.plugin.executor.kubernetes.KubernetesModule</moduleClass>
|
<moduleClass>io.onedev.server.plugin.executor.kubernetes.KubernetesModule</moduleClass>
|
||||||
|
|||||||
@ -7,8 +7,8 @@ import com.google.common.base.Preconditions;
|
|||||||
import com.google.common.base.Splitter;
|
import com.google.common.base.Splitter;
|
||||||
import com.google.common.collect.Lists;
|
import com.google.common.collect.Lists;
|
||||||
import com.google.common.collect.Sets;
|
import com.google.common.collect.Sets;
|
||||||
import io.onedev.agent.DockerExecutorUtils;
|
|
||||||
import io.onedev.agent.job.FailedException;
|
import io.onedev.agent.job.FailedException;
|
||||||
|
import io.onedev.agent.job.ImageMappingFacade;
|
||||||
import io.onedev.commons.bootstrap.Bootstrap;
|
import io.onedev.commons.bootstrap.Bootstrap;
|
||||||
import io.onedev.commons.utils.*;
|
import io.onedev.commons.utils.*;
|
||||||
import io.onedev.commons.utils.command.Commandline;
|
import io.onedev.commons.utils.command.Commandline;
|
||||||
@ -27,6 +27,7 @@ import io.onedev.server.entitymanager.SettingManager;
|
|||||||
import io.onedev.server.job.JobContext;
|
import io.onedev.server.job.JobContext;
|
||||||
import io.onedev.server.job.JobManager;
|
import io.onedev.server.job.JobManager;
|
||||||
import io.onedev.server.job.JobRunnable;
|
import io.onedev.server.job.JobRunnable;
|
||||||
|
import io.onedev.server.model.support.ImageMapping;
|
||||||
import io.onedev.server.model.support.RegistryLogin;
|
import io.onedev.server.model.support.RegistryLogin;
|
||||||
import io.onedev.server.model.support.administration.jobexecutor.JobExecutor;
|
import io.onedev.server.model.support.administration.jobexecutor.JobExecutor;
|
||||||
import io.onedev.server.model.support.administration.jobexecutor.NodeSelectorEntry;
|
import io.onedev.server.model.support.administration.jobexecutor.NodeSelectorEntry;
|
||||||
@ -36,7 +37,6 @@ import io.onedev.server.terminal.CommandlineShell;
|
|||||||
import io.onedev.server.terminal.Shell;
|
import io.onedev.server.terminal.Shell;
|
||||||
import io.onedev.server.terminal.Terminal;
|
import io.onedev.server.terminal.Terminal;
|
||||||
import io.onedev.server.web.util.Testable;
|
import io.onedev.server.web.util.Testable;
|
||||||
import org.apache.commons.codec.binary.Base64;
|
|
||||||
import org.apache.commons.codec.binary.Hex;
|
import org.apache.commons.codec.binary.Hex;
|
||||||
import org.apache.commons.lang.SerializationUtils;
|
import org.apache.commons.lang.SerializationUtils;
|
||||||
import org.apache.commons.lang3.RandomUtils;
|
import org.apache.commons.lang3.RandomUtils;
|
||||||
@ -52,7 +52,6 @@ import java.io.ByteArrayOutputStream;
|
|||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
import java.nio.charset.StandardCharsets;
|
|
||||||
import java.time.Instant;
|
import java.time.Instant;
|
||||||
import java.time.format.DateTimeFormatter;
|
import java.time.format.DateTimeFormatter;
|
||||||
import java.time.format.DateTimeParseException;
|
import java.time.format.DateTimeParseException;
|
||||||
@ -60,14 +59,13 @@ import java.util.*;
|
|||||||
import java.util.concurrent.TimeoutException;
|
import java.util.concurrent.TimeoutException;
|
||||||
import java.util.concurrent.atomic.AtomicBoolean;
|
import java.util.concurrent.atomic.AtomicBoolean;
|
||||||
import java.util.concurrent.atomic.AtomicReference;
|
import java.util.concurrent.atomic.AtomicReference;
|
||||||
import java.util.stream.Collectors;
|
|
||||||
|
|
||||||
import static io.onedev.agent.DockerExecutorUtils.*;
|
import static io.onedev.agent.DockerExecutorUtils.buildDockerConfig;
|
||||||
import static io.onedev.k8shelper.KubernetesHelper.*;
|
import static io.onedev.k8shelper.KubernetesHelper.*;
|
||||||
import static io.onedev.server.util.CollectionUtils.newHashMap;
|
import static io.onedev.server.util.CollectionUtils.newHashMap;
|
||||||
import static io.onedev.server.util.CollectionUtils.newLinkedHashMap;
|
import static io.onedev.server.util.CollectionUtils.newLinkedHashMap;
|
||||||
import static java.nio.charset.StandardCharsets.UTF_8;
|
import static java.nio.charset.StandardCharsets.UTF_8;
|
||||||
import static java.util.stream.Collectors.*;
|
import static java.util.stream.Collectors.toList;
|
||||||
import static org.apache.commons.codec.binary.Base64.encodeBase64String;
|
import static org.apache.commons.codec.binary.Base64.encodeBase64String;
|
||||||
|
|
||||||
@Editable(order=KubernetesExecutor.ORDER, description="This executor runs build jobs as pods in a kubernetes cluster. "
|
@Editable(order=KubernetesExecutor.ORDER, description="This executor runs build jobs as pods in a kubernetes cluster. "
|
||||||
@ -109,10 +107,14 @@ public class KubernetesExecutor extends JobExecutor implements Testable<TestData
|
|||||||
|
|
||||||
private String memoryLimit;
|
private String memoryLimit;
|
||||||
|
|
||||||
|
private List<ImageMapping> imageMappings = new ArrayList<>();
|
||||||
|
|
||||||
private transient volatile OsInfo osInfo;
|
private transient volatile OsInfo osInfo;
|
||||||
|
|
||||||
private transient volatile String containerName;
|
private transient volatile String containerName;
|
||||||
|
|
||||||
|
private transient List<ImageMappingFacade> imageMappingFacades;
|
||||||
|
|
||||||
@Editable(order=20, description="Optionally specify node selector of the job pods")
|
@Editable(order=20, description="Optionally specify node selector of the job pods")
|
||||||
public List<NodeSelectorEntry> getNodeSelector() {
|
public List<NodeSelectorEntry> getNodeSelector() {
|
||||||
return nodeSelector;
|
return nodeSelector;
|
||||||
@ -221,6 +223,19 @@ public class KubernetesExecutor extends JobExecutor implements Testable<TestData
|
|||||||
this.kubeCtlPath = kubeCtlPath;
|
this.kubeCtlPath = kubeCtlPath;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Editable(order=28000, group="More Settings", description = "Optionally maps a docker image to a different " +
|
||||||
|
"image. The first matching entry will take effect, or image will remain unchanged if no matching entries " +
|
||||||
|
"found. For instance a mapping entry with <code>From</code> specified as <code>1dev/k8s-helper-linux:(.*)</code>, " +
|
||||||
|
"and <code>To</code> specified as <code>my-local-registry/k8s-helper-linux:$1</code> will map the " +
|
||||||
|
"k8s helper image from official docker registry to local registry, with repository and tag unchanged")
|
||||||
|
public List<ImageMapping> getImageMappings() {
|
||||||
|
return imageMappings;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setImageMappings(List<ImageMapping> imageMappings) {
|
||||||
|
this.imageMappings = imageMappings;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void execute(JobContext jobContext, TaskLogger jobLogger) {
|
public void execute(JobContext jobContext, TaskLogger jobLogger) {
|
||||||
var clusterManager = OneDev.getInstance(ClusterManager.class);
|
var clusterManager = OneDev.getInstance(ClusterManager.class);
|
||||||
@ -668,7 +683,7 @@ public class KubernetesExecutor extends JobExecutor implements Testable<TestData
|
|||||||
Map<String, Object> podSpec = new LinkedHashMap<>();
|
Map<String, Object> podSpec = new LinkedHashMap<>();
|
||||||
Map<Object, Object> containerSpec = newLinkedHashMap(
|
Map<Object, Object> containerSpec = newLinkedHashMap(
|
||||||
"name", "default",
|
"name", "default",
|
||||||
"image", jobService.getImage());
|
"image", mapImage(jobService.getImage()));
|
||||||
Map<Object, Object> resourcesSpec = newLinkedHashMap(
|
Map<Object, Object> resourcesSpec = newLinkedHashMap(
|
||||||
"requests", newLinkedHashMap(
|
"requests", newLinkedHashMap(
|
||||||
"cpu", getCpuRequest(),
|
"cpu", getCpuRequest(),
|
||||||
@ -960,7 +975,7 @@ public class KubernetesExecutor extends JobExecutor implements Testable<TestData
|
|||||||
helperImageSuffix = "linux";
|
helperImageSuffix = "linux";
|
||||||
}
|
}
|
||||||
|
|
||||||
String helperImage = IMAGE_REPO_PREFIX + "-" + helperImageSuffix + ":" + KubernetesHelper.getVersion();
|
String helperImage = mapImage(IMAGE_REPO_PREFIX + "-" + helperImageSuffix + ":" + KubernetesHelper.getVersion());
|
||||||
|
|
||||||
List<Map<Object, Object>> commonEnvs = new ArrayList<>();
|
List<Map<Object, Object>> commonEnvs = new ArrayList<>();
|
||||||
commonEnvs.add(newLinkedHashMap(
|
commonEnvs.add(newLinkedHashMap(
|
||||||
@ -992,7 +1007,7 @@ public class KubernetesExecutor extends JobExecutor implements Testable<TestData
|
|||||||
|
|
||||||
stepContainerSpec = newHashMap(
|
stepContainerSpec = newHashMap(
|
||||||
"name", containerName,
|
"name", containerName,
|
||||||
"image", execution.getImage());
|
"image", mapImage(execution.getImage()));
|
||||||
if (commandFacade.isUseTTY())
|
if (commandFacade.isUseTTY())
|
||||||
stepContainerSpec.put("tty", true);
|
stepContainerSpec.put("tty", true);
|
||||||
stepContainerSpec.put("volumeMounts", commonVolumeMounts);
|
stepContainerSpec.put("volumeMounts", commonVolumeMounts);
|
||||||
@ -1005,7 +1020,7 @@ public class KubernetesExecutor extends JobExecutor implements Testable<TestData
|
|||||||
OsContainer container = runContainerFacade.getContainer(osInfo);
|
OsContainer container = runContainerFacade.getContainer(osInfo);
|
||||||
stepContainerSpec = newHashMap(
|
stepContainerSpec = newHashMap(
|
||||||
"name", containerName,
|
"name", containerName,
|
||||||
"image", container.getImage());
|
"image", mapImage(container.getImage()));
|
||||||
if (runContainerFacade.isUseTTY())
|
if (runContainerFacade.isUseTTY())
|
||||||
stepContainerSpec.put("tty", true);
|
stepContainerSpec.put("tty", true);
|
||||||
|
|
||||||
@ -1023,11 +1038,11 @@ public class KubernetesExecutor extends JobExecutor implements Testable<TestData
|
|||||||
"mountPath", entry.getValue(),
|
"mountPath", entry.getValue(),
|
||||||
"subPath", subPath));
|
"subPath", subPath));
|
||||||
}
|
}
|
||||||
// if (runContainerFacade.isKaniko()) {
|
if (runContainerFacade.isKaniko()) {
|
||||||
volumeMounts.add(newLinkedHashMap(
|
volumeMounts.add(newLinkedHashMap(
|
||||||
"name", "docker-config",
|
"name", "docker-config",
|
||||||
"mountPath", "/kaniko/.docker"));
|
"mountPath", "/kaniko/.docker"));
|
||||||
// }
|
}
|
||||||
stepContainerSpec.put("volumeMounts", volumeMounts);
|
stepContainerSpec.put("volumeMounts", volumeMounts);
|
||||||
|
|
||||||
List<Map<Object, Object>> envs = new ArrayList<>(commonEnvs);
|
List<Map<Object, Object>> envs = new ArrayList<>(commonEnvs);
|
||||||
@ -1543,6 +1558,16 @@ public class KubernetesExecutor extends JobExecutor implements Testable<TestData
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private List<ImageMappingFacade> getImageMappingFacades() {
|
||||||
|
if (imageMappingFacades == null)
|
||||||
|
imageMappingFacades = getImageMappings().stream().map(it->it.getFacade()).collect(toList());
|
||||||
|
return imageMappingFacades;
|
||||||
|
}
|
||||||
|
|
||||||
|
private String mapImage(String image) {
|
||||||
|
return ImageMappingFacade.map(getImageMappingFacades(), image);
|
||||||
|
}
|
||||||
|
|
||||||
private static interface AbortChecker {
|
private static interface AbortChecker {
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
|
|||||||
@ -5,7 +5,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>io.onedev</groupId>
|
<groupId>io.onedev</groupId>
|
||||||
<artifactId>server-plugin</artifactId>
|
<artifactId>server-plugin</artifactId>
|
||||||
<version>8.3.4</version>
|
<version>8.3.5</version>
|
||||||
</parent>
|
</parent>
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<dependency>
|
<dependency>
|
||||||
|
|||||||
@ -15,6 +15,7 @@ import io.onedev.server.entitymanager.AgentManager;
|
|||||||
import io.onedev.server.job.*;
|
import io.onedev.server.job.*;
|
||||||
import io.onedev.server.job.log.LogManager;
|
import io.onedev.server.job.log.LogManager;
|
||||||
import io.onedev.server.job.log.ServerJobLogger;
|
import io.onedev.server.job.log.ServerJobLogger;
|
||||||
|
import io.onedev.server.model.support.ImageMapping;
|
||||||
import io.onedev.server.model.support.RegistryLogin;
|
import io.onedev.server.model.support.RegistryLogin;
|
||||||
import io.onedev.server.persistence.SessionManager;
|
import io.onedev.server.persistence.SessionManager;
|
||||||
import io.onedev.server.plugin.executor.serverdocker.ServerDockerExecutor;
|
import io.onedev.server.plugin.executor.serverdocker.ServerDockerExecutor;
|
||||||
@ -107,6 +108,7 @@ public class RemoteDockerExecutor extends ServerDockerExecutor {
|
|||||||
getName(), agentData.getName()));
|
getName(), agentData.getName()));
|
||||||
|
|
||||||
var registryLogins = getRegistryLogins().stream().map(RegistryLogin::getFacade).collect(toList());
|
var registryLogins = getRegistryLogins().stream().map(RegistryLogin::getFacade).collect(toList());
|
||||||
|
var imageMappings = getImageMappings().stream().map(ImageMapping::getFacade).collect(toList());
|
||||||
|
|
||||||
List<Map<String, Serializable>> services = new ArrayList<>();
|
List<Map<String, Serializable>> services = new ArrayList<>();
|
||||||
for (Service service : jobContext.getServices())
|
for (Service service : jobContext.getServices())
|
||||||
@ -116,7 +118,7 @@ public class RemoteDockerExecutor extends ServerDockerExecutor {
|
|||||||
DockerJobData jobData = new DockerJobData(jobToken, getName(), jobContext.getProjectPath(),
|
DockerJobData jobData = new DockerJobData(jobToken, getName(), jobContext.getProjectPath(),
|
||||||
jobContext.getProjectId(), jobContext.getRefName(), jobContext.getCommitId().name(),
|
jobContext.getProjectId(), jobContext.getRefName(), jobContext.getCommitId().name(),
|
||||||
jobContext.getBuildNumber(), jobContext.getActions(), jobContext.getRetried(),
|
jobContext.getBuildNumber(), jobContext.getActions(), jobContext.getRetried(),
|
||||||
services, registryLogins, isMountDockerSock(), getDockerSockPath(),
|
services, registryLogins, imageMappings, isMountDockerSock(), getDockerSockPath(),
|
||||||
getCpuLimit(), getMemoryLimit(), getRunOptions(), getNetworkOptions());
|
getCpuLimit(), getMemoryLimit(), getRunOptions(), getNetworkOptions());
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
|||||||
@ -5,7 +5,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>io.onedev</groupId>
|
<groupId>io.onedev</groupId>
|
||||||
<artifactId>server-plugin</artifactId>
|
<artifactId>server-plugin</artifactId>
|
||||||
<version>8.3.4</version>
|
<version>8.3.5</version>
|
||||||
</parent>
|
</parent>
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<dependency>
|
<dependency>
|
||||||
|
|||||||
@ -5,7 +5,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>io.onedev</groupId>
|
<groupId>io.onedev</groupId>
|
||||||
<artifactId>server-plugin</artifactId>
|
<artifactId>server-plugin</artifactId>
|
||||||
<version>8.3.4</version>
|
<version>8.3.5</version>
|
||||||
</parent>
|
</parent>
|
||||||
<properties>
|
<properties>
|
||||||
<moduleClass>io.onedev.server.plugin.executor.serverdocker.ServerDockerModule</moduleClass>
|
<moduleClass>io.onedev.server.plugin.executor.serverdocker.ServerDockerModule</moduleClass>
|
||||||
|
|||||||
@ -4,6 +4,7 @@ import com.google.common.base.Preconditions;
|
|||||||
import io.onedev.agent.DockerExecutorUtils;
|
import io.onedev.agent.DockerExecutorUtils;
|
||||||
import io.onedev.agent.ExecutorUtils;
|
import io.onedev.agent.ExecutorUtils;
|
||||||
import io.onedev.agent.job.FailedException;
|
import io.onedev.agent.job.FailedException;
|
||||||
|
import io.onedev.agent.job.ImageMappingFacade;
|
||||||
import io.onedev.commons.bootstrap.Bootstrap;
|
import io.onedev.commons.bootstrap.Bootstrap;
|
||||||
import io.onedev.commons.loader.AppLoader;
|
import io.onedev.commons.loader.AppLoader;
|
||||||
import io.onedev.commons.utils.*;
|
import io.onedev.commons.utils.*;
|
||||||
@ -21,6 +22,7 @@ import io.onedev.server.job.JobContext;
|
|||||||
import io.onedev.server.job.JobManager;
|
import io.onedev.server.job.JobManager;
|
||||||
import io.onedev.server.job.JobRunnable;
|
import io.onedev.server.job.JobRunnable;
|
||||||
import io.onedev.server.job.ResourceAllocator;
|
import io.onedev.server.job.ResourceAllocator;
|
||||||
|
import io.onedev.server.model.support.ImageMapping;
|
||||||
import io.onedev.server.model.support.RegistryLogin;
|
import io.onedev.server.model.support.RegistryLogin;
|
||||||
import io.onedev.server.model.support.administration.jobexecutor.JobExecutor;
|
import io.onedev.server.model.support.administration.jobexecutor.JobExecutor;
|
||||||
import io.onedev.server.plugin.executor.serverdocker.ServerDockerExecutor.TestData;
|
import io.onedev.server.plugin.executor.serverdocker.ServerDockerExecutor.TestData;
|
||||||
@ -75,13 +77,17 @@ public class ServerDockerExecutor extends JobExecutor implements Testable<TestDa
|
|||||||
|
|
||||||
private String concurrency;
|
private String concurrency;
|
||||||
|
|
||||||
|
private List<ImageMapping> imageMappings = new ArrayList<>();
|
||||||
|
|
||||||
private transient volatile File hostBuildHome;
|
private transient volatile File hostBuildHome;
|
||||||
|
|
||||||
private transient volatile LeafFacade runningStep;
|
private transient volatile LeafFacade runningStep;
|
||||||
|
|
||||||
private transient volatile String containerName;
|
private transient volatile String containerName;
|
||||||
|
|
||||||
private static transient volatile String hostInstallPath;
|
private transient List<ImageMappingFacade> imageMappingFacades;
|
||||||
|
|
||||||
|
private static volatile String hostInstallPath;
|
||||||
|
|
||||||
@Editable(order=400, description="Specify login information for docker registries if necessary")
|
@Editable(order=400, description="Specify login information for docker registries if necessary")
|
||||||
public List<RegistryLogin> getRegistryLogins() {
|
public List<RegistryLogin> getRegistryLogins() {
|
||||||
@ -127,17 +133,6 @@ public class ServerDockerExecutor extends JobExecutor implements Testable<TestDa
|
|||||||
this.mountDockerSock = mountDockerSock;
|
this.mountDockerSock = mountDockerSock;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Editable(order=530, group="More Settings", description = "Optionally specify docker options to create network. " +
|
|
||||||
"Multiple options should be separated by space, and single option containing spaces should be quoted")
|
|
||||||
@ReservedOptions({"-d", "(--driver)=.*"})
|
|
||||||
public String getNetworkOptions() {
|
|
||||||
return networkOptions;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setNetworkOptions(String networkOptions) {
|
|
||||||
this.networkOptions = networkOptions;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Editable(order=50010, group="More Settings", placeholder = "No limit", description = "" +
|
@Editable(order=50010, group="More Settings", placeholder = "No limit", description = "" +
|
||||||
"Optionally specify cpu limit of jobs/services using this executor. This will be " +
|
"Optionally specify cpu limit of jobs/services using this executor. This will be " +
|
||||||
"used as option <a href='https://docs.docker.com/config/containers/resource_constraints/#cpu' target='_blank'>--cpus</a> " +
|
"used as option <a href='https://docs.docker.com/config/containers/resource_constraints/#cpu' target='_blank'>--cpus</a> " +
|
||||||
@ -174,6 +169,17 @@ public class ServerDockerExecutor extends JobExecutor implements Testable<TestDa
|
|||||||
this.runOptions = runOptions;
|
this.runOptions = runOptions;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Editable(order=50075, group="More Settings", description = "Optionally specify docker options to create network. " +
|
||||||
|
"Multiple options should be separated by space, and single option containing spaces should be quoted")
|
||||||
|
@ReservedOptions({"-d", "(--driver)=.*"})
|
||||||
|
public String getNetworkOptions() {
|
||||||
|
return networkOptions;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setNetworkOptions(String networkOptions) {
|
||||||
|
this.networkOptions = networkOptions;
|
||||||
|
}
|
||||||
|
|
||||||
@Editable(order=50100, group="More Settings", placeholder="Use default", description=""
|
@Editable(order=50100, group="More Settings", placeholder="Use default", description=""
|
||||||
+ "Optionally specify docker executable, for instance <i>/usr/local/bin/docker</i>. "
|
+ "Optionally specify docker executable, for instance <i>/usr/local/bin/docker</i>. "
|
||||||
+ "Leave empty to use docker executable in PATH")
|
+ "Leave empty to use docker executable in PATH")
|
||||||
@ -185,6 +191,17 @@ public class ServerDockerExecutor extends JobExecutor implements Testable<TestDa
|
|||||||
this.dockerExecutable = dockerExecutable;
|
this.dockerExecutable = dockerExecutable;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Editable(order=50150, group="More Settings", description = "Optionally maps a docker image to a different " +
|
||||||
|
"image. The first matching entry will take effect, or image will remain unchanged if no matching " +
|
||||||
|
"entries found")
|
||||||
|
public List<ImageMapping> getImageMappings() {
|
||||||
|
return imageMappings;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setImageMappings(List<ImageMapping> imageMappings) {
|
||||||
|
this.imageMappings = imageMappings;
|
||||||
|
}
|
||||||
|
|
||||||
private Commandline newDocker() {
|
private Commandline newDocker() {
|
||||||
Commandline docker;
|
Commandline docker;
|
||||||
if (getDockerExecutable() != null)
|
if (getDockerExecutable() != null)
|
||||||
@ -275,8 +292,8 @@ public class ServerDockerExecutor extends JobExecutor implements Testable<TestDa
|
|||||||
OsInfo osInfo = OneDev.getInstance(OsInfo.class);
|
OsInfo osInfo = OneDev.getInstance(OsInfo.class);
|
||||||
|
|
||||||
for (Service jobService : jobContext.getServices()) {
|
for (Service jobService : jobContext.getServices()) {
|
||||||
jobLogger.log("Starting service (name: " + jobService.getName() + ", image: " + jobService.getImage() + ")...");
|
startService(newDocker(), network, jobService.toMap(), osInfo, getImageMappingFacades(),
|
||||||
startService(newDocker(), network, jobService.toMap(), osInfo, getCpuLimit(), getMemoryLimit(), jobLogger);
|
getCpuLimit(), getMemoryLimit(), jobLogger);
|
||||||
}
|
}
|
||||||
|
|
||||||
File hostWorkspace = new File(hostBuildHome, "workspace");
|
File hostWorkspace = new File(hostBuildHome, "workspace");
|
||||||
@ -310,6 +327,7 @@ public class ServerDockerExecutor extends JobExecutor implements Testable<TestDa
|
|||||||
List<String> arguments, Map<String, String> environments,
|
List<String> arguments, Map<String, String> environments,
|
||||||
@Nullable String workingDir, Map<String, String> volumeMounts,
|
@Nullable String workingDir, Map<String, String> volumeMounts,
|
||||||
List<Integer> position, boolean useTTY, boolean kaniko) {
|
List<Integer> position, boolean useTTY, boolean kaniko) {
|
||||||
|
image = mapImage(image);
|
||||||
// Uninstall symbol links as docker can not process it well
|
// Uninstall symbol links as docker can not process it well
|
||||||
cache.uninstallSymbolinks(hostWorkspace);
|
cache.uninstallSymbolinks(hostWorkspace);
|
||||||
containerName = network + "-step-" + stringifyStepPosition(position);
|
containerName = network + "-step-" + stringifyStepPosition(position);
|
||||||
@ -632,6 +650,16 @@ public class ServerDockerExecutor extends JobExecutor implements Testable<TestDa
|
|||||||
return hostInstallPath + path.substring(installPath.length());
|
return hostInstallPath + path.substring(installPath.length());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private List<ImageMappingFacade> getImageMappingFacades() {
|
||||||
|
if (imageMappingFacades == null)
|
||||||
|
imageMappingFacades = getImageMappings().stream().map(it->it.getFacade()).collect(toList());
|
||||||
|
return imageMappingFacades;
|
||||||
|
}
|
||||||
|
|
||||||
|
private String mapImage(String image) {
|
||||||
|
return ImageMappingFacade.map(getImageMappingFacades(), image);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void test(TestData testData, TaskLogger jobLogger) {
|
public void test(TestData testData, TaskLogger jobLogger) {
|
||||||
login(jobLogger);
|
login(jobLogger);
|
||||||
|
|||||||
@ -5,7 +5,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>io.onedev</groupId>
|
<groupId>io.onedev</groupId>
|
||||||
<artifactId>server-plugin</artifactId>
|
<artifactId>server-plugin</artifactId>
|
||||||
<version>8.3.4</version>
|
<version>8.3.5</version>
|
||||||
</parent>
|
</parent>
|
||||||
<properties>
|
<properties>
|
||||||
<moduleClass>io.onedev.server.plugin.executor.servershell.ServerShellModule</moduleClass>
|
<moduleClass>io.onedev.server.plugin.executor.servershell.ServerShellModule</moduleClass>
|
||||||
|
|||||||
@ -5,7 +5,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>io.onedev</groupId>
|
<groupId>io.onedev</groupId>
|
||||||
<artifactId>server-plugin</artifactId>
|
<artifactId>server-plugin</artifactId>
|
||||||
<version>8.3.4</version>
|
<version>8.3.5</version>
|
||||||
</parent>
|
</parent>
|
||||||
<properties>
|
<properties>
|
||||||
<moduleClass>io.onedev.server.plugin.imports.bitbucketcloud.BitbucketModule</moduleClass>
|
<moduleClass>io.onedev.server.plugin.imports.bitbucketcloud.BitbucketModule</moduleClass>
|
||||||
|
|||||||
@ -5,7 +5,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>io.onedev</groupId>
|
<groupId>io.onedev</groupId>
|
||||||
<artifactId>server-plugin</artifactId>
|
<artifactId>server-plugin</artifactId>
|
||||||
<version>8.3.4</version>
|
<version>8.3.5</version>
|
||||||
</parent>
|
</parent>
|
||||||
<properties>
|
<properties>
|
||||||
<moduleClass>io.onedev.server.plugin.imports.gitea.GiteaModule</moduleClass>
|
<moduleClass>io.onedev.server.plugin.imports.gitea.GiteaModule</moduleClass>
|
||||||
|
|||||||
@ -5,7 +5,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>io.onedev</groupId>
|
<groupId>io.onedev</groupId>
|
||||||
<artifactId>server-plugin</artifactId>
|
<artifactId>server-plugin</artifactId>
|
||||||
<version>8.3.4</version>
|
<version>8.3.5</version>
|
||||||
</parent>
|
</parent>
|
||||||
<properties>
|
<properties>
|
||||||
<moduleClass>io.onedev.server.plugin.imports.github.GitHubModule</moduleClass>
|
<moduleClass>io.onedev.server.plugin.imports.github.GitHubModule</moduleClass>
|
||||||
|
|||||||
@ -5,7 +5,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>io.onedev</groupId>
|
<groupId>io.onedev</groupId>
|
||||||
<artifactId>server-plugin</artifactId>
|
<artifactId>server-plugin</artifactId>
|
||||||
<version>8.3.4</version>
|
<version>8.3.5</version>
|
||||||
</parent>
|
</parent>
|
||||||
<properties>
|
<properties>
|
||||||
<moduleClass>io.onedev.server.plugin.imports.gitlab.GitLabModule</moduleClass>
|
<moduleClass>io.onedev.server.plugin.imports.gitlab.GitLabModule</moduleClass>
|
||||||
|
|||||||
@ -5,7 +5,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>io.onedev</groupId>
|
<groupId>io.onedev</groupId>
|
||||||
<artifactId>server-plugin</artifactId>
|
<artifactId>server-plugin</artifactId>
|
||||||
<version>8.3.4</version>
|
<version>8.3.5</version>
|
||||||
</parent>
|
</parent>
|
||||||
<properties>
|
<properties>
|
||||||
<moduleClass>io.onedev.server.plugin.imports.jiracloud.JiraModule</moduleClass>
|
<moduleClass>io.onedev.server.plugin.imports.jiracloud.JiraModule</moduleClass>
|
||||||
|
|||||||
@ -5,7 +5,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>io.onedev</groupId>
|
<groupId>io.onedev</groupId>
|
||||||
<artifactId>server-plugin</artifactId>
|
<artifactId>server-plugin</artifactId>
|
||||||
<version>8.3.4</version>
|
<version>8.3.5</version>
|
||||||
</parent>
|
</parent>
|
||||||
<properties>
|
<properties>
|
||||||
<moduleClass>io.onedev.server.plugin.imports.url.UrlModule</moduleClass>
|
<moduleClass>io.onedev.server.plugin.imports.url.UrlModule</moduleClass>
|
||||||
|
|||||||
@ -5,7 +5,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>io.onedev</groupId>
|
<groupId>io.onedev</groupId>
|
||||||
<artifactId>server-plugin</artifactId>
|
<artifactId>server-plugin</artifactId>
|
||||||
<version>8.3.4</version>
|
<version>8.3.5</version>
|
||||||
</parent>
|
</parent>
|
||||||
<properties>
|
<properties>
|
||||||
<moduleClass>io.onedev.server.plugin.imports.youtrack.YouTrackModule</moduleClass>
|
<moduleClass>io.onedev.server.plugin.imports.youtrack.YouTrackModule</moduleClass>
|
||||||
|
|||||||
@ -5,7 +5,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>io.onedev</groupId>
|
<groupId>io.onedev</groupId>
|
||||||
<artifactId>server-plugin</artifactId>
|
<artifactId>server-plugin</artifactId>
|
||||||
<version>8.3.4</version>
|
<version>8.3.5</version>
|
||||||
</parent>
|
</parent>
|
||||||
<properties>
|
<properties>
|
||||||
<moduleClass>io.onedev.server.plugin.notification.discord.DiscordModule</moduleClass>
|
<moduleClass>io.onedev.server.plugin.notification.discord.DiscordModule</moduleClass>
|
||||||
|
|||||||
@ -5,7 +5,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>io.onedev</groupId>
|
<groupId>io.onedev</groupId>
|
||||||
<artifactId>server-plugin</artifactId>
|
<artifactId>server-plugin</artifactId>
|
||||||
<version>8.3.4</version>
|
<version>8.3.5</version>
|
||||||
</parent>
|
</parent>
|
||||||
<properties>
|
<properties>
|
||||||
<moduleClass>io.onedev.server.plugin.notification.slack.SlackModule</moduleClass>
|
<moduleClass>io.onedev.server.plugin.notification.slack.SlackModule</moduleClass>
|
||||||
|
|||||||
@ -5,7 +5,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>io.onedev</groupId>
|
<groupId>io.onedev</groupId>
|
||||||
<artifactId>server-plugin</artifactId>
|
<artifactId>server-plugin</artifactId>
|
||||||
<version>8.3.4</version>
|
<version>8.3.5</version>
|
||||||
</parent>
|
</parent>
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<dependency>
|
<dependency>
|
||||||
|
|||||||
@ -5,7 +5,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>io.onedev</groupId>
|
<groupId>io.onedev</groupId>
|
||||||
<artifactId>server-plugin</artifactId>
|
<artifactId>server-plugin</artifactId>
|
||||||
<version>8.3.4</version>
|
<version>8.3.5</version>
|
||||||
</parent>
|
</parent>
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<dependency>
|
<dependency>
|
||||||
|
|||||||
@ -5,7 +5,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>io.onedev</groupId>
|
<groupId>io.onedev</groupId>
|
||||||
<artifactId>server-plugin</artifactId>
|
<artifactId>server-plugin</artifactId>
|
||||||
<version>8.3.4</version>
|
<version>8.3.5</version>
|
||||||
</parent>
|
</parent>
|
||||||
<properties>
|
<properties>
|
||||||
<moduleClass>io.onedev.server.plugin.report.coverage.CoverageModule</moduleClass>
|
<moduleClass>io.onedev.server.plugin.report.coverage.CoverageModule</moduleClass>
|
||||||
|
|||||||
@ -5,7 +5,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>io.onedev</groupId>
|
<groupId>io.onedev</groupId>
|
||||||
<artifactId>server-plugin</artifactId>
|
<artifactId>server-plugin</artifactId>
|
||||||
<version>8.3.4</version>
|
<version>8.3.5</version>
|
||||||
</parent>
|
</parent>
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<dependency>
|
<dependency>
|
||||||
|
|||||||
@ -5,7 +5,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>io.onedev</groupId>
|
<groupId>io.onedev</groupId>
|
||||||
<artifactId>server-plugin</artifactId>
|
<artifactId>server-plugin</artifactId>
|
||||||
<version>8.3.4</version>
|
<version>8.3.5</version>
|
||||||
</parent>
|
</parent>
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<dependency>
|
<dependency>
|
||||||
|
|||||||
@ -5,7 +5,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>io.onedev</groupId>
|
<groupId>io.onedev</groupId>
|
||||||
<artifactId>server-plugin</artifactId>
|
<artifactId>server-plugin</artifactId>
|
||||||
<version>8.3.4</version>
|
<version>8.3.5</version>
|
||||||
</parent>
|
</parent>
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<dependency>
|
<dependency>
|
||||||
|
|||||||
@ -5,7 +5,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>io.onedev</groupId>
|
<groupId>io.onedev</groupId>
|
||||||
<artifactId>server-plugin</artifactId>
|
<artifactId>server-plugin</artifactId>
|
||||||
<version>8.3.4</version>
|
<version>8.3.5</version>
|
||||||
</parent>
|
</parent>
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<dependency>
|
<dependency>
|
||||||
|
|||||||
@ -5,7 +5,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>io.onedev</groupId>
|
<groupId>io.onedev</groupId>
|
||||||
<artifactId>server-plugin</artifactId>
|
<artifactId>server-plugin</artifactId>
|
||||||
<version>8.3.4</version>
|
<version>8.3.5</version>
|
||||||
</parent>
|
</parent>
|
||||||
<properties>
|
<properties>
|
||||||
<moduleClass>io.onedev.server.plugin.report.markdown.MarkdownModule</moduleClass>
|
<moduleClass>io.onedev.server.plugin.report.markdown.MarkdownModule</moduleClass>
|
||||||
|
|||||||
@ -5,7 +5,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>io.onedev</groupId>
|
<groupId>io.onedev</groupId>
|
||||||
<artifactId>server-plugin</artifactId>
|
<artifactId>server-plugin</artifactId>
|
||||||
<version>8.3.4</version>
|
<version>8.3.5</version>
|
||||||
</parent>
|
</parent>
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<dependency>
|
<dependency>
|
||||||
|
|||||||
@ -5,7 +5,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>io.onedev</groupId>
|
<groupId>io.onedev</groupId>
|
||||||
<artifactId>server-plugin</artifactId>
|
<artifactId>server-plugin</artifactId>
|
||||||
<version>8.3.4</version>
|
<version>8.3.5</version>
|
||||||
</parent>
|
</parent>
|
||||||
<properties>
|
<properties>
|
||||||
<moduleClass>io.onedev.server.plugin.report.problem.ProblemModule</moduleClass>
|
<moduleClass>io.onedev.server.plugin.report.problem.ProblemModule</moduleClass>
|
||||||
|
|||||||
@ -5,7 +5,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>io.onedev</groupId>
|
<groupId>io.onedev</groupId>
|
||||||
<artifactId>server-plugin</artifactId>
|
<artifactId>server-plugin</artifactId>
|
||||||
<version>8.3.4</version>
|
<version>8.3.5</version>
|
||||||
</parent>
|
</parent>
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<dependency>
|
<dependency>
|
||||||
|
|||||||
@ -5,7 +5,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>io.onedev</groupId>
|
<groupId>io.onedev</groupId>
|
||||||
<artifactId>server-plugin</artifactId>
|
<artifactId>server-plugin</artifactId>
|
||||||
<version>8.3.4</version>
|
<version>8.3.5</version>
|
||||||
</parent>
|
</parent>
|
||||||
<properties>
|
<properties>
|
||||||
<moduleClass>io.onedev.server.plugin.report.unittest.UnitTestModule</moduleClass>
|
<moduleClass>io.onedev.server.plugin.report.unittest.UnitTestModule</moduleClass>
|
||||||
|
|||||||
@ -5,7 +5,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>io.onedev</groupId>
|
<groupId>io.onedev</groupId>
|
||||||
<artifactId>server-plugin</artifactId>
|
<artifactId>server-plugin</artifactId>
|
||||||
<version>8.3.4</version>
|
<version>8.3.5</version>
|
||||||
</parent>
|
</parent>
|
||||||
<properties>
|
<properties>
|
||||||
<moduleClass>io.onedev.server.plugin.sso.discord.DiscordModule</moduleClass>
|
<moduleClass>io.onedev.server.plugin.sso.discord.DiscordModule</moduleClass>
|
||||||
|
|||||||
@ -6,7 +6,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>io.onedev</groupId>
|
<groupId>io.onedev</groupId>
|
||||||
<artifactId>server-plugin</artifactId>
|
<artifactId>server-plugin</artifactId>
|
||||||
<version>8.3.4</version>
|
<version>8.3.5</version>
|
||||||
</parent>
|
</parent>
|
||||||
<properties>
|
<properties>
|
||||||
<moduleClass>io.onedev.server.plugin.sso.openid.OpenIdModule</moduleClass>
|
<moduleClass>io.onedev.server.plugin.sso.openid.OpenIdModule</moduleClass>
|
||||||
|
|||||||
@ -7,7 +7,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>io.onedev</groupId>
|
<groupId>io.onedev</groupId>
|
||||||
<artifactId>server</artifactId>
|
<artifactId>server</artifactId>
|
||||||
<version>8.3.4</version>
|
<version>8.3.5</version>
|
||||||
</parent>
|
</parent>
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<dependency>
|
<dependency>
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user