Ana içeriğe geç

Liquibase Plugin#

Proje içerisinde liquibase yeteneklerinin kullanılmasını sağlamaktadır.

diffChangelog, generateChangelog, updateSql, changelogSyncSql taskları geliştirilerek hvl-liquibase task grubu altına taşınmıştır. Ancak liquibase task grubu altındaki diğer taskların kullanımında konfigürasyonları yapıldığı takdirde herhangi bir kısıtlama bulunmamaktadır.

Kullanım#

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

DSL kullanımı

build.gradle
plugins {
    id 'hvl-liquibase-plugin' version hvlLiquibasePluginVersion
}

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-liquibase-plugin')
    }
}

apply plugin: 'hvl-liquibase-plugin'

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

Konfigurasyon Yapısı#

build.gradle
hvlLiquibase {
    gitEnabled = true
    url = "ssh://git@10.150.0.134:7999/javalt/hvl-infra.git"
    branch = "master"
    username = ""
    password = ""
    databaseliquibaseYamlFile = "configuration/framework/spring/application-database-liquibase.yml"
    databaseDatasourceYamlFile = "configuration/framework/spring/application-database-datasource.yml"

    changelogFile = "src/main/resources/db/changelog/${moduleVersion}/generated-changelog.xml"

    logLevel = '${hvl.liquibase.logLevel}'

    arguments = [schemas: 'oauth']

    diffChangelog {
//        https://docs.liquibase.com/commands/inspection/diff-changelog.html
        url = '${hvl.liquibase.url}'
        username = '${hvl.liquibase.username}'
        password = '${hvl.liquibase.password}'
        referenceUrl = '${hvl.liquibase.referenceUrl}'
        referenceUsername = '${hvl.liquibase.referenceUsername}'
        referencePassword = '${hvl.liquibase.referencePassword}'
    }

    generateChangelog {
//        https://docs.liquibase.com/commands/inspection/generate-changelog.html
        url = '${hvl.liquibase.referenceUrl}'
        username = '${hvl.liquibase.referenceUsername}'
        password = '${hvl.liquibase.referencePassword}'

        diffTypes = 'data'
    }

    updateSql {
      url = '${hvl.liquibase.url}'
      username = '${hvl.liquibase.username}'
      password = '${hvl.liquibase.password}'

      //from root dir example
      changelogRootYamlPath = project.rootDir.getPath() + '/resources/liquibase/notification/changelog-root.yaml'
      //from module dir example
      changelogRootYamlPath = 'src/main/resources/db/changelog-root.yaml'

      outputFilePath = 'output.sql'
      arguments = [defaultSchemaName: 'notification', 'contexts': 'dev']
    }

    changelogSyncSql {
      url = '${hvl.liquibase.url}'
      username = '${hvl.liquibase.username}'
      password = '${hvl.liquibase.password}'
      changelogRootYamlPath = 'src/main/resources/db/changelog-root.yaml'
      outputFilePath = 'changelog-sync.sql'
      arguments = [defaultSchemaName: 'oauth', 'contexts': 'dev']
    }
}

Liquibase pluginin yaml dosyası parse etme özelliği bulunmaktadır ve parse edilecek yaml dosyası databaseliquibaseYamlFile parametresi olarak verilmelidir. Bu yaml file içerisinden ${hvl.liquibase.url} gibi ifadeler ayrıştırılarak değerlerin okunması sağlanmakdır. Böylece tek bir dosya üzerinden ortak kullanılacak alanların alınabilmesine imkan sağlar.

  • gitEnabled: Yaml dosyasının bir git projesi üzerinden alınması istendiği durumlarda true yapılması gerekmektedir.
  • url: Git üzerinden çekilecek repository'nin url bilgisidir.
  • branch: Git üzerinden çekilecek repository'nin branch bilgisidir.
  • username: Git üzerinden çekilecek repository'nin güvenlik için kullanılması gereken kullanıcı adı bilgisidir.
  • password: Git üzerinden çekilecek repository'nin güvenlik için kullanılması gereken şifre bilgisidir.
  • databaseliquibaseYamlFile: Ayrıştırılacak liquibase yaml dosyasının dosya yolu bilgisidir. Eğer gitEnabled true ise proje içindeki dosya yolu yazılmalıdır. gitEnabled false olduğu durumlarda fiziksel dosya yolunun tamamı yazılmalıdır. Örnek: /home/acuhadaroglu/dev/projects/framework/hvl-infra/configuration/framework/spring/application-database-liquibase.yml
  • databaseDatasourceYamlFile: Ayrıştırılacak datasource yaml dosyasının dosya yolu bilgisidir. databaseliquibaseYamlFile dosyasında ${spring.datasource.username} gibi ifadeler varsa ve bu değerlerin bulunduğu yaml dosyası path'i yazılmalıdır. Örnekte bu değer application-database-datasource.yml içerisinde olduğu için bu dosyanın path'i verilmiştir. Eğer gitEnabled true ise proje içindeki dosya yolu yazılmalıdır. gitEnabled false olduğu durumlarda fiziksel dosya yolunun tamamı yazılmalıdır. Örnek: /home/acuhadaroglu/dev/projects/framework/hvl-infra/configuration/framework/spring/application-database-datasource.yml
  • changelogFile: Liquibase tarafından oluşturulan script dosyasının hangi dosya yoluna oluşturulacağı bilgisidir. json, sql, yaml, xml gibi dosya uzantılarına destek vermektedir.
  • logLevel: Liquibase çalışırken console'a basılacak log seviyesi bilgisidir.
  • arguments: Ön tanımlı ayarlar dışında Liquibase içerisine verilmek istenen ekstra parametrelerin verilebileceği alan bilgisidir. Değerler map şeklinde verilmelidir.

