Ana içeriğe geç

Spring Plugin#

Plugin sayesinde Gradle ile Spring teknolojilerinin kullanılmasını sağlamaktadır.

Yetenekleri#

  • Docker oluşturma işlemini sağlar.
  • Spring Boot'un tools jarmode özelliği (-Djarmode=tools) ile katmanlı (layered) Docker imagelarının oluşturulmasını destekler.
  • Oluşturulan docker'ın belirlenmiş docker repository'e kolayca yüklenmesini sağlar.
  • Belirlenmiş profiller yardımı ile oluşturulacak jar veya docker'ın parçalara bölünmesini sağlar. Böylece farklı kullanımlar için "thin" ve "fat" jar'lar oluşturulabilir.
  • Spring projesi içerisinde gradle.properties ve konfigürasyon verilerini kullanmamızı sağlar.
  • IntelliJ IDEA run konfigürasyonlarına (.run/*.xml) otomatik olarak SkyWalking agent entegrasyonu yapabilir.

Kullanım#

Projelere iki farklı yöntem ile eklenebilmektedir. Yöntemler şunlardır:

DSL kullanımı

build.gradle
plugins {
    id 'hvl-spring-plugin' version hvlSpringPluginVersion
}

Buildscript kullanımı

build.gradle
buildscript {
    repositories {
        maven {
            url 'http://nexus.bulut.ai/repository/framework-plugin-group/'
        }
    }
    dependencies {
        classpath(group: 'tr.com.havelsan.plugin', name: 'hvl-gradle-spring-plugin')
    }
}

apply plugin: 'hvl-spring-plugin'

Pluginin birçok konfigürasyon parametresi bulunmaktadır. Proje içerisinde kullanımı ve parametreler aşağıdaki gibidir.

Konfigurasyon yapısı#

build.gradle
hvlSpring {
    String bpmnServerName = 'hvl-bpmn-server'
    Project adminServerProject = project(gradle.adminStarterProjectName)
    String adminServerName = 'hvl-bpmn-admin-server'
    Project engineServerProject = project(gradle.engineStarterProjectName)
    String engineServerName = 'hvl-bpmn-engine-server'
    profile {
        enabled = true
        info = [
                'admin' : [
                        archiveName: adminServerName,
                        name       : adminServerName,
                        version    : moduleVersion,
                        buildArgs  : ['RESOURCE_JAR_FILE': adminServerName, 'CONTAINER_JAR_FILE': adminServerName],
                        project    : [adminServerProject]],
                'engine': [
                        archiveName: engineServerName,
                        name       : engineServerName,
                        version    : moduleVersion,
                        buildArgs  : ['RESOURCE_JAR_FILE': engineServerName, 'CONTAINER_JAR_FILE': engineServerName],
                        project    : [engineServerProject]],
                'all'   : [
                        archiveName: bpmnServerName,
                        name       : bpmnServerName,
                        version    : moduleVersion,
                        buildArgs  : ['RESOURCE_JAR_FILE': bpmnServerName, 'CONTAINER_JAR_FILE': bpmnServerName],
                        project    : [adminServerProject, engineServerProject]]
        ]
    }
    docker {
        settingsXmlFilePath = gradle.environment.docker.settingsXmlFilePath
        dockerfile = file(gradle.environment.docker.dockerFilePath)
        publishing {
            info = gradle.environment.project.dockerPublishingInfo
            scope = gradle.environment.project.dockerPublishingScope
        }
    }
    skywalking {
        agentVersion = '9.6.0'
        agentPath = System.getProperty("user.home") + '.hvl-gradle-spring-plugin/tools/skywalking-agent-${agentVersion}/skywalking-agent/skywalking-agent.jar'
        log4j2Async = true
    }
}

Genelde projelerde yukarıdaki şekilde kullanılmaktadır ancak bunun dışında bir çok konfigürasyon mevcuttur.

hvlSpring konfigürasyon tablosu:

Konfigürasyon Tip Açıklama Varsayılan Değer
archiveName String Oluşturulacak dosyanın isim bilgisidir. Mevcut proje ismidir. (project.getName())
outputJarPath String Oluşturulacak jar'ın path bilgisidir. {user.home}/.hvl-gradle-spring-plugin/{project.name}
profile HvlProfileExtension Profile konfigürasyonudur.
docker HvlDockerExtension Docker konfigürasyonudur.
skywalking HvlSkywalkingExtension SkyWalking konfigürasyonudur.

profile konfigürasyon tablosu:

Konfigürasyon Açıklama Varsayılan Değer
enabled Boolean Profillemenin devrede olup olmadığı bilgisidir. false
info Map> Her bir profilin özelliklerinin verildiği alandır.
profile String Jar oluşturulurken kullanılacak profil bilgisidir. Bu değer komut satırından -Dspring.profiles.active şeklinde de verilebilmektedir. all

Oluşturulacak jar'ın versionSuffix değerini ezmek için -DversionSuffix parametresi kullanılabilir.

Oluşturulacak jar'ın profile değerini ezmek için -Dspring.profiles.active parametresi kullanılabilir.

docker konfigürasyon tablosu:

Konfigürasyon Tip Açıklama Varsayılan Değer
settingsXmlFilePath String Docker pushlamak için giriş bilgilerinin bulunduğu dosya path'idir. System.getProperty("user.home") + '/.docker/settings.xml
autoLogout boolean İşlem tamamlandıktan sonra docker repository'den otomatik logout yapılıp yapılmayacağı bilgisidir. false
name String Oluşacak docker'ın isim bilgisidir. Profile içindeki infoda bu bilgi varsa öncelikli olarak profil içindeki kullanılır.
dockerfile File File türünden dockerFile bilgisidir. project.file("Dockerfile")
dependencies Set Docker oluşturma işlemi öncesi çalışması istenen task bilgileridir.
tags Set Oluşturulacak docker'a verilecek tag bilgileridir.
namedTags Map Oluşturulacak docker'a verilecek tag bilgileridir. (taskName, tagName)
labels Map Docker oluştururken cli'daki --label argümanına denk gelen bilgidir.
buildArgs Map Docker oluştururken cli'daki --build-arg argümanına denk gelen bilgidir. Profile içindeki infoda bu bilgi varsa öncelikli olarak profil içindeki kullanılır.
pull boolean Docker oluştururken cli'daki --pull argümanına denk gelen bilgidir. false
noCache boolean Docker oluştururken cli'daki --no-cache argümanına denk gelen bilgidir. false
network String Docker oluştururken cli'daki --network argümanına denk gelen bilgidir.
additionalCopyPaths String[] Docker üretilirken içerisine kopyalanmak istenen dosyaların path bilgisidir.
copySpec CopySpec Dosya işlemleri için kullanılan copyspec nesnesidir. project.copySpec()

skywalking konfigürasyon tablosu:

Konfigürasyon Tip Açıklama Opsiyonel Varsayılan Değer
agentVersion String İndirilecek SkyWalking agent versiyonudur. agentPath verilmediğinde kullanılır. Evet 9.6.0
agentPath String SkyWalking agent jar dosyasının tam yol bilgisidir. Verilmezse agent otomatik indirilir. Evet $USER_HOME$/.hvl-gradle-spring-plugin/tools/skywalking-agent-${agentVersion}/skywalking-agent/skywalking-agent.jar'
log4j2Async Boolean Log4j2 asenkron loglama mekanizması için contextSelector argümanıdır. Evet true

agentPath belirtilmediği durumlarda, skywalkingEnable taski çalıştırıldığında SkyWalking agent belirtilen versiyona göre Apache mirror üzerinden otomatik olarak indirilir ve ~/.hvl-gradle-spring-plugin/tools/ dizinine çıkartılır. Agent daha önce indirilmişse tekrar indirilmez.

skywalkingEnable taski çalıştırıldığında, VM parametrelerine otomatik olarak -DSW_AGENT_NAME={project.name} eklenir. Bu sayede SkyWalking arayüzünde servisler proje isimleri ile görünür.


Plugin proje içinde ide üzerinden veya konsol ile kullanılabilir.

Konsol kullanımı

Local docker içerisine image oluşturmayı sağlamaktadır. Bu işlem öncesinde runToolsJar taskı otomatik olarak çalıştırılır ve Spring Boot -Djarmode=tools özelliği kullanılarak jar katmanları Docker build için dışarı çıkarılır.

Parametreler:

  • spring.profiles.active
  • profiles.active

Kullanım şekli:

gradle cleanAll docker -Dspring.profiles.active=tasks

Remote docker repository'e image oluşturup göndermeyi sağlamaktadır.

Parametreler:

  • spring.profiles.active
  • profiles.active
  • dockerPublishingName
  • dockerPublishingUrl

Kullanım şekli:

gradle cleanAll dockerPush -Dprofiles.active=general

gradle cleanAll dockerPush -DdockerPublishingName=harbor-master-key -DdockerPublishingUrl=harbor.bulut.ai/myrepo

IntelliJ IDE üzerindeki .run/*.xml konfigürasyon dosyalarına SkyWalking agent VM argümanlarını otomatik olarak ekler.

  • agentPath belirtilmemişse, SkyWalking agent jar'ını Apache mirror üzerinden otomatik indirip ~/.hvl-gradle-spring-plugin/tools/ dizinine çıkartır.
  • VM parametrelerine -javaagent, -DSW_AGENT_NAME={project.name} ve (eğer aktifse) -Dlog4j2.contextSelector argümanlarını ekler.

Kullanım şekli:

gradle skywalkingEnable

IntelliJ IDE üzerindeki .run/*.xml konfigürasyon dosyalarından SkyWalking agent ile ilgili tüm VM argümanlarını (-javaagent, -DSW_AGENT_NAME, -Dlog4j2.contextSelector) temizler.

Kullanım şekli:

gradle skywalkingDisable

SkyWalking agent kurulumu ve kullanımı için gerekli VM opsiyon bilgilerini görüntüler.

Kullanım şekli:

gradle skywalkingInfo

Ide üzerinden kullanımı

Proje içerisinde örnek kullanım şekli:

settings.gradle kullanımı
gradle.ext {
    // Environment
    environment = [
            java    : [
                    info               : '21.0.1 (21.0.1-oracle)',
                    sourceCompatibility: 21,
                    targetCompatibility: 21
            ],
            gradle  : [
                    info: '8.10'
            ],
            encoding: [
                    type: 'UTF-8'
            ],
            maven   : [
                    settingsXmlFilePath: System.getProperty("user.home") + '/.m2/settings.xml'
            ],
            docker  : [
                    dockerFilePath     : rootDir.toString() + '/resources/docker/Dockerfile',
                    settingsXmlFilePath: System.getProperty("user.home") + '/.docker/settings.xml'
            ],
            project : [
                    publishingInfo              : [
                            release_bitnexus : [versionSuffix: '',
                                                name         : 'framework-nexus-supervisor',
                                                url: 'http://nexus.bulut.ai/repository/framework-releases/'],
                            snapshot_bitnexus: [versionSuffix: '-SNAPSHOT',
                                                name         : 'framework-nexus-snapshots',
                                                url: 'http://nexus.bulut.ai/repository/framework-snapshots/'],
                    ],
                    repositoriesInfo            : [
                            online  : [[url: ['https://repo.spring.io/release/'
                                              , 'https://repo.spring.io/snapshot/'
                                              , 'https://repo.spring.io/libs-release/'
                                              , 'https://repo.spring.io/libs-milestone-local/'
                                              , 'https://repo.spring.io/libs-release-local/'
                                              , 'https://repo.maven.apache.org/maven2/'
                                              , 'https://repo.spring.io/milestone/'
                                              , 'https://repo.gradle.org/gradle/libs-releases-local/'
                                              , 'https://jcenter.bintray.com/'
                                              , 'https://mvnrepository.com/artifact/'
                                              , 'https://plugins.gradle.org/m2/']]],
                            bitnexus: [[name: 'framework-nexus-dev',
                                        url: ['http://nexus.bulut.ai/repository/framework-group/']]],
                    ],
                    buildscriptRepositoriesInfo : [
                            online  : ['https://plugins.gradle.org/m2/'],
                            bitnexus: ['http://nexus.bulut.ai/repository/framework-plugin-group/']
                    ],
                    dockerPublishingInfo        : [
                            offline: [url: 'docker.local'],
                            harbor : [name: 'framework-harbor-master',
                                      url: 'harbor.bulut.ai/framework']
                    ],
                    publishingScope: 'snapshot_bitnexus',
                    repositoriesScope           : 'bitnexus',
                    buildscriptRepositoriesScope: 'bitnexus',
                    dockerPublishingScope       : 'harbor'
            ],
    ]
}
build.gradle kullanımı
hvlSpring {
    String bpmnServerName = 'hvl-bpmn-server'
    Project adminServerProject = project(gradle.adminStarterProjectName)
    String adminServerName = 'hvl-bpmn-admin-server'
    Project engineServerProject = project(gradle.engineStarterProjectName)
    String engineServerName = 'hvl-bpmn-engine-server'
    profile {
        enabled = true
        info = [
                'admin' : [
                        archiveName: adminServerName,
                        name       : adminServerName,
                        version    : moduleVersion,
                        buildArgs  : ['RESOURCE_JAR_FILE': adminServerName, 'CONTAINER_JAR_FILE': adminServerName],
                        project    : [adminServerProject]],
                'engine': [
                        archiveName: engineServerName,
                        name       : engineServerName,
                        version    : moduleVersion,
                        buildArgs  : ['RESOURCE_JAR_FILE': engineServerName, 'CONTAINER_JAR_FILE': engineServerName],
                        project    : [engineServerProject]],
                'all'   : [
                        archiveName: bpmnServerName,
                        name       : bpmnServerName,
                        version    : moduleVersion,
                        buildArgs  : ['RESOURCE_JAR_FILE': bpmnServerName, 'CONTAINER_JAR_FILE': bpmnServerName],
                        project    : [adminServerProject, engineServerProject]]
        ]
    }
    docker {
        settingsXmlFilePath = gradle.environment.docker.settingsXmlFilePath
        dockerfile = file(gradle.environment.docker.dockerFilePath)
        publishing {
            info = gradle.environment.project.dockerPublishingInfo
            scope = gradle.environment.project.dockerPublishingScope
        }
    }
    skywalking {
        agentPath = System.getProperty("user.home") + '/.hvl-gradle-spring-plugin/tools/skywalking-agent-${agentVersion}/skywalking-agent.jar'
        agentVersion = '9.6.0'
        log4j2Async = true
    }
}
Dockerfile kullanımı

Bu örnek Dockerfile, hvl-gradle-spring-plugin ile uyumlu çalışmakta olup, herhangi bir değişiklik yapmadan direkt kullanabileceğiniz bir örnektir.

FROM harbor.bulut.ai/framework/hvlamazoncorretto:25-alpine3.22

ARG CONTAINER_JAR_FILE
ARG EKSEN_DIR="/eksen/"

COPY $EKSEN_DIR $EKSEN_DIR

ENV JAR_FILE="$EKSEN_DIR$CONTAINER_JAR_FILE.jar"
ENV JAVA_OPTS=""

ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS -jar $JAR_FILE"]