SHiNE-server/SHiNE-promo-solana-devnet/build.gradle

104 lines
4.6 KiB
Groovy
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

plugins {
id 'java'
id 'org.springframework.boot' version '3.3.6'
id 'io.spring.dependency-management' version '1.1.7'
}
group = 'ru.shine'
version = '0.1.0'
java {
toolchain {
languageVersion = JavaLanguageVersion.of(21)
}
}
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
implementation 'org.springframework.boot:spring-boot-starter-validation'
implementation 'com.mmorrell:solanaj:1.20.4'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
tasks.named('test') {
useJUnitPlatform()
}
tasks.named('bootJar') {
archiveFileName = 'SHiNE-promo-solana-devnet.jar'
}
// ------------------------------------------------------------
// ДЕПЛОЙ ВРЕМЕННОГО СЕРВИСА "SHiNE-promo-solana-devnet"
//
// Назначение сервиса:
// - это отдельный продукт для тестовой раздачи SOL в devnet;
// - нужен для упрощённого онбординга тестовых пользователей;
// - работает как самостоятельное Spring Boot приложение.
//
// Почему отдельный деплой:
// - сервис изолирован от основного SHiNE-сервера;
// - его можно обновлять/перезапускать независимо;
// - жизненный цикл временного сервиса не должен ломать основной прод.
//
// ВАЖНО:
// - деплой по умолчанию выполняется ЧЕРЕЗ ДОМЕН (shineup.me), а не по IP;
// - целевая папка на сервере: /home/player/SHiNE/SHiNE-promo-solana-devnet;
// - целевой systemd-сервис: SHiNE-promo-solana-devnet.
// ------------------------------------------------------------
def deployHost = project.findProperty('deployHost') ?: 'root@shineup.me'
def deployPath = project.findProperty('deployPath') ?: '/home/player/SHiNE/SHiNE-promo-solana-devnet'
def remoteServiceName = project.findProperty('deployService') ?: 'SHiNE-promo-solana-devnet'
tasks.register('buildServerBundle', Copy) {
// Сборка минимального серверного бандла:
// 1) fat-jar приложения
// 2) шаблон application.properties (чтобы был эталон конфигурации)
dependsOn tasks.named('bootJar')
from(tasks.named('bootJar').flatMap { it.archiveFile }) {
rename { 'SHiNE-promo-solana-devnet.jar' }
}
from('config/application.example.properties') {
rename { 'application.properties' }
}
into(layout.buildDirectory.dir('server-bundle'))
}
tasks.register('deployToServerMkdir', Exec) {
// Шаг 1: гарантируем существование целевой директории на удалённом сервере.
dependsOn tasks.named('buildServerBundle')
commandLine 'bash', '-lc', "ssh ${deployHost} 'mkdir -p ${deployPath}'"
}
tasks.register('deployToServerJar', Exec) {
// Шаг 2: загружаем исполняемый jar.
dependsOn tasks.named('deployToServerMkdir')
commandLine 'bash', '-lc', "scp ${layout.buildDirectory.file('server-bundle/SHiNE-promo-solana-devnet.jar').get().asFile.absolutePath} ${deployHost}:${deployPath}/"
}
tasks.register('deployToServerConfig', Exec) {
// Шаг 3: загружаем конфиг-шаблон.
// На проде при необходимости его можно заменить на рабочий конфиг с секретами.
dependsOn tasks.named('deployToServerJar')
commandLine 'bash', '-lc', "scp ${layout.buildDirectory.file('server-bundle/application.properties').get().asFile.absolutePath} ${deployHost}:${deployPath}/"
}
tasks.register('deployToServerRestart', Exec) {
// Шаг 4: перезапускаем systemd-сервис и показываем статус.
// Если сервис не поднялся, ошибка будет видна сразу в этом шаге.
dependsOn tasks.named('deployToServerConfig')
commandLine 'bash', '-lc', "ssh ${deployHost} 'sudo systemctl restart ${remoteServiceName} && sudo systemctl --no-pager status ${remoteServiceName}'"
}
tasks.register('deployToServer') {
// Единая точка входа для деплоя временного сервиса.
// Запуск: ./gradlew deployToServer
dependsOn tasks.named('deployToServerRestart')
}