This is an automated email from the ASF dual-hosted git repository. marat pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/camel-karavan.git
The following commit(s) were added to refs/heads/main by this push: new b8862913 Sync build in Docker and Kubernetes #885 b8862913 is described below commit b886291355c5efacb3cae8b0bb95b356c5bf6706 Author: Marat Gubaidullin <ma...@talismancloud.io> AuthorDate: Mon Sep 11 20:14:00 2023 -0400 Sync build in Docker and Kubernetes #885 --- .../apache/camel/karavan/api/ImagesResource.java | 5 +- .../apache/camel/karavan/api/LogWatchResource.java | 6 +- .../org/apache/camel/karavan/code/CodeService.java | 10 +- .../camel/karavan/docker/DockerForKaravan.java | 3 +- .../apache/camel/karavan/docker/DockerService.java | 36 +- .../org/apache/camel/karavan/git/GitService.java | 29 +- .../karavan/kubernetes/KubernetesService.java | 57 +- .../camel/karavan/kubernetes/PodEventHandler.java | 10 +- .../camel/karavan/registry/RegistryConfig.java | 34 + .../{service => registry}/RegistryService.java | 40 +- .../camel/karavan/service/ConfigService.java | 3 - .../karavan/service/ContainerStatusService.java | 10 +- .../camel/karavan/service/ProjectService.java | 12 +- .../org/apache/camel/karavan/shared/Constants.java | 7 + .../src/main/resources/application.properties | 2 +- .../snippets/camel-main-builder-script-docker.sh | 2 +- .../camel-main-builder-script-kubernetes.sh | 21 +- .../main/webui/src/project/build/BuildPanel.tsx | 3 +- karavan-web/karavan-cli/xxx.yaml | 695 +++++++++++++++++++++ 19 files changed, 897 insertions(+), 88 deletions(-) diff --git a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/api/ImagesResource.java b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/api/ImagesResource.java index 9f5e64b0..2c2fdf0e 100644 --- a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/api/ImagesResource.java +++ b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/api/ImagesResource.java @@ -22,14 +22,11 @@ import jakarta.ws.rs.*; import jakarta.ws.rs.core.MediaType; import jakarta.ws.rs.core.Response; import org.apache.camel.karavan.docker.DockerService; -import org.apache.camel.karavan.infinispan.model.Project; import org.apache.camel.karavan.service.ConfigService; import org.apache.camel.karavan.service.ProjectService; -import org.apache.camel.karavan.service.RegistryService; +import org.apache.camel.karavan.registry.RegistryService; import org.jose4j.base64url.Base64; -import java.net.URLDecoder; -import java.nio.charset.StandardCharsets; import java.util.Comparator; import java.util.List; diff --git a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/api/LogWatchResource.java b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/api/LogWatchResource.java index bc0a68c7..e640b583 100644 --- a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/api/LogWatchResource.java +++ b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/api/LogWatchResource.java @@ -16,9 +16,11 @@ */ package org.apache.camel.karavan.api; +import io.fabric8.kubernetes.client.KubernetesClient; import io.fabric8.kubernetes.client.dsl.LogWatch; import io.smallrye.context.api.ManagedExecutorConfig; import io.smallrye.context.api.NamedInstance; +import io.smallrye.mutiny.tuples.Tuple2; import org.apache.camel.karavan.docker.DockerService; import org.apache.camel.karavan.docker.LogCallback; import org.apache.camel.karavan.kubernetes.KubernetesService; @@ -96,7 +98,8 @@ public class LogWatchResource { private void getKubernetesLogs(String name, SseEventSink eventSink, Sse sse) { try (SseEventSink sink = eventSink) { - LogWatch logWatch = kubernetesService.getContainerLogWatch(name); + Tuple2<LogWatch, KubernetesClient> request = kubernetesService.getContainerLogWatch(name); + LogWatch logWatch = request.getItem1(); BufferedReader reader = new BufferedReader(new InputStreamReader(logWatch.getOutput())); try { for (String line; (line = reader.readLine()) != null && !sink.isClosed(); ) { @@ -106,6 +109,7 @@ public class LogWatchResource { LOGGER.error(e.getMessage()); } logWatch.close(); + request.getItem2().close(); sink.close(); LOGGER.info("LogWatch for " + name + " closed"); } diff --git a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/code/CodeService.java b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/code/CodeService.java index b0ea0b9a..85a8a140 100644 --- a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/code/CodeService.java +++ b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/code/CodeService.java @@ -61,8 +61,6 @@ public class CodeService { private static final String SNIPPETS_PATH = "/snippets/"; private static final int INTERNAL_PORT = 8080; - protected static final String ENVIRONMENT = "environment"; - @Inject KubernetesService kubernetesService; @@ -123,6 +121,14 @@ public class CodeService { } } + public String getBuilderScript(Project project) { + String target = ConfigService.inKubernetes() + ? (kubernetesService.isOpenshift() ? "openshift" : "kubernetes") + : "docker"; + String templateName = project.getRuntime() + "-builder-script-" + target + ".sh"; + return getTemplateText(templateName); + } + public String getTemplateText(String fileName) { try { List<ProjectFile> files = infinispanService.getProjectFiles(Project.Type.templates.name()); diff --git a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerForKaravan.java b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerForKaravan.java index b8cb910f..d05fd4ab 100644 --- a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerForKaravan.java +++ b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerForKaravan.java @@ -20,10 +20,9 @@ import com.github.dockerjava.api.model.Container; import com.github.dockerjava.api.model.HealthCheck; import jakarta.enterprise.context.ApplicationScoped; import jakarta.inject.Inject; -import org.apache.camel.karavan.code.model.DockerComposeService; import org.apache.camel.karavan.infinispan.model.ContainerStatus; import org.apache.camel.karavan.infinispan.model.Project; -import org.apache.camel.karavan.service.RegistryService; +import org.apache.camel.karavan.registry.RegistryService; import org.eclipse.microprofile.config.inject.ConfigProperty; import org.jboss.logging.Logger; diff --git a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerService.java b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerService.java index a3e35ee0..49398add 100644 --- a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerService.java +++ b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerService.java @@ -350,13 +350,21 @@ public class DockerService extends DockerServiceUtils { } } - private DockerClientConfig getDockerClientConfig() { - return DefaultDockerClientConfig.createDefaultConfigBuilder().build(); + private DockerClientConfig getDockerClientConfig(String registryUrl, String registryUsername, String registryPassword) { + DefaultDockerClientConfig.Builder builder = DefaultDockerClientConfig.createDefaultConfigBuilder(); + if (registryUrl != null) { + builder.withRegistryUrl(registryUrl); + } + if (registryUsername != null) { + builder.withRegistryUsername(registryUsername); + } + if (registryPassword != null) { + builder.withRegistryPassword(registryPassword); + } + return builder.build(); } - private DockerHttpClient getDockerHttpClient() { - DockerClientConfig config = getDockerClientConfig(); - + private DockerHttpClient getDockerHttpClient(DockerClientConfig config) { return new ZerodepDockerHttpClient.Builder() .dockerHost(config.getDockerHost()) .sslConfig(config.getSSLConfig()) @@ -366,11 +374,19 @@ public class DockerService extends DockerServiceUtils { public DockerClient getDockerClient() { if (dockerClient == null) { - dockerClient = DockerClientImpl.getInstance(getDockerClientConfig(), getDockerHttpClient()); + DockerClientConfig config = getDockerClientConfig(null, null, null); + DockerHttpClient httpClient = getDockerHttpClient(config); + dockerClient = DockerClientImpl.getInstance(config, httpClient); } return dockerClient; } + public DockerClient getDockerClient(String registryUrl, String registryUsername, String registryPassword) { + DockerClientConfig config = getDockerClientConfig(registryUrl, registryUsername, registryPassword); + DockerHttpClient httpClient = getDockerHttpClient(config); + return DockerClientImpl.getInstance(config, httpClient); + } + public int getMaxPortMapped(int port) { return getDockerClient().listContainersCmd().withShowAll(true).exec().stream() .map(c -> List.of(c.ports)) @@ -386,6 +402,14 @@ public class DockerService extends DockerServiceUtils { .map(image -> image.getRepoTags()[0]).toList(); } + public List<String> getImages(String registryUrl, String registryUsername, String registryPassword, String pattern) throws IOException { + List<String> result = new ArrayList<>(); + DockerClient client = getDockerClient(registryUrl, registryUsername, registryPassword); + getDockerClient().searchImagesCmd(pattern).exec().stream().map(searchItem -> searchItem.getName()); + client.close(); + return result; + } + public void deleteImage(String imageName) { Optional<Image> image = getDockerClient().listImagesCmd().withShowAll(true).exec().stream() .filter(i -> Arrays.stream(i.getRepoTags()).anyMatch(s -> Objects.equals(s, imageName))).findFirst(); diff --git a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/git/GitService.java b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/git/GitService.java index 71a2f363..c81c40e7 100644 --- a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/git/GitService.java +++ b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/git/GitService.java @@ -24,6 +24,7 @@ import org.apache.camel.karavan.git.model.GitRepo; import org.apache.camel.karavan.git.model.GitRepoFile; import org.apache.camel.karavan.infinispan.model.*; import org.apache.camel.karavan.kubernetes.KubernetesService; +import org.apache.camel.karavan.registry.RegistryConfig; import org.apache.camel.karavan.service.ConfigService; import org.eclipse.jgit.api.CheckoutCommand; import org.eclipse.jgit.api.CloneCommand; @@ -89,12 +90,11 @@ public class GitService { String branch = ConfigProvider.getConfig().getValue(propertiesPrefix + "git-branch", String.class); if (ConfigService.inKubernetes()) { Secret secret = kubernetesService.getKaravanSecret(); - String uri = new String(Base64.getDecoder().decode(secret.getData().get("git-repository").getBytes(StandardCharsets.UTF_8))); - String username = new String(Base64.getDecoder().decode(secret.getData().get("git-username").getBytes(StandardCharsets.UTF_8))); - String password = new String(Base64.getDecoder().decode(secret.getData().get("git-password").getBytes(StandardCharsets.UTF_8))); - if (secret.getData().containsKey("git-branch")) { - branch = new String(Base64.getDecoder().decode(secret.getData().get("git-branch").getBytes(StandardCharsets.UTF_8))); - } + String uri = kubernetesService.getKaravanSecret("git-repository"); + String username = kubernetesService.getKaravanSecret("git-username"); + String password = kubernetesService.getKaravanSecret("git-password"); + String branchInSecret = kubernetesService.getKaravanSecret("git-branch"); + branch = branchInSecret != null ? branchInSecret : branch; return new GitConfig(uri, username, password, branch); } else if (ConfigService.inDocker()) { String uri = ConfigProvider.getConfig().getValue(propertiesPrefix + "git-repository", String.class); @@ -112,17 +112,26 @@ public class GitService { } } + public List<String> getEnvForBuild() { + GitConfig gitConfig = getGitConfigForBuilder(); + return List.of( + "GIT_REPOSITORY=" + gitConfig.getUri(), + "GIT_USERNAME=" + gitConfig.getUsername(), + "GIT_PASSWORD=" + gitConfig.getPassword(), + "GIT_BRANCH=" + gitConfig.getBranch()); + } + public GitConfig getGitConfigForBuilder() { String propertiesPrefix = "karavan."; String branch = ConfigProvider.getConfig().getValue(propertiesPrefix + "git-branch", String.class); if (ConfigService.inKubernetes()) { LOGGER.info("inKubernetes " + kubernetesService.getNamespace()); Secret secret = kubernetesService.getKaravanSecret(); - String uri = new String(Base64.getDecoder().decode(secret.getData().get("git-repository").getBytes(StandardCharsets.UTF_8))); - String username = new String(Base64.getDecoder().decode(secret.getData().get("git-username").getBytes(StandardCharsets.UTF_8))); - String password = new String(Base64.getDecoder().decode(secret.getData().get("git-password").getBytes(StandardCharsets.UTF_8))); + String uri = kubernetesService.getKaravanSecret("git-repository"); + String username = kubernetesService.getKaravanSecret("git-username"); + String password = kubernetesService.getKaravanSecret("git-password"); if (secret.getData().containsKey("git-branch")) { - branch = new String(Base64.getDecoder().decode(secret.getData().get("git-branch").getBytes(StandardCharsets.UTF_8))); + branch = kubernetesService.getKaravanSecret("git-branch"); } return new GitConfig(uri, username, password, branch); } else { diff --git a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/kubernetes/KubernetesService.java b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/kubernetes/KubernetesService.java index 063b8899..b02bc045 100644 --- a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/kubernetes/KubernetesService.java +++ b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/kubernetes/KubernetesService.java @@ -24,6 +24,7 @@ import io.fabric8.kubernetes.client.dsl.LogWatch; import io.fabric8.kubernetes.client.informers.SharedIndexInformer; import io.fabric8.openshift.api.model.ImageStream; import io.fabric8.openshift.client.OpenShiftClient; +import io.smallrye.mutiny.tuples.Tuple2; import io.vertx.mutiny.core.eventbus.EventBus; import org.apache.camel.karavan.infinispan.InfinispanService; import org.apache.camel.karavan.infinispan.model.ContainerStatus; @@ -42,6 +43,7 @@ import jakarta.enterprise.inject.Default; import jakarta.enterprise.inject.Produces; import jakarta.inject.Inject; +import java.nio.charset.StandardCharsets; import java.util.*; import java.util.stream.Collectors; @@ -55,11 +57,6 @@ public class KubernetesService implements HealthCheck { private static final Logger LOGGER = Logger.getLogger(KubernetesService.class.getName()); protected static final int INFORMERS = 3; - private static final String CAMEL_PREFIX = "camel"; - private static final String KARAVAN_PREFIX = "karavan"; - private static final String JBANG_CACHE_SUFFIX = "jbang-cache"; - private static final String M2_CACHE_SUFFIX = "m2-cache"; - protected static final String PVC_MAVEN_SETTINGS = "maven-settings"; @Inject EventBus eventBus; @@ -91,24 +88,22 @@ public class KubernetesService implements HealthCheck { LOGGER.info("Starting Kubernetes Informers"); Map<String, String> labels = getRuntimeLabels(); + KubernetesClient client = kubernetesClient(); - try (KubernetesClient client = kubernetesClient()) { + SharedIndexInformer<Deployment> deploymentInformer = client.apps().deployments().inNamespace(getNamespace()) + .withLabels(labels).inform();deploymentInformer.addEventHandlerWithResyncPeriod(new DeploymentEventHandler(infinispanService, this), 30 * 1000L); + informers.add(deploymentInformer); - SharedIndexInformer<Deployment> deploymentInformer = client.apps().deployments().inNamespace(getNamespace()) - .withLabels(labels).inform(); - deploymentInformer.addEventHandlerWithResyncPeriod(new DeploymentEventHandler(infinispanService, this), 30 * 1000L); - informers.add(deploymentInformer); + SharedIndexInformer<Service> serviceInformer = client.services().inNamespace(getNamespace()) + .withLabels(labels).inform(); + serviceInformer.addEventHandlerWithResyncPeriod(new ServiceEventHandler(infinispanService, this), 30 * 1000L); + informers.add(serviceInformer); - SharedIndexInformer<Service> serviceInformer = client.services().inNamespace(getNamespace()) - .withLabels(labels).inform(); - serviceInformer.addEventHandlerWithResyncPeriod(new ServiceEventHandler(infinispanService, this), 30 * 1000L); - informers.add(serviceInformer); + SharedIndexInformer<Pod> podRunInformer = client.pods().inNamespace(getNamespace()) + .withLabels(labels).inform(); + podRunInformer.addEventHandlerWithResyncPeriod(new PodEventHandler(infinispanService, this, eventBus), 30 * 1000L); + informers.add(podRunInformer); - SharedIndexInformer<Pod> podRunInformer = client.pods().inNamespace(getNamespace()) - .withLabels(labels).inform(); - podRunInformer.addEventHandlerWithResyncPeriod(new PodEventHandler(infinispanService, this, eventBus), 30 * 1000L); - informers.add(podRunInformer); - } LOGGER.info("Started Kubernetes Informers"); } catch (Exception e) { LOGGER.error("Error starting informers: " + e.getMessage()); @@ -228,6 +223,7 @@ public class KubernetesService implements HealthCheck { .withTerminationGracePeriodSeconds(0L) .withContainers(container) .withRestartPolicy("Never") + .withServiceAccount(KARAVAN_PREFIX) .withVolumes( // new VolumeBuilder().withName(name) // .withNewPersistentVolumeClaim(name, false).build(), @@ -254,10 +250,10 @@ public class KubernetesService implements HealthCheck { } } - public LogWatch getContainerLogWatch(String podName) { - try (KubernetesClient client = kubernetesClient()) { - return client.pods().inNamespace(getNamespace()).withName(podName).tailingLines(100).watchLog(); - } + public Tuple2<LogWatch, KubernetesClient> getContainerLogWatch(String podName) { + KubernetesClient client = kubernetesClient(); + LogWatch logWatch = client.pods().inNamespace(getNamespace()).withName(podName).tailingLines(100).watchLog(); + return Tuple2.of(logWatch, client); } private List<Condition> getCancelConditions(String reason) { @@ -531,6 +527,21 @@ public class KubernetesService implements HealthCheck { } } + public String getKaravanSecret(String key) { + try (KubernetesClient client = kubernetesClient()) { + Secret secret = client.secrets().inNamespace(getNamespace()).withName("karavan").get(); + Map<String, String> data = secret.getData(); + return decodeSecret(data.get(key)); + } + } + + private String decodeSecret(String data) { + if (data != null){ + return new String(Base64.getDecoder().decode(data.getBytes(StandardCharsets.UTF_8))); + } + return null; + } + public boolean isOpenshift() { try (KubernetesClient client = kubernetesClient()) { return ConfigService.inKubernetes() ? client.isAdaptable(OpenShiftClient.class) : false; diff --git a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/kubernetes/PodEventHandler.java b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/kubernetes/PodEventHandler.java index 1eaf01b8..c94d14c1 100644 --- a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/kubernetes/PodEventHandler.java +++ b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/kubernetes/PodEventHandler.java @@ -16,7 +16,6 @@ import java.util.List; import java.util.Objects; import static org.apache.camel.karavan.code.CodeService.DEFAULT_CONTAINER_RESOURCES; -import static org.apache.camel.karavan.service.CamelService.RELOAD_PROJECT_CODE; import static org.apache.camel.karavan.shared.Constants.LABEL_PROJECT_ID; import static org.apache.camel.karavan.service.ContainerStatusService.CONTAINER_STATUS; import static org.apache.camel.karavan.shared.Constants.LABEL_TYPE; @@ -82,7 +81,10 @@ public class PodEventHandler implements ResourceEventHandler<Pod> { String type = deployment != null ? deployment : pod.getMetadata().getLabels().get(LABEL_TYPE); ContainerStatus.ContainerType containerType = type != null ? ContainerStatus.ContainerType.valueOf(type) : ContainerStatus.ContainerType.unknown; try { - boolean ready = pod.getStatus().getConditions().stream().anyMatch(c -> c.getType().equals("Ready")); + boolean ready = pod.getStatus().getConditions().stream().anyMatch(c -> c.getType().equals("Ready") && c.getStatus().equals("True")); + boolean running = Objects.equals(pod.getStatus().getPhase(), "Running"); + boolean failed = Objects.equals(pod.getStatus().getPhase(), "Failed"); + boolean succeeded = Objects.equals(pod.getStatus().getPhase(), "Succeeded"); String creationTimestamp = pod.getMetadata().getCreationTimestamp(); ResourceRequirements defaultRR = kubernetesService.getResourceRequirements(DEFAULT_CONTAINER_RESOURCES); @@ -105,6 +107,10 @@ public class PodEventHandler implements ResourceEventHandler<Pod> { status.setContainerId(pod.getMetadata().getName()); if (ready) { status.setState(ContainerStatus.State.running.name()); + } else if (failed) { + status.setState(ContainerStatus.State.dead.name()); + } else if (succeeded) { + status.setState(ContainerStatus.State.exited.name()); } else { status.setState(ContainerStatus.State.created.name()); } diff --git a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/registry/RegistryConfig.java b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/registry/RegistryConfig.java new file mode 100644 index 00000000..55ce936e --- /dev/null +++ b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/registry/RegistryConfig.java @@ -0,0 +1,34 @@ +package org.apache.camel.karavan.registry; + +public class RegistryConfig { + private String registry; + private String group; + private String username; + private String password; + + public RegistryConfig() { + } + + public RegistryConfig(String registry, String group, String username, String password) { + this.registry = registry; + this.group = group; + this.username = username; + this.password = password; + } + + public String getRegistry() { + return registry; + } + + public String getGroup() { + return group; + } + + public String getUsername() { + return username; + } + + public String getPassword() { + return password; + } +} diff --git a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/service/RegistryService.java b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/registry/RegistryService.java similarity index 54% rename from karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/service/RegistryService.java rename to karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/registry/RegistryService.java index 11d6f9f8..d979561d 100644 --- a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/service/RegistryService.java +++ b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/registry/RegistryService.java @@ -14,9 +14,13 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.camel.karavan.service; +package org.apache.camel.karavan.registry; +import io.fabric8.kubernetes.api.model.Secret; import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; +import org.apache.camel.karavan.kubernetes.KubernetesService; +import org.apache.camel.karavan.service.ConfigService; import org.eclipse.microprofile.config.inject.ConfigProperty; import org.jboss.logging.Logger; @@ -39,31 +43,45 @@ public class RegistryService { @ConfigProperty(name = "karavan.image-registry-password") Optional<String> password; + @Inject + KubernetesService kubernetesService; - public String getRegistry() { + public RegistryConfig getRegistryConfig() { String registryUrl = registry; - if (!ConfigService.inDocker() && installRegistry) { + String imageGroup = group; + String registryUsername = username.orElse(null); + String registryPassword = password.orElse(null); + if (ConfigService.inKubernetes()) { + registryUrl = kubernetesService.getKaravanSecret("image-registry"); + String i = kubernetesService.getKaravanSecret("image-group"); + imageGroup = i != null ? i : group; + registryUsername = kubernetesService.getKaravanSecret("image-registry-username"); + registryPassword = kubernetesService.getKaravanSecret("image-registry-password"); + } else if (!ConfigService.inDocker() && installRegistry) { registryUrl = "localhost:5555"; } - return registryUrl; + return new RegistryConfig(registryUrl, imageGroup, registryUsername, registryPassword); } public String getRegistryWithGroup() { - return getRegistry() + "/" + group; + return getRegistryConfig().getRegistry() + "/" + group; } public String getRegistryWithGroupForSync() { + if (ConfigService.inKubernetes()) { + return getRegistryConfig().getRegistry() + "/" + group; + } return registry + "/" + group; } public List<String> getEnvForBuild() { - List<String> env = List.of( - "IMAGE_REGISTRY=" + registry, - "IMAGE_REGISTRY_USERNAME=" + username, - "IMAGE_REGISTRY_PASSWORD=" + password, - "IMAGE_GROUP=" + group + RegistryConfig rc = getRegistryConfig(); + return List.of( + "IMAGE_REGISTRY=" + rc.getRegistry(), + "IMAGE_REGISTRY_USERNAME=" + rc.getUsername(), + "IMAGE_REGISTRY_PASSWORD=" + rc.getPassword(), + "IMAGE_GROUP=" + rc.getGroup() ); - return env; } } diff --git a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/service/ConfigService.java b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/service/ConfigService.java index 349a41e2..cbb4ed56 100644 --- a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/service/ConfigService.java +++ b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/service/ConfigService.java @@ -83,7 +83,4 @@ public class ConfigService { return inDocker; } - public static boolean isDevOrTest() { - return ProfileManager.getLaunchMode().isDevOrTest(); - } } \ No newline at end of file diff --git a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/service/ContainerStatusService.java b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/service/ContainerStatusService.java index f6dbec9d..281213de 100644 --- a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/service/ContainerStatusService.java +++ b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/service/ContainerStatusService.java @@ -99,10 +99,12 @@ public class ContainerStatusService { } private void saveContainerStatus(ContainerStatus newStatus, ContainerStatus oldStatus) { - if ("exited".equalsIgnoreCase(newStatus.getState()) && Objects.isNull(oldStatus.getFinished())) { - newStatus.setFinished(Instant.now().toString()); - } else if ("exited".equalsIgnoreCase(newStatus.getState()) && Objects.nonNull(oldStatus.getFinished())) { - return; + if (Objects.equals("exited", newStatus.getState()) || Objects.equals("dead", newStatus.getState())) { + if (Objects.isNull(oldStatus.getFinished())) { + newStatus.setFinished(Instant.now().toString()); + } else if (Objects.nonNull(oldStatus.getFinished())) { + return; + } } if (newStatus.getCpuInfo() == null || newStatus.getCpuInfo().isEmpty()) { newStatus.setCpuInfo(oldStatus.getCpuInfo()); diff --git a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/service/ProjectService.java b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/service/ProjectService.java index 1a6a698a..b73a4fa9 100644 --- a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/service/ProjectService.java +++ b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/service/ProjectService.java @@ -28,6 +28,7 @@ import org.apache.camel.karavan.git.model.GitRepo; import org.apache.camel.karavan.infinispan.InfinispanService; import org.apache.camel.karavan.infinispan.model.*; import org.apache.camel.karavan.kubernetes.KubernetesService; +import org.apache.camel.karavan.registry.RegistryService; import org.eclipse.jgit.revwalk.RevCommit; import org.eclipse.microprofile.config.inject.ConfigProperty; import org.eclipse.microprofile.health.HealthCheck; @@ -124,13 +125,10 @@ public class ProjectService implements HealthCheck { } public void buildProject(Project project, String tag) throws Exception { - String templateName = project.getRuntime() + "-builder-script-docker.sh"; - String script = codeService.getTemplateText(templateName); - tag = tag != null && !tag.isEmpty() && !tag.isBlank() ? tag : Instant.now().toString().substring(0, 19).replace(":", "-"); - + String script = codeService.getBuilderScript(project); List<String> env = getEnvForBuild(project, tag); if (ConfigService.inKubernetes()) { kubernetesService.runBuildProject(project, script, env, tag); @@ -141,14 +139,10 @@ public class ProjectService implements HealthCheck { } private List<String> getEnvForBuild(Project project, String tag) { - GitConfig gitConfig = gitService.getGitConfigForBuilder(); List<String> env = new ArrayList<>(); env.addAll(registryService.getEnvForBuild()); + env.addAll(gitService.getEnvForBuild()); env.addAll(List.of( - "GIT_REPOSITORY=" + gitConfig.getUri(), - "GIT_USERNAME=" + gitConfig.getUsername(), - "GIT_PASSWORD=" + gitConfig.getPassword(), - "GIT_BRANCH=" + gitConfig.getBranch(), "PROJECT_ID=" + project.getProjectId(), "JBANG_REPO=~/.m2", "TAG=" + tag diff --git a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/shared/Constants.java b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/shared/Constants.java index 68d1361e..a63843a6 100644 --- a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/shared/Constants.java +++ b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/shared/Constants.java @@ -27,4 +27,11 @@ public class Constants { public static final String LABEL_TAG = "org.apache.camel.karavan/tag"; public static final String BUILDER_SUFFIX = "-builder"; + + public static final String CAMEL_PREFIX = "camel"; + public static final String KARAVAN_PREFIX = "karavan"; + public static final String JBANG_CACHE_SUFFIX = "jbang-cache"; + public static final String M2_CACHE_SUFFIX = "m2-cache"; + public static final String PVC_MAVEN_SETTINGS = "maven-settings"; + } diff --git a/karavan-web/karavan-app/src/main/resources/application.properties b/karavan-web/karavan-app/src/main/resources/application.properties index 0b3dc433..7ec18b80 100644 --- a/karavan-web/karavan-app/src/main/resources/application.properties +++ b/karavan-web/karavan-app/src/main/resources/application.properties @@ -123,7 +123,7 @@ quarkus.kubernetes-client.connection-timeout=2000 quarkus.kubernetes-client.request-timeout=10000 quarkus.kubernetes-client.devservices.enabled=false -%dev.quarkus.swagger-ui.always-include=true +quarkus.swagger-ui.always-include=true quarkus.quinoa.frozen-lockfile=false quarkus.quinoa.package-manager-install=false diff --git a/karavan-web/karavan-app/src/main/resources/snippets/camel-main-builder-script-docker.sh b/karavan-web/karavan-app/src/main/resources/snippets/camel-main-builder-script-docker.sh index 037632f8..7404231d 100644 --- a/karavan-web/karavan-app/src/main/resources/snippets/camel-main-builder-script-docker.sh +++ b/karavan-web/karavan-app/src/main/resources/snippets/camel-main-builder-script-docker.sh @@ -29,4 +29,4 @@ mvn package jib:build \ -Djib.allowInsecureRegistries=true \ -Djib.to.image=${IMAGE_REGISTRY}/${IMAGE_GROUP}/${PROJECT_ID}:${DATE} \ -Djib.to.auth.username=${IMAGE_REGISTRY_USERNAME} \ - -Djib.to.auth.password=${IMAGE_REGISTRY_PASSWORD} \ No newline at end of file + -Djib.to.auth.password=${IMAGE_REGISTRY_PASSWORD} diff --git a/karavan-web/karavan-app/src/main/resources/snippets/camel-main-builder-script-kubernetes.sh b/karavan-web/karavan-app/src/main/resources/snippets/camel-main-builder-script-kubernetes.sh index fb3a074f..667e66c2 100644 --- a/karavan-web/karavan-app/src/main/resources/snippets/camel-main-builder-script-kubernetes.sh +++ b/karavan-web/karavan-app/src/main/resources/snippets/camel-main-builder-script-kubernetes.sh @@ -2,29 +2,34 @@ CHECKOUT_DIR="/scripts" KAMELETS_DIR="/scripts/kamelets" -if [[ $GIT_REPOSITORY == https* ]] ; +if [[ ${GIT_REPOSITORY} == https* ]] ; then - replacer=https://$GIT_USERNAME:$GIT_PASSWORD@ + replacer=https://${GIT_USERNAME}:${GIT_PASSWORD}@ prefix=https:// url="${GIT_REPOSITORY/$prefix/$replacer}" git clone --depth 1 --branch ${GIT_BRANCH} $url ${CHECKOUT_DIR} +elif [[ ${GIT_REPOSITORY} == http* ]] ; +then + replacer=http://${GIT_USERNAME}:${GIT_PASSWORD}@ + prefix=http:// + url="${GIT_REPOSITORY/$prefix/$replacer}" + git clone --depth 1 --branch ${GIT_BRANCH} $url ${CHECKOUT_DIR} else git clone --depth 1 --branch ${GIT_BRANCH} ${GIT_REPOSITORY} ${CHECKOUT_DIR} fi -cd ${CHECKOUT_DIR}/$(inputs.params.project) +cd ${CHECKOUT_DIR}/${PROJECT_ID} -jbang -Dcamel.jbang.version=$CAMEL_VERSION camel@apache/camel export --local-kamelet-dir=${KAMELETS_DIR} +jbang -Dcamel.jbang.version=${CAMEL_VERSION} camel@apache/camel export --local-kamelet-dir=${KAMELETS_DIR} export LAST_COMMIT=$(git rev-parse --short HEAD) -export DATE=$(date '+%Y%m%d%H%M%S') +export DATE=${TAG} export TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token) export NAMESPACE=$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace) mvn package jib:build k8s:resource k8s:apply \ -Djkube.namespace=${NAMESPACE} \ -Djib.allowInsecureRegistries=true \ - -Djib.to.image=${IMAGE_REGISTRY}/${IMAGE_GROUP}/$(inputs.params.project):${DATE} \ + -Djib.to.image=${IMAGE_REGISTRY}/${IMAGE_GROUP}/${PROJECT_ID}:${DATE} \ -Djib.to.auth.username=${IMAGE_REGISTRY_USERNAME} \ - -Djib.to.auth.password=${IMAGE_REGISTRY_PASSWORD} \ - --settings=$MAVEN_SETTINGS \ No newline at end of file + -Djib.to.auth.password=${IMAGE_REGISTRY_PASSWORD} \ No newline at end of file diff --git a/karavan-web/karavan-app/src/main/webui/src/project/build/BuildPanel.tsx b/karavan-web/karavan-app/src/main/webui/src/project/build/BuildPanel.tsx index 8dd06889..409ad63c 100644 --- a/karavan-web/karavan-app/src/main/webui/src/project/build/BuildPanel.tsx +++ b/karavan-web/karavan-app/src/main/webui/src/project/build/BuildPanel.tsx @@ -124,7 +124,8 @@ export function BuildPanel () { const showTime = buildTime && buildTime > 0; const isRunning = state === 'running'; const isExited = state === 'exited'; - const color = isExited ? "grey" : (isRunning ? "blue" : "grey"); + const isFailed = state === 'failed'; + const color = (isRunning ? "blue" : (isFailed ? "red" : "grey")); const icon = isExited ? <UpIcon className="not-spinner"/> : <DownIcon className="not-spinner"/> return ( <Flex justifyContent={{default: "justifyContentSpaceBetween"}} alignItems={{default: "alignItemsCenter"}}> diff --git a/karavan-web/karavan-cli/xxx.yaml b/karavan-web/karavan-cli/xxx.yaml new file mode 100644 index 00000000..76f91f90 --- /dev/null +++ b/karavan-web/karavan-cli/xxx.yaml @@ -0,0 +1,695 @@ +--- +apiVersion: "v1" +kind: "PersistentVolumeClaim" +metadata: + labels: + app: "karavan-data" + app.kubernetes.io/part-of: "karavan" + app.kubernetes.io/name: "karavan-data" + app.kubernetes.io/version: "4.0.0-RC2" + name: "karavan-data" + namespace: "karavan" +spec: + accessModes: + - "ReadWriteOnce" + resources: + requests: + storage: "10Gi" + volumeMode: "Filesystem" +--- +apiVersion: "tekton.dev/v1beta1" +kind: "Pipeline" +metadata: + labels: + app: "karavan-pipeline-dev-camel-main" + app.kubernetes.io/part-of: "karavan" + app.kubernetes.io/name: "karavan-pipeline-dev-camel-main" + app.kubernetes.io/version: "4.0.0-RC2" + name: "karavan-pipeline-dev-camel-main" + namespace: "karavan" +spec: + params: + - description: "ProjectId" + name: "PROJECT_ID" + type: "string" + tasks: + - name: "karavan-task-dev-camel-main" + params: + - name: "project" + value: "$(params.PROJECT_ID)" + taskRef: + kind: "Task" + name: "karavan-task-dev-camel-main" + workspaces: + - name: "maven-settings" + subPath: "" + workspace: "maven-settings" + - name: "karavan-m2-cache" + subPath: "" + workspace: "karavan-m2-cache" + - name: "karavan-jbang-cache" + subPath: "" + workspace: "karavan-jbang-cache" + workspaces: + - description: "Maven Settings" + name: "maven-settings" + optional: false + - description: "Maven Cache" + name: "karavan-m2-cache" + optional: false + - description: "JBang Cache" + name: "karavan-jbang-cache" + optional: false +--- +apiVersion: "rbac.authorization.k8s.io/v1" +kind: "Role" +metadata: + name: "deployer" + namespace: "karavan" +rules: +- apiGroups: + - "" + resources: + - "secrets" + - "configmaps" + - "services" + - "persistentvolumes" + - "persistentvolumeclaims" + verbs: + - "*" +- apiGroups: + - "networking.k8s.io" + resources: + - "ingresses" + verbs: + - "*" +- apiGroups: + - "route.openshift.io" + resources: + - "routes" + verbs: + - "*" +- apiGroups: + - "apps" + resources: + - "deployments" + verbs: + - "*" +--- +apiVersion: "v1" +kind: "ServiceAccount" +metadata: + labels: + app: "karavan" + app.kubernetes.io/part-of: "karavan" + app.kubernetes.io/name: "karavan" + app.kubernetes.io/version: "4.0.0-RC2" + name: "karavan" + namespace: "karavan" +--- +apiVersion: "v1" +kind: "ServiceAccount" +metadata: + labels: + app: "pipeline" + app.kubernetes.io/part-of: "karavan" + app.kubernetes.io/name: "pipeline" + app.kubernetes.io/version: "4.0.0-RC2" + name: "pipeline" + namespace: "karavan" +--- +apiVersion: "tekton.dev/v1beta1" +kind: "Task" +metadata: + labels: + app: "karavan-task-dev-quarkus" + app.kubernetes.io/part-of: "karavan" + app.kubernetes.io/name: "karavan-task-dev-quarkus" + app.kubernetes.io/version: "4.0.0-RC2" + name: "karavan-task-dev-quarkus" + namespace: "karavan" +spec: + params: + - description: "ProjectId" + name: "project" + type: "string" + steps: + - env: + - name: "GIT_REPOSITORY" + valueFrom: + secretKeyRef: + key: "git-repository" + name: "karavan" + - name: "GIT_USERNAME" + valueFrom: + secretKeyRef: + key: "git-username" + name: "karavan" + - name: "GIT_PASSWORD" + valueFrom: + secretKeyRef: + key: "git-password" + name: "karavan" + - name: "GIT_BRANCH" + valueFrom: + secretKeyRef: + key: "git-branch" + name: "karavan" + - name: "IMAGE_REGISTRY" + valueFrom: + secretKeyRef: + key: "image-registry" + name: "karavan" + optional: true + - name: "IMAGE_GROUP" + valueFrom: + secretKeyRef: + key: "image-group" + name: "karavan" + optional: true + - name: "IMAGE_REGISTRY_USERNAME" + valueFrom: + secretKeyRef: + key: "image-registry-username" + name: "karavan" + optional: true + - name: "IMAGE_REGISTRY_PASSWORD" + valueFrom: + secretKeyRef: + key: "image-registry-password" + name: "karavan" + optional: true + image: "ghcr.io/apache/camel-karavan-devmode:4.0.0-RC2" + imagePullPolicy: "Always" + name: "karavan-build-deploy" + workspaces: + - description: "Maven Settings" + mountPath: "/karavan-config-map" + name: "maven-settings" + optional: false + readOnly: false + - description: "Maven Cache" + mountPath: "/root/.m2" + name: "karavan-m2-cache" + optional: false + readOnly: false + - description: "JBang Cache" + mountPath: "/jbang/.jbang/cache" + name: "karavan-jbang-cache" + optional: false + readOnly: false +--- +apiVersion: "tekton.dev/v1beta1" +kind: "Task" +metadata: + labels: + app: "karavan-task-dev-spring-boot" + app.kubernetes.io/part-of: "karavan" + app.kubernetes.io/name: "karavan-task-dev-spring-boot" + app.kubernetes.io/version: "4.0.0-RC2" + name: "karavan-task-dev-spring-boot" + namespace: "karavan" +spec: + params: + - description: "ProjectId" + name: "project" + type: "string" + steps: + - env: + - name: "GIT_REPOSITORY" + valueFrom: + secretKeyRef: + key: "git-repository" + name: "karavan" + - name: "GIT_USERNAME" + valueFrom: + secretKeyRef: + key: "git-username" + name: "karavan" + - name: "GIT_PASSWORD" + valueFrom: + secretKeyRef: + key: "git-password" + name: "karavan" + - name: "GIT_BRANCH" + valueFrom: + secretKeyRef: + key: "git-branch" + name: "karavan" + - name: "IMAGE_REGISTRY" + valueFrom: + secretKeyRef: + key: "image-registry" + name: "karavan" + optional: true + - name: "IMAGE_GROUP" + valueFrom: + secretKeyRef: + key: "image-group" + name: "karavan" + optional: true + - name: "IMAGE_REGISTRY_USERNAME" + valueFrom: + secretKeyRef: + key: "image-registry-username" + name: "karavan" + optional: true + - name: "IMAGE_REGISTRY_PASSWORD" + valueFrom: + secretKeyRef: + key: "image-registry-password" + name: "karavan" + optional: true + image: "ghcr.io/apache/camel-karavan-devmode:4.0.0-RC2" + imagePullPolicy: "Always" + name: "karavan-build-deploy" + script: "#!/usr/bin/env bash\nCHECKOUT_DIR=\"/scripts\"\nKAMELETS_DIR=\"/scripts/kamelets\"\ + \n\nif [[ $GIT_REPOSITORY == https* ]] ;\nthen\n replacer=https://$GIT_USERNAME:$GIT_PASSWORD@\n\ + \ prefix=https://\n url=\"${GIT_REPOSITORY/$prefix/$replacer}\"\n git\ + \ clone --depth 1 --branch ${GIT_BRANCH} $url ${CHECKOUT_DIR}\nelse\n git\ + \ clone --depth 1 --branch ${GIT_BRANCH} ${GIT_REPOSITORY} ${CHECKOUT_DIR}\n\ + fi\n\ncd ${CHECKOUT_DIR}/$(inputs.params.project)\n\njbang -Dcamel.jbang.version=$CAMEL_VERSION\ + \ camel@apache/camel export --local-kamelet-dir=${KAMELETS_DIR}\n\nexport LAST_COMMIT=$(git\ + \ rev-parse --short HEAD)\nexport DATE=$(date '+%Y%m%d%H%M%S')\nexport TOKEN=$(cat\ + \ /var/run/secrets/kubernetes.io/serviceaccount/token)\nexport NAMESPACE=$(cat\ + \ /var/run/secrets/kubernetes.io/serviceaccount/namespace)\n\nmvn package k8s:build\ + \ k8s:push k8s:resource k8s:apply \\\n -Pkubernetes \\\n -Djkube.namespace=${NAMESPACE}\ + \ \\\n -Djkube.docker.push.registry=${IMAGE_REGISTRY} \\\n -Djkube.docker.username=${IMAGE_REGISTRY_USERNAME}\ + \ \\\n -Djkube.docker.password=${IMAGE_REGISTRY_PASSWORD} \\\n -Djkube.generator.name=${IMAGE_REGISTRY}/${IMAGE_GROUP}/$(inputs.params.project):${DATE}\ + \ \\\n --settings=$MAVEN_SETTINGS" + workspaces: + - description: "Maven Settings" + mountPath: "/karavan-config-map" + name: "maven-settings" + optional: false + readOnly: false + - description: "Maven Cache" + mountPath: "/root/.m2" + name: "karavan-m2-cache" + optional: false + readOnly: false + - description: "JBang Cache" + mountPath: "/jbang/.jbang/cache" + name: "karavan-jbang-cache" + optional: false + readOnly: false +--- +apiVersion: "rbac.authorization.k8s.io/v1" +kind: "Role" +metadata: + name: "karavan" + namespace: "karavan" +rules: +- apiGroups: + - "" + resources: + - "secrets" + - "configmaps" + verbs: + - "*" +- apiGroups: + - "" + resources: + - "persistentvolumes" + - "persistentvolumeclaims" + verbs: + - "*" +- apiGroups: + - "tekton.dev" + resources: + - "pipelineruns" + verbs: + - "*" +- apiGroups: + - "" + resources: + - "pods" + - "services" + - "replicationcontrollers" + verbs: + - "*" +- apiGroups: + - "route.openshift.io" + resources: + - "routes" + verbs: + - "*" +- apiGroups: + - "apps" + resources: + - "deployments" + verbs: + - "*" +--- +apiVersion: "rbac.authorization.k8s.io/v1" +kind: "RoleBinding" +metadata: + name: "karavan-view" + namespace: "karavan" +roleRef: + kind: "ClusterRole" + apiGroup: "rbac.authorization.k8s.io" + name: "view" +subjects: +- kind: "ServiceAccount" + apiGroup: "" + name: "karavan" + namespace: "karavan" +--- +apiVersion: "v1" +kind: "PersistentVolumeClaim" +metadata: + labels: + app: "karavan-jbang-cache" + app.kubernetes.io/part-of: "karavan" + app.kubernetes.io/name: "karavan-jbang-cache" + app.kubernetes.io/version: "4.0.0-RC2" + name: "karavan-jbang-cache" + namespace: "karavan" +spec: + accessModes: + - "ReadWriteOnce" + resources: + requests: + storage: "2Gi" + volumeMode: "Filesystem" +--- +apiVersion: "rbac.authorization.k8s.io/v1" +kind: "RoleBinding" +metadata: + name: "pipeline-deployer" + namespace: "karavan" +roleRef: + kind: "Role" + apiGroup: "rbac.authorization.k8s.io" + name: "deployer" +subjects: +- kind: "ServiceAccount" + apiGroup: "" + name: "pipeline" + namespace: "karavan" +--- +apiVersion: "rbac.authorization.k8s.io/v1" +kind: "RoleBinding" +metadata: + name: "karavan" + namespace: "karavan" +roleRef: + kind: "Role" + apiGroup: "rbac.authorization.k8s.io" + name: "karavan" +subjects: +- kind: "ServiceAccount" + apiGroup: "" + name: "karavan" + namespace: "karavan" +--- +apiVersion: "tekton.dev/v1beta1" +kind: "Pipeline" +metadata: + labels: + app: "karavan-pipeline-dev-spring-boot" + app.kubernetes.io/part-of: "karavan" + app.kubernetes.io/name: "karavan-pipeline-dev-spring-boot" + app.kubernetes.io/version: "4.0.0-RC2" + name: "karavan-pipeline-dev-spring-boot" + namespace: "karavan" +spec: + params: + - description: "ProjectId" + name: "PROJECT_ID" + type: "string" + tasks: + - name: "karavan-task-dev-spring-boot" + params: + - name: "project" + value: "$(params.PROJECT_ID)" + taskRef: + kind: "Task" + name: "karavan-task-dev-spring-boot" + workspaces: + - name: "maven-settings" + subPath: "" + workspace: "maven-settings" + - name: "karavan-m2-cache" + subPath: "" + workspace: "karavan-m2-cache" + - name: "karavan-jbang-cache" + subPath: "" + workspace: "karavan-jbang-cache" + workspaces: + - description: "Maven Settings" + name: "maven-settings" + optional: false + - description: "Maven Cache" + name: "karavan-m2-cache" + optional: false + - description: "JBang Cache" + name: "karavan-jbang-cache" + optional: false +--- +apiVersion: "v1" +kind: "Service" +metadata: + labels: + app: "karavan" + app.kubernetes.io/part-of: "karavan" + app.kubernetes.io/name: "karavan" + app.kubernetes.io/version: "4.0.0-RC2" + name: "karavan" + namespace: "karavan" +spec: + ports: + - name: "http" + port: 80 + protocol: "TCP" + targetPort: 8080 + selector: + app: "karavan" + type: "ClusterIP" +--- +apiVersion: "tekton.dev/v1beta1" +kind: "Pipeline" +metadata: + labels: + app: "karavan-pipeline-dev-quarkus" + app.kubernetes.io/part-of: "karavan" + app.kubernetes.io/name: "karavan-pipeline-dev-quarkus" + app.kubernetes.io/version: "4.0.0-RC2" + name: "karavan-pipeline-dev-quarkus" + namespace: "karavan" +spec: + params: + - description: "ProjectId" + name: "PROJECT_ID" + type: "string" + tasks: + - name: "karavan-task-dev-quarkus" + params: + - name: "project" + value: "$(params.PROJECT_ID)" + taskRef: + kind: "Task" + name: "karavan-task-dev-quarkus" + workspaces: + - name: "maven-settings" + subPath: "" + workspace: "maven-settings" + - name: "karavan-m2-cache" + subPath: "" + workspace: "karavan-m2-cache" + - name: "karavan-jbang-cache" + subPath: "" + workspace: "karavan-jbang-cache" + workspaces: + - description: "Maven Settings" + name: "maven-settings" + optional: false + - description: "Maven Cache" + name: "karavan-m2-cache" + optional: false + - description: "JBang Cache" + name: "karavan-jbang-cache" + optional: false +--- +apiVersion: "v1" +kind: "PersistentVolumeClaim" +metadata: + labels: + app: "karavan-m2-cache" + app.kubernetes.io/part-of: "karavan" + app.kubernetes.io/name: "karavan-m2-cache" + app.kubernetes.io/version: "4.0.0-RC2" + name: "karavan-m2-cache" + namespace: "karavan" +spec: + accessModes: + - "ReadWriteOnce" + resources: + requests: + storage: "10Gi" + volumeMode: "Filesystem" +--- +apiVersion: "apps/v1" +kind: "Deployment" +metadata: + labels: + app.kubernetes.io/runtime: "quarkus" + name: "karavan" + namespace: "karavan" +spec: + replicas: 1 + selector: + matchLabels: + app: "karavan" + template: + metadata: + labels: + app: "karavan" + spec: + containers: + - env: + - name: "KARAVAN_ENVIRONMENT" + value: "dev" + - name: "KARAVAN_RUNTIMES" + value: "camel-main,quarkus,spring-boot" + - name: "KARAVAN_CONTAINER_STATUS_INTERVAL" + value: "disabled" + - name: "KARAVAN_CONTAINER_INFINISPAN_INTERVAL" + value: "disabled" + - name: "KARAVAN_CAMEL_STATUS_INTERVAL" + value: "3s" + - name: "INFINISPAN_HOSTS" + value: "infinispan.karavan:11222" + - name: "INFINISPAN_PASSWORD" + valueFrom: + secretKeyRef: + key: "password" + name: "infinispan-secret" + optional: false + - name: "KUBERNETES_NAMESPACE" + valueFrom: + fieldRef: + apiVersion: "" + fieldPath: "metadata.namespace" + - name: "QUARKUS_SCHEDULER_ENABLED" + value: "true" + - name: "KARAVAN_GIT_PULL_INTERVAL" + value: "off" + image: "ghcr.io/apache/camel-karavan:4.0.0-RC2" + imagePullPolicy: "Always" + name: "karavan" + ports: + - containerPort: 8080 + name: "karavan" + resources: + requests: + memory: "512Mi" + volumeMounts: + - mountPath: "/deployments/karavan-data" + name: "karavan-data" + - mountPath: "/tmp" + name: "ephemeral" + serviceAccount: "karavan" + volumes: + - name: "karavan-data" + persistentVolumeClaim: + claimName: "karavan-data" + readOnly: false + - emptyDir: {} + name: "ephemeral" +--- +apiVersion: "tekton.dev/v1beta1" +kind: "Task" +metadata: + labels: + app: "karavan-task-dev-camel-main" + app.kubernetes.io/part-of: "karavan" + app.kubernetes.io/name: "karavan-task-dev-camel-main" + app.kubernetes.io/version: "4.0.0-RC2" + name: "karavan-task-dev-camel-main" + namespace: "karavan" +spec: + params: + - description: "ProjectId" + name: "project" + type: "string" + steps: + - env: + - name: "GIT_REPOSITORY" + valueFrom: + secretKeyRef: + key: "git-repository" + name: "karavan" + - name: "GIT_USERNAME" + valueFrom: + secretKeyRef: + key: "git-username" + name: "karavan" + - name: "GIT_PASSWORD" + valueFrom: + secretKeyRef: + key: "git-password" + name: "karavan" + - name: "GIT_BRANCH" + valueFrom: + secretKeyRef: + key: "git-branch" + name: "karavan" + - name: "IMAGE_REGISTRY" + valueFrom: + secretKeyRef: + key: "image-registry" + name: "karavan" + optional: true + - name: "IMAGE_GROUP" + valueFrom: + secretKeyRef: + key: "image-group" + name: "karavan" + optional: true + - name: "IMAGE_REGISTRY_USERNAME" + valueFrom: + secretKeyRef: + key: "image-registry-username" + name: "karavan" + optional: true + - name: "IMAGE_REGISTRY_PASSWORD" + valueFrom: + secretKeyRef: + key: "image-registry-password" + name: "karavan" + optional: true + image: "ghcr.io/apache/camel-karavan-devmode:4.0.0-RC2" + imagePullPolicy: "Always" + name: "karavan-build-deploy" + script: "#!/usr/bin/env bash\nCHECKOUT_DIR=\"/scripts\"\nKAMELETS_DIR=\"/scripts/kamelets\"\ + \n\nif [[ $GIT_REPOSITORY == https* ]] ;\nthen\n replacer=https://$GIT_USERNAME:$GIT_PASSWORD@\n\ + \ prefix=https://\n url=\"${GIT_REPOSITORY/$prefix/$replacer}\"\n git\ + \ clone --depth 1 --branch ${GIT_BRANCH} $url ${CHECKOUT_DIR}\nelse\n git\ + \ clone --depth 1 --branch ${GIT_BRANCH} ${GIT_REPOSITORY} ${CHECKOUT_DIR}\n\ + fi\n\ncd ${CHECKOUT_DIR}/$(inputs.params.project)\n\njbang -Dcamel.jbang.version=$CAMEL_VERSION\ + \ camel@apache/camel export --local-kamelet-dir=${KAMELETS_DIR}\n\nexport LAST_COMMIT=$(git\ + \ rev-parse --short HEAD)\nexport DATE=$(date '+%Y%m%d%H%M%S')\nexport TOKEN=$(cat\ + \ /var/run/secrets/kubernetes.io/serviceaccount/token)\nexport NAMESPACE=$(cat\ + \ /var/run/secrets/kubernetes.io/serviceaccount/namespace)\n\nmvn package jib:build\ + \ k8s:resource k8s:apply \\\n -Djkube.namespace=${NAMESPACE} \\\n -Djib.allowInsecureRegistries=true\ + \ \\\n -Djib.to.image=${IMAGE_REGISTRY}/${IMAGE_GROUP}/$(inputs.params.project):${DATE}\ + \ \\\n -Djib.to.auth.username=${IMAGE_REGISTRY_USERNAME} \\\n -Djib.to.auth.password=${IMAGE_REGISTRY_PASSWORD}\ + \ \\\n --settings=$MAVEN_SETTINGS" + workspaces: + - description: "Maven Settings" + mountPath: "/karavan-config-map" + name: "maven-settings" + optional: false + readOnly: false + - description: "Maven Cache" + mountPath: "/root/.m2" + name: "karavan-m2-cache" + optional: false + readOnly: false + - description: "JBang Cache" + mountPath: "/jbang/.jbang/cache" + name: "karavan-jbang-cache" + optional: false + readOnly: false