From 04276dec0e6f59b0a89fb02d8aae0fc8708deedc Mon Sep 17 00:00:00 2001 From: subochev Date: Tue, 15 Sep 2026 21:58:56 +0300 Subject: [PATCH] =?UTF-8?q?ci:=20maven-publish=20=D0=B2=D1=81=D0=B5=D1=85?= =?UTF-8?q?=20=D0=BC=D0=BE=D0=B4=D1=83=D0=BB=D0=B5=D0=B9=20+=20Gitea=20rel?= =?UTF-8?q?ease=20workflow?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - build.gradle.kts (root): настроен maven-publish для всех сабпроектов; репо 'caffeine' (Nexus) с setAllowInsecureProtocol=true, POM-метаданные (Apache-2.0, subochev as developer, scm). Version берётся из -Pversion= с fallback 0.1.0. - gradle.properties: дефолтная version=0.1.0 для локальных билдов. - .gitea/workflows/release.yml: триггер на release.published; две job'ы — publish-libraries (subochev/devops/publish action с BINOM_REPO_* env-vars) и build-standalone (собирает :standalone shadowJar, прикрепляет standalone--all.jar и sources.jar к release assets через softprops/action-gh-release + GITEA_TOKEN). - В пяти KMP-модулях (skills, storage-core, agent-toolsets, server, client) добавлен api(libs.kotlinx.serialization.core) — раньше commonMain компилировался только на JVM, и эта зависимость была пропущена; теперь commonMain корректно публикуется как Gradle Module Metadata. Локальная проверка: ./gradlew publishToMavenLocal — все 11 модулей × 9-10 таргетов ./gradlew jvmTest — все тесты зелёные ./gradlew :standalone:shadowJar — 240MB fatjar, Main-Class загружается --- .gitea/workflows/release.yml | 62 +++++++++++++++++++++++++++++ agent-toolsets/build.gradle.kts | 1 + build.gradle.kts | 69 ++++++++++++++++++++++++++++++++- client/build.gradle.kts | 1 + gradle.properties | 8 ++++ server/build.gradle.kts | 1 + skills/build.gradle.kts | 4 +- storage-core/build.gradle.kts | 1 + 8 files changed, 145 insertions(+), 2 deletions(-) create mode 100644 .gitea/workflows/release.yml create mode 100644 gradle.properties diff --git a/.gitea/workflows/release.yml b/.gitea/workflows/release.yml new file mode 100644 index 0000000..0153a1d --- /dev/null +++ b/.gitea/workflows/release.yml @@ -0,0 +1,62 @@ +# Триггерится при публикации релиза в Gitea. Делает две вещи: +# 1. publish-libraries — публикует все KMP-библиотеки (jvm + все нативные таргеты) +# в домашний Nexus-репозиторий "caffeine" через subochev/devops/publish action. +# Переменные BINOM_REPO_URL / BINOM_REPO_USER / BINOM_REPO_PASSWORD задаются +# в Gitea Action Variables для репозитория (Settings → Actions → Variables). +# 2. build-standalone — собирает :standalone fatjar (shadowJar) и прикрепляет +# standalone--all.jar к release как downloadable asset. +name: release + +on: + release: + types: [published] + +jobs: + publish-libraries: + name: Publish KMP libraries → caffeine Nexus + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + # agentik не использует Android-target ни в одном модуле (все KMP-таргеты + # JVM + native), поэтому Android SDK шаг из litert-kmp тут не нужен. + + - name: Publish libraries + uses: https://git.binom.pw/subochev/devops/publish@main + with: + version: ${{ gitea.ref_name }} + + build-standalone: + name: Build standalone fatjar + runs-on: ubuntu-latest + needs: publish-libraries + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Setup JDK 21 + uses: actions/setup-java@v4 + with: + java-version: '21' + distribution: 'adopt' + + - name: Build shadowJar + shell: bash + run: ./gradlew :standalone:shadowJar -Dorg.gradle.jvmargs=-Xmx4096M --no-daemon --no-watch-fs --stacktrace + + - name: Compute version for filename + id: ver + shell: bash + run: echo "version=${GITEA_REF_NAME}" >> "$GITEA_OUTPUT" + + - name: Attach standalone jar to release + uses: https://github.com/softprops/action-gh-release@v2 + with: + files: | + standalone/build/libs/standalone-*-all.jar + standalone/build/libs/standalone-*-sources.jar + fail_on_unmatched_files: false + generate_release_notes: false + env: + GITHUB_TOKEN: ${{ secrets.GITEA_TOKEN }} diff --git a/agent-toolsets/build.gradle.kts b/agent-toolsets/build.gradle.kts index 80c92a0..12f1ef5 100644 --- a/agent-toolsets/build.gradle.kts +++ b/agent-toolsets/build.gradle.kts @@ -28,6 +28,7 @@ kotlin { api(libs.litert.api) api(libs.kotlinx.coroutines.core) + api(libs.kotlinx.serialization.core) api(libs.kotlinx.serialization.json) } jvmMain.dependencies { diff --git a/build.gradle.kts b/build.gradle.kts index d508bc0..62a1bab 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -2,7 +2,74 @@ plugins { alias(libs.plugins.kotlin.multiplatform) apply false alias(libs.plugins.kotlin.jvm) apply false alias(libs.plugins.kotlin.serialization) apply false + // maven-publish — стандартный плагин Gradle, объявлен apply'ем в subprojects ниже. } group = "pw.binom.agentik" -version = "0.1.0" + +// Publication version: -Pversion= (CICD publishes by release tag). +// Без явного -Pversion берётся fallback из gradle.properties или "0.1.0". +if (version == "unspecified") { + version = providers.gradleProperty("version").getOrElse("0.1.0") +} + +// Home Nexus URL/creds — Gitea action-variables BINOM_REPO_* (subochev/devops/publish). +// Локально для дебага: ./gradlew publish \ +// -Pbinom.repo.url=http://... -Pbinom.repo.user=... -Pbinom.repo.password=... +val binomRepoUrl = (findProperty("binom.repo.url") ?: "http://nexus.xx/repository/caffeine/").toString() +val binomRepoUser = (findProperty("binom.repo.user") as String? ?: "").toString() +val binomRepoPassword = (findProperty("binom.repo.password") as String? ?: "").toString() + +subprojects { + group = rootProject.group + version = rootProject.version + + apply(plugin = "maven-publish") + + extensions.configure("publishing") { + repositories { + maven { + name = "caffeine" + url = uri(binomRepoUrl) + isAllowInsecureProtocol = true + credentials { + username = binomRepoUser + password = binomRepoPassword + } + } + } + + // Per-subproject POM-метаданные (name, scm, licenses, developers). + publications.withType().configureEach { + pom { + name = project.name + description = providers.provider { + project.findProperty("description")?.toString() + ?: "agentik: ${project.name} (pw.binom.agentik)" + } + url = "https://git.binom.pw/subochev/agentik" + + licenses { + license { + name = "Apache-2.0" + url = "https://www.apache.org/licenses/LICENSE-2.0" + } + } + + developers { + developer { + id = "subochev" + name = "Subochev Alexey" + url = "https://git.binom.pw/subochev" + } + } + + scm { + connection = "scm:git:https://git.binom.pw/subochev/agentik.git" + developerConnection = "scm:git:ssh://git@git.binom.pw/subochev/agentik.git" + url = "https://git.binom.pw/subochev/agentik" + } + } + } + } +} diff --git a/client/build.gradle.kts b/client/build.gradle.kts index f689274..a2c3d5c 100644 --- a/client/build.gradle.kts +++ b/client/build.gradle.kts @@ -20,5 +20,6 @@ dependencies { implementation(libs.ktor.serialization.kotlinx.json) implementation(libs.kotlinx.coroutines.core) + implementation(libs.kotlinx.serialization.core) implementation(libs.kotlinx.serialization.json) } diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 0000000..a53c113 --- /dev/null +++ b/gradle.properties @@ -0,0 +1,8 @@ +# Default version for local builds; overridden by `-Pversion=` from CI/CD. +version=0.1.0 + +# KMP jvm target uses JDK 21 for both compilation and toolchain. +org.gradle.jvmargs=-Xmx4096M -XX:+UseG1GC + +# Android SDK путь для будущей Android-сборки (пока не используется). +# sdk.dir=/home/subochev/Android/Sdk diff --git a/server/build.gradle.kts b/server/build.gradle.kts index c3365d9..ca2eaad 100644 --- a/server/build.gradle.kts +++ b/server/build.gradle.kts @@ -31,6 +31,7 @@ kotlin { // Commons implementation(libs.kotlinx.coroutines.core) + implementation(libs.kotlinx.serialization.core) implementation(libs.kotlinx.serialization.json) } commonTest.dependencies { diff --git a/skills/build.gradle.kts b/skills/build.gradle.kts index 494ce26..2ada8f3 100644 --- a/skills/build.gradle.kts +++ b/skills/build.gradle.kts @@ -19,7 +19,9 @@ kotlin { sourceSets { commonMain.dependencies { - // YAML-парсинг с интеграцией в @Serializable. + api(libs.kotlinx.coroutines.core) + api(libs.kotlinx.serialization.core) + api(libs.kotlinx.serialization.json) implementation(libs.kaml) } commonTest.dependencies { diff --git a/storage-core/build.gradle.kts b/storage-core/build.gradle.kts index 0168351..b788f82 100644 --- a/storage-core/build.gradle.kts +++ b/storage-core/build.gradle.kts @@ -22,6 +22,7 @@ kotlin { sourceSets { commonMain.dependencies { api(libs.kotlinx.coroutines.core) + api(libs.kotlinx.serialization.core) api(libs.kotlinx.serialization.json) } commonTest.dependencies {