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
commit a929b1003ae25bcab7bd64be24822001b6ad9f55 Author: Marat Gubaidullin <ma...@talismancloud.io> AuthorDate: Tue Sep 5 22:13:57 2023 -0400 Registry service for #817 --- .../camel/karavan/docker/DockerForGitea.java | 13 ---- .../camel/karavan/docker/DockerForInfinispan.java | 15 ---- .../camel/karavan/docker/DockerForKaravan.java | 90 ++++++++++++++++++++++ ...erForInfinispan.java => DockerForRegistry.java} | 39 ++-------- .../apache/camel/karavan/docker/DockerService.java | 1 - .../apache/camel/karavan/service/CodeService.java | 2 +- .../camel/karavan/service/KaravanService.java | 11 ++- .../camel/karavan/service/ProjectService.java | 63 ++++++++++----- .../src/main/resources/application.properties | 7 ++ .../src/main/resources/services/devservices.yaml | 5 -- .../src/main/resources/services/internal.yaml | 18 ++--- .../snippets/camel-main-builder-script-docker.sh | 34 ++++++++ .../camel-main-builder-script-kubernetes.sh | 30 ++++++++ .../camel-main-builder-script-openshift.sh | 30 ++++++++ .../camel-main-docker-application.properties | 1 + .../snippets/quarkus-builder-script-kubernetes.sh | 39 ++++++++++ .../snippets/quarkus-builder-script-openshift.sh | 41 ++++++++++ .../spring-boot-builder-script-kubernetes.sh | 31 ++++++++ .../spring-boot-builder-script-openshift.sh | 29 +++++++ 19 files changed, 400 insertions(+), 99 deletions(-) diff --git a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerForGitea.java b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerForGitea.java index da52c520..c6386808 100644 --- a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerForGitea.java +++ b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerForGitea.java @@ -17,11 +17,7 @@ package org.apache.camel.karavan.docker; import com.github.dockerjava.api.command.ExecCreateCmdResponse; -import com.github.dockerjava.api.command.HealthState; import com.github.dockerjava.api.model.Container; -import io.quarkus.vertx.ConsumeEvent; -import io.vertx.core.eventbus.EventBus; -import io.vertx.core.json.Json; import jakarta.enterprise.context.ApplicationScoped; import jakarta.inject.Inject; import org.apache.camel.karavan.infinispan.model.ContainerStatus; @@ -31,18 +27,9 @@ import org.apache.camel.karavan.service.GitService; import org.apache.camel.karavan.service.GiteaService; import org.jboss.logging.Logger; -import java.io.UnsupportedEncodingException; -import java.net.URLEncoder; -import java.nio.charset.StandardCharsets; -import java.util.HashMap; -import java.util.Map; - @ApplicationScoped public class DockerForGitea { - public static final String GITEA_CREATE_INSTANCE_DELAY = "GITEA_CREATE_INSTANCE_DELAY"; - public static final String GITEA_CREATE_INSTANCE = "GITEA_CREATE_INSTANCE"; - private static final Logger LOGGER = Logger.getLogger(DockerForGitea.class.getName()); protected static final String GITEA_CONTAINER_NAME = "gitea"; diff --git a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerForInfinispan.java b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerForInfinispan.java index 54774463..de1a33d7 100644 --- a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerForInfinispan.java +++ b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerForInfinispan.java @@ -16,7 +16,6 @@ */ package org.apache.camel.karavan.docker; -import io.vertx.core.eventbus.EventBus; import jakarta.enterprise.context.ApplicationScoped; import jakarta.inject.Inject; import org.apache.camel.karavan.infinispan.model.ContainerStatus; @@ -24,9 +23,6 @@ import org.apache.camel.karavan.service.CodeService; import org.eclipse.microprofile.config.inject.ConfigProperty; import org.jboss.logging.Logger; -import java.util.Arrays; -import java.util.List; - @ApplicationScoped public class DockerForInfinispan { @@ -58,15 +54,4 @@ public class DockerForInfinispan { LOGGER.error(e.getCause().getMessage()); } } - -// public void checkInfinispanHealth() { -// dockerService.listContainers(false).stream() -// .filter(c -> c.getState().equals("running")) -// .forEach(c -> { -// HealthState hs = dockerService.inspectContainer(c.getId()).getState().getHealth(); -// if (c.getNames()[0].equals("/" + INFINISPAN_CONTAINER_NAME)) { -// eventBus.publish(INFINISPAN_STARTED, hs.getStatus()); -// } -// }); -// } } 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 66d5b0eb..38a5a563 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 @@ -50,6 +50,7 @@ public class DockerForKaravan { dockerService.runContainer(projectId); dockerService.copyFiles(projectId, "/code", files); } + protected void createDevmodeContainer(String projectId, String jBangOptions, Map<Integer, Integer> ports) throws InterruptedException { LOGGER.infof("DevMode starting for %s with JBANG_OPTIONS=%s", projectId, jBangOptions); @@ -68,6 +69,95 @@ public class DockerForKaravan { LOGGER.infof("DevMode started for %s", projectId); } + public void runBuildProject(String projectId, String script, Map<String, String> files) throws Exception { +// createBuildContainer(projectId, jBangOptions, ports); +// dockerService.runContainer(projectId); +// dockerService.copyFiles(projectId, "/code", files); + + + // String scriptName = "camel-main-builder-script-docker.sh"; +// String script = getResourceFile("/scripts/" + scriptName); +// try { +// CreateContainerResponse res = dockerClient.createContainerCmd("test") +// .withName("xxx") +// .withImage("ghcr.io/apache/camel-karavan-devmode:4.0.0-RC2") +// .withCmd("/karavan/"+scriptName) +// .withEnv("GIT_BRANCH=main", +// "GIT_REPOSITORY=http://gitea:3000/karavan/karavan.git", +// "GIT_USERNAME=karavan", +// "GIT_PASSWORD=karavan", +// "PROJECT_ID=zzzzz", +// "CAMEL_VERSION=4.0.0", +// "IMAGE_REGISTRY=registry:5000", +// "IMAGE_GROUP=karavan") +// .withHostConfig(new HostConfig().withNetworkMode("karavan")).exec(); +// +// } catch (Exception e) { +// System.out.println(e.getMessage()); +// } +// +// Container c = dockerClient.listContainersCmd().withShowAll(true).withNameFilter(Collections.singleton("xxx")).exec().get(0); +// +// String temp = Vertx.vertx().fileSystem().createTempDirectoryBlocking("xxx"); +// String path = temp + File.separator + scriptName; +// Vertx.vertx().fileSystem().writeFileBlocking(path, Buffer.buffer(script)); +// +// try (ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); +// TarArchiveOutputStream tarArchive = new TarArchiveOutputStream(byteArrayOutputStream)) { +// tarArchive.setLongFileMode(TarArchiveOutputStream.LONGFILE_POSIX); +// tarArchive.setBigNumberMode(TarArchiveOutputStream.BIGNUMBER_POSIX); +// +// TarArchiveEntry tarEntry = new TarArchiveEntry(new File(path)); +// tarEntry.setName(scriptName); +// tarEntry.setMode(0700); // +// tarArchive.putArchiveEntry(tarEntry); +// IOUtils.write(Files.readAllBytes(Paths.get(path)), tarArchive); +// tarArchive.closeArchiveEntry(); +// tarArchive.finish(); +// +// dockerClient.copyArchiveToContainerCmd(c.getId()) +// .withTarInputStream(new ByteArrayInputStream(byteArrayOutputStream.toByteArray())) +// .withRemotePath("/karavan").exec(); +// } catch (Exception e) { +// e.printStackTrace(); +// } + +// dockerClient.startContainerCmd(c.getId()).exec(); + } + + + protected void createBuildContainer(String projectId, Map<Integer, Integer> ports) throws InterruptedException { + LOGGER.infof("Starting Build Container for %s ", projectId); + + List<String> env = List.of( + "GIT_REPOSITORY=http://gitea:3000/karavan/karavan.git", + "GIT_USERNAME=karavan", + "GIT_PASSWORD=karavan", + "PROJECT_ID=" + projectId, + "CAMEL_VERSION=4.0.0", + "IMAGE_REGISTRY=registry:5000", + "IMAGE_GROUP=karavan" + ); + +// .withCmd("/karavan/"+scriptName) +// .withEnv("GIT_BRANCH=main", +// "GIT_REPOSITORY=http://gitea:3000/karavan/karavan.git", +// "GIT_USERNAME=karavan", +// "GIT_PASSWORD=karavan", +// "PROJECT_ID=zzzzz", +// "CAMEL_VERSION=4.0.0", +// "IMAGE_REGISTRY=registry:5000", +// "IMAGE_GROUP=karavan") +// .withHostConfig(new HostConfig().withNetworkMode("karavan")).exec(); + + dockerService.createContainer(projectId + "-builder", devmodeImage, + env, ports, new HealthCheck(), + Map.of(LABEL_TYPE, ContainerStatus.ContainerType.devmode.name(), LABEL_PROJECT_ID, projectId), + Map.of()); + + LOGGER.infof("Build Container started for %s", projectId); + } + public void createDevserviceContainer(DockerComposeService dockerComposeService) throws InterruptedException { LOGGER.infof("DevService starting for ", dockerComposeService.getContainer_name()); dockerService.createContainerFromCompose(dockerComposeService, ContainerStatus.ContainerType.devservice); diff --git a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerForInfinispan.java b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerForRegistry.java similarity index 53% copy from karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerForInfinispan.java copy to karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerForRegistry.java index 54774463..b2d1fa4e 100644 --- a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerForInfinispan.java +++ b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerForRegistry.java @@ -16,28 +16,18 @@ */ package org.apache.camel.karavan.docker; -import io.vertx.core.eventbus.EventBus; import jakarta.enterprise.context.ApplicationScoped; import jakarta.inject.Inject; import org.apache.camel.karavan.infinispan.model.ContainerStatus; import org.apache.camel.karavan.service.CodeService; -import org.eclipse.microprofile.config.inject.ConfigProperty; import org.jboss.logging.Logger; -import java.util.Arrays; -import java.util.List; - @ApplicationScoped -public class DockerForInfinispan { - - private static final Logger LOGGER = Logger.getLogger(DockerForInfinispan.class.getName()); +public class DockerForRegistry { - protected static final String INFINISPAN_CONTAINER_NAME = "infinispan"; + private static final Logger LOGGER = Logger.getLogger(DockerForRegistry.class.getName()); - @ConfigProperty(name = "karavan.infinispan.username") - String infinispanUsername; - @ConfigProperty(name = "karavan.infinispan.password") - String infinispanPassword; + protected static final String REGISTRY_CONTAINER_NAME = "registry"; @Inject DockerService dockerService; @@ -45,28 +35,15 @@ public class DockerForInfinispan { @Inject CodeService codeService; - public void startInfinispan() { + public void startRegistry() { try { - LOGGER.info("Infinispan is starting..."); - var compose = codeService.getInternalDockerComposeService(INFINISPAN_CONTAINER_NAME); - compose.addEnvironment("USER", infinispanUsername); - compose.addEnvironment("PASS", infinispanPassword); + LOGGER.info("Registry is starting..."); + var compose = codeService.getInternalDockerComposeService(REGISTRY_CONTAINER_NAME); dockerService.createContainerFromCompose(compose, ContainerStatus.ContainerType.internal); - dockerService.runContainer(INFINISPAN_CONTAINER_NAME); - LOGGER.info("Infinispan is started"); + dockerService.runContainer(REGISTRY_CONTAINER_NAME); + LOGGER.info("Registry is started"); } catch (Exception e) { LOGGER.error(e.getCause().getMessage()); } } - -// public void checkInfinispanHealth() { -// dockerService.listContainers(false).stream() -// .filter(c -> c.getState().equals("running")) -// .forEach(c -> { -// HealthState hs = dockerService.inspectContainer(c.getId()).getState().getHealth(); -// if (c.getNames()[0].equals("/" + INFINISPAN_CONTAINER_NAME)) { -// eventBus.publish(INFINISPAN_STARTED, hs.getStatus()); -// } -// }); -// } } 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 5a2932c4..04ef2043 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 @@ -187,7 +187,6 @@ public class DockerService extends DockerServiceUtils { .withMounts(mounts) .withNetworkMode(NETWORK_NAME)); - CreateContainerResponse response = createContainerCmd.exec(); LOGGER.info("Container created: " + response.getId()); return getDockerClient().listContainersCmd().withShowAll(true) diff --git a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/service/CodeService.java b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/service/CodeService.java index e9e0893b..594be91b 100644 --- a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/service/CodeService.java +++ b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/service/CodeService.java @@ -107,7 +107,7 @@ public class CodeService { return new ProjectFile(APPLICATION_PROPERTIES_FILENAME, code, project.getProjectId(), Instant.now().toEpochMilli()); } - private String getTemplateText(String fileName) { + public String getTemplateText(String fileName) { try { List<ProjectFile> files = infinispanService.getProjectFiles(Project.Type.templates.name()); return files.stream().filter(f -> f.getName().equalsIgnoreCase(fileName)) diff --git a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/service/KaravanService.java b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/service/KaravanService.java index c5a77168..744ed95d 100644 --- a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/service/KaravanService.java +++ b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/service/KaravanService.java @@ -24,7 +24,7 @@ import io.vertx.core.eventbus.EventBus; import jakarta.inject.Singleton; import org.apache.camel.karavan.docker.DockerForGitea; import org.apache.camel.karavan.docker.DockerForInfinispan; -import org.apache.camel.karavan.docker.DockerForKaravan; +import org.apache.camel.karavan.docker.DockerForRegistry; import org.apache.camel.karavan.docker.DockerService; import org.apache.camel.karavan.infinispan.InfinispanService; import org.apache.camel.karavan.kubernetes.KubernetesService; @@ -44,6 +44,9 @@ public class KaravanService { @ConfigProperty(name = "karavan.git-install-gitea") boolean giteaInstall; + @ConfigProperty(name = "karavan.image-registry-install-registry") + boolean registryInstall; + @Inject KubernetesService kubernetesService; @@ -54,7 +57,8 @@ public class KaravanService { DockerForGitea dockerForGitea; @Inject - DockerForKaravan dockerForKaravan; + DockerForRegistry dockerForRegistry; + @Inject DockerForInfinispan dockerForInfinispan; @@ -98,6 +102,9 @@ public class KaravanService { giteaService.install(); dockerForGitea.createGiteaUser(); } + if (registryInstall) { + dockerForRegistry.startRegistry(); + } } } 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 009e6ee8..8740d724 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 @@ -24,10 +24,7 @@ import jakarta.ws.rs.core.Response; import org.apache.camel.karavan.docker.DockerForKaravan; import org.apache.camel.karavan.docker.model.DockerComposeService; import org.apache.camel.karavan.infinispan.InfinispanService; -import org.apache.camel.karavan.infinispan.model.ContainerStatus; -import org.apache.camel.karavan.infinispan.model.GitRepo; -import org.apache.camel.karavan.infinispan.model.Project; -import org.apache.camel.karavan.infinispan.model.ProjectFile; +import org.apache.camel.karavan.infinispan.model.*; import org.apache.camel.karavan.kubernetes.KubernetesService; import org.apache.camel.karavan.shared.ConfigService; import org.apache.camel.karavan.shared.EventType; @@ -42,6 +39,7 @@ import org.jboss.logging.Logger; import jakarta.enterprise.context.ApplicationScoped; import jakarta.enterprise.inject.Default; import jakarta.inject.Inject; + import java.time.Instant; import java.util.List; import java.util.Map; @@ -56,7 +54,7 @@ import static org.apache.camel.karavan.service.CodeService.PROJECT_COMPOSE_FILEN @Default @Readiness @ApplicationScoped -public class ProjectService implements HealthCheck{ +public class ProjectService implements HealthCheck { private static final Logger LOGGER = Logger.getLogger(ProjectService.class.getName()); @@ -89,15 +87,14 @@ public class ProjectService implements HealthCheck{ @Override public HealthCheckResponse call() { - if(ready.get()) { + if (ready.get()) { return HealthCheckResponse.named("project").up().build(); - } - else { + } else { return HealthCheckResponse.named("project").down().build(); } } - public String runProjectWithJBangOptions(Project project, @PathParam("jBangOptions") String jBangOptions) throws Exception { + public String runProjectWithJBangOptions(Project project, String jBangOptions) throws Exception { String containerName = project.getProjectId(); ContainerStatus status = infinispanService.getDevModeContainerStatus(project.getProjectId(), environment); if (status == null) { @@ -111,7 +108,7 @@ public class ProjectService implements HealthCheck{ if (ConfigService.inKubernetes()) { kubernetesService.runDevModeContainer(project, jBangOptions); } else { - Map<String, String> files = infinispanService.getProjectFiles(project.getProjectId()).stream() + Map<String, String> files = infinispanService.getProjectFiles(project.getProjectId()).stream() .filter(f -> !Objects.equals(f.getName(), PROJECT_COMPOSE_FILENAME)) .collect(Collectors.toMap(ProjectFile::getName, ProjectFile::getCode)); ProjectFile compose = infinispanService.getProjectFile(project.getProjectId(), PROJECT_COMPOSE_FILENAME); @@ -124,10 +121,38 @@ public class ProjectService implements HealthCheck{ } } + public String buildProject(Project project) throws Exception { + if (ConfigService.inKubernetes()) { + return kubernetesService.createPipelineRun(project); + } else { + Map<String, String> files = infinispanService.getProjectFiles(project.getProjectId()).stream() + .filter(f -> !Objects.equals(f.getName(), PROJECT_COMPOSE_FILENAME)) + .collect(Collectors.toMap(ProjectFile::getName, ProjectFile::getCode)); + ProjectFile compose = infinispanService.getProjectFile(project.getProjectId(), PROJECT_COMPOSE_FILENAME); + DockerComposeService dcs = codeService.convertToDockerComposeService(compose.getCode(), project.getProjectId()); + + String templateName = project.getRuntime() + "-builder-script-docker.sh"; + String script = codeService.getTemplateText(templateName); + + GitConfig gitConfig = gitService.getGitConfig(); + List<String> env = List.of( + "GIT_REPOSITORY=" + gitConfig.getUri(), + "GIT_USERNAME=" + gitConfig.getUsername(), + "GIT_PASSWORD=" + gitConfig.getPassword(), + "PROJECT_ID=" + project.getProjectId(), + "IMAGE_REGISTRY=registry:5000", + "IMAGE_GROUP=karavan" + ); + + dockerForKaravan.runBuildProject(project.getProjectId(), script, files); + return project.getProjectId(); + } + } + public Project save(Project project) throws Exception { boolean isNew = infinispanService.getProject(project.getProjectId()) == null; infinispanService.saveProject(project); - if (isNew){ + if (isNew) { ProjectFile appProp = codeService.getApplicationProperties(project); infinispanService.saveProjectFile(appProp); if (!ConfigService.inKubernetes()) { @@ -198,11 +223,11 @@ public class ProjectService implements HealthCheck{ String folderName = repo.getName(); if (folderName.equals(Project.Type.templates.name())) { project = new Project(Project.Type.templates.name(), "Templates", "Templates", "", repo.getCommitId(), repo.getLastCommitTimestamp(), Project.Type.templates); - } else if (folderName.equals(Project.Type.kamelets.name())){ + } else if (folderName.equals(Project.Type.kamelets.name())) { project = new Project(Project.Type.kamelets.name(), "Custom Kamelets", "Custom Kamelets", "", repo.getCommitId(), repo.getLastCommitTimestamp(), Project.Type.kamelets); - } else if (folderName.equals(Project.Type.pipelines.name())){ + } else if (folderName.equals(Project.Type.pipelines.name())) { project = new Project(Project.Type.pipelines.name(), "Pipelines", "CI/CD Pipelines", "", repo.getCommitId(), repo.getLastCommitTimestamp(), Project.Type.pipelines); - } else if (folderName.equals(Project.Type.services.name())){ + } else if (folderName.equals(Project.Type.services.name())) { project = new Project(Project.Type.services.name(), "Services", "Development Services", "", repo.getCommitId(), repo.getLastCommitTimestamp(), Project.Type.services); } else { project = getProjectFromRepo(repo); @@ -271,7 +296,7 @@ public class ProjectService implements HealthCheck{ void addKameletsProject() { LOGGER.info("Add custom kamelets project if not exists"); try { - Project kamelets = infinispanService.getProject(Project.Type.kamelets.name()); + Project kamelets = infinispanService.getProject(Project.Type.kamelets.name()); if (kamelets == null) { kamelets = new Project(Project.Type.kamelets.name(), "Custom Kamelets", "Custom Kamelets", "", "", Instant.now().toEpochMilli(), Project.Type.kamelets); infinispanService.saveProject(kamelets); @@ -285,7 +310,7 @@ public class ProjectService implements HealthCheck{ void addTemplatesProject() { LOGGER.info("Add templates project if not exists"); try { - Project templates = infinispanService.getProject(Project.Type.templates.name()); + Project templates = infinispanService.getProject(Project.Type.templates.name()); if (templates == null) { templates = new Project(Project.Type.templates.name(), "Templates", "Templates", "", "", Instant.now().toEpochMilli(), Project.Type.templates); infinispanService.saveProject(templates); @@ -304,7 +329,7 @@ public class ProjectService implements HealthCheck{ void addServicesProject() { LOGGER.info("Add services project if not exists"); try { - Project services = infinispanService.getProject(Project.Type.services.name()); + Project services = infinispanService.getProject(Project.Type.services.name()); if (services == null) { services = new Project(Project.Type.services.name(), "Services", "Development Services", "", "", Instant.now().toEpochMilli(), Project.Type.services); infinispanService.saveProject(services); @@ -323,7 +348,7 @@ public class ProjectService implements HealthCheck{ void addPipelinesProject() { LOGGER.info("Add pipelines project if not exists"); try { - Project pipelines = infinispanService.getProject(Project.Type.pipelines.name()); + Project pipelines = infinispanService.getProject(Project.Type.pipelines.name()); if (pipelines == null) { pipelines = new Project(Project.Type.pipelines.name(), "Pipelines", "CI/CD Pipelines", "", "", Instant.now().toEpochMilli(), Project.Type.pipelines); infinispanService.saveProject(pipelines); @@ -340,7 +365,7 @@ public class ProjectService implements HealthCheck{ } public String getDevServiceCode() { - List <ProjectFile> files = infinispanService.getProjectFiles(Project.Type.services.name()); + List<ProjectFile> files = infinispanService.getProjectFiles(Project.Type.services.name()); Optional<ProjectFile> file = files.stream().filter(f -> f.getName().equals(DEV_SERVICES_FILENAME)).findFirst(); return file.orElse(new ProjectFile()).getCode(); } diff --git a/karavan-web/karavan-app/src/main/resources/application.properties b/karavan-web/karavan-app/src/main/resources/application.properties index cca3ea01..2aeb804a 100644 --- a/karavan-web/karavan-app/src/main/resources/application.properties +++ b/karavan-web/karavan-app/src/main/resources/application.properties @@ -16,6 +16,13 @@ karavan.git-branch=main karavan.git-install-gitea=true karavan.git-pull-interval=disabled +# Image registry configuration +karavan.image-registry=localhost:5555 +karavan.image-group=karavan +karavan.image-registry-username= +karavan.image-registry-password= +karavan.image-registry-install-registry=true + # Infinispan container config in Docker karavan.infinispan.image=quay.io/infinispan/server:14.0.6.Final karavan.infinispan.port=11222:11222 diff --git a/karavan-web/karavan-app/src/main/resources/services/devservices.yaml b/karavan-web/karavan-app/src/main/resources/services/devservices.yaml index e921cd22..b385a2b2 100644 --- a/karavan-web/karavan-app/src/main/resources/services/devservices.yaml +++ b/karavan-web/karavan-app/src/main/resources/services/devservices.yaml @@ -12,11 +12,6 @@ services: environment: AMQ_USER: artemis AMQ_PASSWORD: artemis - healthcheck: - test: ["CMD-SHELL", "curl -u artemis:artemis http://artemis:8161/console/jolokia"] - interval: 5s - timeout: 5s - retries: 5 zookeeper: image: confluentinc/cp-zookeeper:latest diff --git a/karavan-web/karavan-app/src/main/resources/services/internal.yaml b/karavan-web/karavan-app/src/main/resources/services/internal.yaml index 413e2061..db220a47 100644 --- a/karavan-web/karavan-app/src/main/resources/services/internal.yaml +++ b/karavan-web/karavan-app/src/main/resources/services/internal.yaml @@ -7,21 +7,15 @@ services: restart: always ports: - "11222:11222" - healthcheck: - test: [ "CMD", "curl", "-f", "http://localhost:11222/rest/v2/cache-managers/default/health/status" ] - interval: 30s - timeout: 10s - retries: 10 - start_period: 10s gitea: image: gitea/gitea:1.20.2-rootless restart: always ports: - "3000:3000" - healthcheck: - test: [ "CMD", "curl", "-fss", "127.0.0.1:3000/api/healthz" ] - interval: 30s - timeout: 10s - retries: 10 - start_period: 2s + + registry: + image: registry:2 + restart: always + ports: + - "5555:5000" \ No newline at end of file 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 new file mode 100644 index 00000000..e28483e1 --- /dev/null +++ b/karavan-web/karavan-app/src/main/resources/snippets/camel-main-builder-script-docker.sh @@ -0,0 +1,34 @@ +#!/usr/bin/env bash +CHECKOUT_DIR="/scripts" +KAMELETS_DIR="/scripts/kamelets" + +if [[ ${GIT_REPOSITORY} == https* ]] ; +then + replacer=https://${GIT_USERNAME}:${GIT_PASSWORD}@ + prefix=https:// + url="${GIT_REPOSITORY/$prefix/$replacer}" + echo url + 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}" + echo url + 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}/${PROJECT_ID} + +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') + +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 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 new file mode 100644 index 00000000..fb3a074f --- /dev/null +++ b/karavan-web/karavan-app/src/main/resources/snippets/camel-main-builder-script-kubernetes.sh @@ -0,0 +1,30 @@ +#!/usr/bin/env bash +CHECKOUT_DIR="/scripts" +KAMELETS_DIR="/scripts/kamelets" + +if [[ $GIT_REPOSITORY == https* ]] ; +then + replacer=https://$GIT_USERNAME:$GIT_PASSWORD@ + prefix=https:// + 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) + +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 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.auth.username=${IMAGE_REGISTRY_USERNAME} \ + -Djib.to.auth.password=${IMAGE_REGISTRY_PASSWORD} \ + --settings=$MAVEN_SETTINGS \ No newline at end of file diff --git a/karavan-web/karavan-app/src/main/resources/snippets/camel-main-builder-script-openshift.sh b/karavan-web/karavan-app/src/main/resources/snippets/camel-main-builder-script-openshift.sh new file mode 100644 index 00000000..ebad0494 --- /dev/null +++ b/karavan-web/karavan-app/src/main/resources/snippets/camel-main-builder-script-openshift.sh @@ -0,0 +1,30 @@ +#!/usr/bin/env bash +CHECKOUT_DIR="/scripts" +KAMELETS_DIR="/scripts/kamelets" + +if [[ $GIT_REPOSITORY == https* ]] ; +then + replacer=https://$GIT_USERNAME:$GIT_PASSWORD@ + prefix=https:// + 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) + +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 TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token) +export NAMESPACE=$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace) + +mvn package jib:build oc:resource oc:apply \ + -Djkube.namespace=${NAMESPACE} \ + -Djib.allowInsecureRegistries=true \ + -Djib.to.image=${IMAGE_REGISTRY}/${IMAGE_GROUP}/$(inputs.params.project):${DATE} \ + -Djib.to.auth.username=${IMAGE_REGISTRY_USERNAME} \ + -Djib.to.auth.password=${IMAGE_REGISTRY_PASSWORD} \ + --settings=$MAVEN_SETTINGS \ No newline at end of file diff --git a/karavan-web/karavan-app/src/main/resources/snippets/camel-main-docker-application.properties b/karavan-web/karavan-app/src/main/resources/snippets/camel-main-docker-application.properties index acceb597..775e3033 100644 --- a/karavan-web/karavan-app/src/main/resources/snippets/camel-main-docker-application.properties +++ b/karavan-web/karavan-app/src/main/resources/snippets/camel-main-docker-application.properties @@ -10,3 +10,4 @@ camel.health.exposure-level=full camel.server.enabled=true camel.server.healthCheckEnabled=true camel.server.devConsoleEnabled=true +jkube.version=1.13.1 diff --git a/karavan-web/karavan-app/src/main/resources/snippets/quarkus-builder-script-kubernetes.sh b/karavan-web/karavan-app/src/main/resources/snippets/quarkus-builder-script-kubernetes.sh new file mode 100644 index 00000000..b62a8981 --- /dev/null +++ b/karavan-web/karavan-app/src/main/resources/snippets/quarkus-builder-script-kubernetes.sh @@ -0,0 +1,39 @@ +#!/usr/bin/env bash +CHECKOUT_DIR="/scripts" +KAMELETS_DIR="/scripts/kamelets" + +if [[ $GIT_REPOSITORY == https* ]] ; +then + replacer=https://$GIT_USERNAME:$GIT_PASSWORD@ + prefix=https:// + 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) + +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 TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token) +export NAMESPACE=$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace) + +mvn package \ + -Dquarkus.container-image.build=true \ + -Dquarkus.container-image.push=true \ + -Dquarkus.container-image.insecure=true \ + -Dquarkus.container-image.username=${IMAGE_REGISTRY_USERNAME} \ + -Dquarkus.container-image.password=${IMAGE_REGISTRY_PASSWORD} \ + -Dquarkus.container-image.registry=${IMAGE_REGISTRY} \ + -Dquarkus.container-image.builder=jib \ + -Dquarkus.kubernetes.deploy=true \ + -Dquarkus.kubernetes.deployment-target=kubernetes \ + -Dquarkus.kubernetes.add-version-to-label-selectors=false \ + -Dquarkus.kubernetes.labels.\"app\"=$(inputs.params.project) \ + -Dquarkus.kubernetes.labels.\"app.kubernetes.io/runtime\"=camel \ + -Dquarkus.container-image.group=${IMAGE_GROUP} \ + -Dquarkus.container-image.tag=${DATE} \ + --settings=$MAVEN_SETTINGS \ No newline at end of file diff --git a/karavan-web/karavan-app/src/main/resources/snippets/quarkus-builder-script-openshift.sh b/karavan-web/karavan-app/src/main/resources/snippets/quarkus-builder-script-openshift.sh new file mode 100644 index 00000000..17669aae --- /dev/null +++ b/karavan-web/karavan-app/src/main/resources/snippets/quarkus-builder-script-openshift.sh @@ -0,0 +1,41 @@ +#!/usr/bin/env bash +CHECKOUT_DIR="/scripts" +KAMELETS_DIR="/scripts/kamelets" + +if [[ $GIT_REPOSITORY == https* ]] ; +then + replacer=https://$GIT_USERNAME:$GIT_PASSWORD@ + prefix=https:// + 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) + +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 TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token) +export NAMESPACE=$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace) + +mvn package \ + -Dquarkus.container-image.build=true \ + -Dquarkus.container-image.push=true \ + -Dquarkus.container-image.insecure=true \ + -Dquarkus.container-image.username=sa \ + -Dquarkus.container-image.password=${TOKEN} \ + -Dquarkus.container-image.registry=${IMAGE_REGISTRY} \ + -Dquarkus.container-image.builder=jib \ + -Dquarkus.kubernetes-client.master-url=kubernetes.default.svc \ + -Dquarkus.kubernetes-client.token=${TOKEN} \ + -Dquarkus.kubernetes.deploy=true \ + -Dquarkus.openshift.deployment-kind=Deployment \ + -Dquarkus.openshift.add-version-to-label-selectors=false \ + -Dquarkus.openshift.labels.\"app\"=$(inputs.params.project) \ + -Dquarkus.openshift.labels.\"app.openshift.io/runtime\"=camel \ + -Dquarkus.container-image.group=${NAMESPACE} \ + -Dquarkus.container-image.tag=${DATE} \ + --settings=$MAVEN_SETTINGS \ No newline at end of file diff --git a/karavan-web/karavan-app/src/main/resources/snippets/spring-boot-builder-script-kubernetes.sh b/karavan-web/karavan-app/src/main/resources/snippets/spring-boot-builder-script-kubernetes.sh new file mode 100644 index 00000000..51f4ccc4 --- /dev/null +++ b/karavan-web/karavan-app/src/main/resources/snippets/spring-boot-builder-script-kubernetes.sh @@ -0,0 +1,31 @@ +#!/usr/bin/env bash +CHECKOUT_DIR="/scripts" +KAMELETS_DIR="/scripts/kamelets" + +if [[ $GIT_REPOSITORY == https* ]] ; +then + replacer=https://$GIT_USERNAME:$GIT_PASSWORD@ + prefix=https:// + 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) + +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 TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token) +export NAMESPACE=$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace) + +mvn package k8s:build k8s:push k8s:resource k8s:apply \ + -Pkubernetes \ + -Djkube.namespace=${NAMESPACE} \ + -Djkube.docker.push.registry=${IMAGE_REGISTRY} \ + -Djkube.docker.username=${IMAGE_REGISTRY_USERNAME} \ + -Djkube.docker.password=${IMAGE_REGISTRY_PASSWORD} \ + -Djkube.generator.name=${IMAGE_REGISTRY}/${IMAGE_GROUP}/$(inputs.params.project):${DATE} \ + --settings=$MAVEN_SETTINGS \ No newline at end of file diff --git a/karavan-web/karavan-app/src/main/resources/snippets/spring-boot-builder-script-openshift.sh b/karavan-web/karavan-app/src/main/resources/snippets/spring-boot-builder-script-openshift.sh new file mode 100644 index 00000000..236abc22 --- /dev/null +++ b/karavan-web/karavan-app/src/main/resources/snippets/spring-boot-builder-script-openshift.sh @@ -0,0 +1,29 @@ +#!/usr/bin/env bash +CHECKOUT_DIR="/scripts" +KAMELETS_DIR="/scripts/kamelets" + +if [[ $GIT_REPOSITORY == https* ]] ; +then + replacer=https://$GIT_USERNAME:$GIT_PASSWORD@ + prefix=https:// + 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) + +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 TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token) +export NAMESPACE=$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace) + +mvn package package oc:build oc:push oc:resource oc:apply \ + -Popenshift \ + -Djkube.namespace=${NAMESPACE} \ + -Djkube.docker.push.registry=${IMAGE_REGISTRY} \ + -Djkube.generator.name=${IMAGE_REGISTRY}/${NAMESPACE}/$(inputs.params.project):${DATE} \ + --settings=$MAVEN_SETTINGS \ No newline at end of file