Skip to content

PluginBuild

ppodsednik edited this page Jan 8, 2026 · 4 revisions

PluginBuild

Tato stránka popisuje jak se v projektu Kramerius vytváří procesy, z nich pluginy a z pluginů konkrétní Worker Docker image v rámci process-platform.

Navazuje na stránky:

  • Home – základní přehled platformy
  • Architecture – runtime architektura (Manager, Worker, procesy)

Tato stránka se soustředí výhradně na build-time pohled.


Základní pojmy (stručně)

Pojem Význam
Process Čistá Java logika (např. Import, Index, Migration)
Plugin Definice, jak se proces spouští v platformě
Worker Runtime aplikace, která vykonává pluginy
Worker image Docker image s konkrétní sadou pluginů

Klíčová myšlenka:

Proces je logika. Plugin je kontrakt. Worker je runtime.


1. Procesy (processes/*)

Procesy vznikají jako běžné Gradle moduly uvnitř multimodulového projektu Kramerius.

Struktura

processes/
 ├─ import/
 ├─ index/
 └─ migration/

Každý proces:

  • je samostatný Gradle modul
  • má vlastní build.gradle
  • může záviset na sdílených modulech (např. :shared:common)
  • musí mít závislost na process-api
dependencies {
    implementation project(':shared:common')
    implementation "org.ceskaexpedice:process-api:${processapiversion}"
}

Proces:

  • může mít main metodu
  • není ještě pluginem
  • neřeší profily, plánování ani integraci s Workerem

Výstupem buildu je obyčejný JAR v build/libs.


2. Pluginy (processes/platform/*/*Plugin)

Plugin je platformní obal procesu, který definuje:

  • vstupní metodu
  • mapování parametrů
  • metadata
  • profily
  • vazbu na Worker runtime

Struktura

processes/platform/
 ├─ curator/
 │   ├─ importPlugin/
 │   ├─ indexPlugin/
 │   └─ worker/
 └─ cdk/
     ├─ migrationPlugin/
     └─ worker/

Každý *Plugin je opět samostatný Gradle modul.


3. Obsah pluginu

Plugin obsahuje tři zásadní části:

3.1 ProcessMethod (vstupní bod)

@ProcessMethod
public static void importMain(...)
  • označuje spustitelný proces
  • definuje parametry pomocí anotací
  • je jediným vstupním bodem, který Worker zná

Procesní logika je delegována do původního procesu:

Import.importMain(...)

3.2 SPI implementace

public class ImportSPI extends AbstractPluginSpi {
    @Override
    public String getMainClass() {
        return ImportPlatformStarter.class.getName();
    }
}

SPI:

  • umožňuje Workeru plugin objevit
  • definuje hlavní třídu
  • určuje podporované profily

3.3 Gradle plugin processplatform.process

plugins {
    id 'org.ceskaexpedice.processplatform.process'
}

Tento Gradle plugin:

  • zpracuje anotace
  • vygeneruje metadata
  • zaregistruje SPI
  • vytvoří process-platform plugin JAR

Konfigurace:

processPlugin {
    spiImplementation = 'org.kramerius.plugin.ImportSPI'
    profiles = [
        [profileId: 'import', description: 'Import FOXML', jvmArgs: ['-Xmx32g']]
    ]
}

➡️ Tady oficiálně vzniká plugin.


4. Worker jako buildový modul

worker modul neobsahuje žádný Java kód.

Jeho účel:

  • vybrat konkrétní pluginy
  • sestavit Worker runtime
  • vytvořit Docker image

Příklad: curator/worker

plugins {
    id 'org.ceskaexpedice.processplatform.worker'
    id 'com.google.cloud.tools.jib'
}

5. Výběr pluginů pro Worker

Závislosti

dependencies {
    implementation project(':processes:platform:curator:import-foxml')
}

Zajišťují, že pluginy jsou k dispozici pro build.

Skutečný výběr pluginů

processWorker {
    workerName = 'curatorworker'
    plugins = [
        project(':processes:platform:curator:import-foxml'),
        project(':processes:platform:curator:index')
    ]
}

➡️ Zde se explicitně říká, které pluginy patří do Workeru.


6. Výsledek buildu Workeru

Gradle plugin processplatform.worker vytvoří runtime layout:

build/worker/
 ├─ webapps/
 │   └─ process-worker.war
 └─ lib/
     └─ plugins/
         ├─ import-plugin.jar
         ├─ index-plugin.jar

Toto je hotový Worker, ještě bez Dockeru.


7. Docker image pomocí Jib

Jib:

  • vezme runtime layout
  • vloží ho do Tomcat image
jib {
    from { image = 'tomcat:9-jdk21' }
    to { image = 'ceskaexpedice/curator-worker:${version}' }
}

Výsledkem je deterministický Worker image s pevnou sadou pluginů.


8. Celkový build řetězec

graph TD
    A[Process<br/>Import] --> B[Plugin<br/>importPlugin]
    B --> C[Worker build<br/>curator/worker]
    C --> D[Docker image<br/>curator-worker]
Loading

Shrnutí

  • Proces je čistá Java logika
  • Plugin definuje proces pro platformu
  • Worker vybírá pluginy při buildu
  • Docker image je pouze runtime obálka

Tento přístup umožňuje:

  • pevně definované workery
  • jednoduchý a reprodukovatelný build
  • jasné oddělení odpovědností

Clone this wiki locally