diffChangelog

2 veritabanı arasında DDL olarak fark çıkaran task'dır. diffChangeLog plugin'i çalışma mantığı olarak çıktı alınan dosyayı ezeceği için bu dosyaya elle müdahale edildiyse dikkatli olunmalıdır.

  • url: Fark çıkarılacak veritabanı bilgisidir. Buraya önceki versiyonun kurulu olduğu bir veritabanı bilgisi verilmelidir.
  • username: Fark çıkarılacak veritabanı kullanıcı adı bilgisidir.
  • password: Fark çıkarılacak veritabanı şifre bilgisidir.
  • referenceUrl: Fark çıkarılacak referans veritabanı bilgidisir. Buraya güncel veritabanının bilgisi verilmelidir.
  • referenceUsername: Fark çıkarılacak referans veritabanı kullanıcı adı bilgisidir.
  • referencePassword: Fark çıkarılacak referans veritabanı şifre bilgisidir.

generateChangelog

Verilen url bilgisine göre mevcut veritabanı scriptlerini oluşturan task'dır. Bu task fark almaz, sadece mevcut veritabının çıktısını verir. generateChangelog plugin'i çalışma mantığı olarak çıktı alınan dosyayı ezeceği için bu dosyaya elle müdahale edildiyse dikkatli olunmalıdır.

  • url: Çıktısı alınacak veritabanı bilgisidir.
  • username: Çıktısı alınacak veritabanı kullanıcı adı bilgisidir.
  • password: Çıktısı alınacak veritabanı şifre bilgisidir.
  • diffTypes: Çıktısı alınacak veritabanında hangi türlerin çıktısının alınacağı bilgisidir. Varsayılan olarak sadece data çıktısı alabilecek şekilde ayarlama yapılmıştır. Alabileceği değerler: catalogs, tables, functions, views, columns, indexes, foreignkeys, primarykeys, uniqueconstraints, data, storedprocedures, triggers, sequences, databasepackage, databasepackagebody

updateSql

Verilen url bilgisindeki veritabanına göre changelogRootYamlPath bilgisindeki liquibase dosyasını okuyarak çalışması gereken fark scriptlerini çıkartır. Kısacası liquibase dosyasında olup veritabanında çalışmayan changeset'leri tespit eder ve outputFilePath değerindeki path'e çıktısını yazar.

  • url: Kullanılacak veritabanı bilgisidir.
  • username: Kullanılacak veritabanı kullanıcı adı bilgisidir.
  • password: Kullanılacak veritabanı şifre bilgisidir.
  • changelogRootYamlPath: Liquibase root dosyanın bilgisidir.
  • outputFilePath: Çıktının yazılacağı dosya bilgisidir.
  • arguments: Ön tanımlı ayarlar dışında Liquibase içerisine verilmek istenen ekstra parametrelerin verilebileceği alan bilgisidir. Değerler map şeklinde verilmelidir.
  • changeLogParameters: Liquibase dosyalarında kullanılan ${schema_name} gibi değerler varsa, çıktı üretilirken bu değerlerin doldurulması için kullanılır. Değerler map şeklinde verilmelidir. Eğer boş bırakılırsa application-database-liquibase.yml içerisindeki spring.liquibase.parameters değerleri kullanılır.

changelogSyncSql

Verilen url bilgisindeki veritabanına göre changelogRootYamlPath bilgisindeki liquibase dosyasını okuyarak databasechangelog tablosunun sync edecek sql'leri çıkartır. Kısacası liquibase dosyasında olup veritabanında çalışmayan changeset'leri tespit eder ve outputFilePath değerindeki path'e databasechangelog tablosu özelinde sql çıktısını yazar.

  • url: Kullanılacak veritabanı bilgisidir.
  • username: Kullanılacak veritabanı kullanıcı adı bilgisidir.
  • password: Kullanılacak veritabanı şifre bilgisidir.
  • changelogRootYamlPath: Liquibase root dosyanın bilgisidir.
  • outputFilePath: Çıktının yazılacağı dosya bilgisidir.
  • arguments: Ön tanımlı ayarlar dışında Liquibase içerisine verilmek istenen ekstra parametrelerin verilebileceği alan bilgisidir. Değerler map şeklinde verilmelidir.
  • changeLogParameters: Liquibase dosyalarında kullanılan ${schema_name} gibi değerler varsa, çıktı üretilirken bu değerlerin doldurulması için kullanılır. Değerler map şeklinde verilmelidir. Eğer boş bırakılırsa application-database-liquibase.yml içerisindeki spring.liquibase.parameters değerleri kullanılır.

Örnek application-database-datasource.yaml

hvl:
  liquibase:
    url: jdbc:postgresql://10.151.233.98:5432/hvl
    username: HVL
    password: hvl12345
    referenceUrl: ${spring.datasource.url}
    referenceUsername: ${spring.datasource.username}
    referencePassword: hvl12345
    logLevel: info

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

Konsol Kullanımı

Kullanım şekli:

  • gradle cleanAll build diffChangeLog
  • gradle cleanAll build generateChangelog
  • gradle cleanAll build updateSql
  • gradle cleanAll build changelogSyncSql

Ide üzerinden kullanım