Skip to content

[Plan] Migrate Gradle build to Kotlin DSL #8

Description

@michael-newsrx

Gradle Kotlin DSL Migration Implementation Plan

For agentic workers: REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (- [ ]) syntax for tracking.

Goal: Migrate Gradle build from Groovy DSL to Kotlin DSL and complete configuration for GitBucket plugin development.

Architecture: Convert existing Gradle files to Kotlin DSL, add Gradle wrapper to version control, and verify build produces fat JAR for GitBucket plugin deployment.

Tech Stack: Gradle 9.3.0, Kotlin DSL, Scala 2.13.18, GradleUp Shadow 8.3.5, Java 21 toolchain / Java 17 target


File Structure

Create:

  • build.gradle.kts - Build configuration in Kotlin DSL
  • settings.gradle.kts - Settings with plugin management in Kotlin DSL

Modify:

  • .gitignore - Add !gradle/wrapper/gradle-wrapper.properties entry
  • README.md - Clarify build instructions (already has ./gradlew shadowJar)

Delete:

  • build.gradle - Old Groovy build file
  • settings.gradle - Old Groovy settings file

Track in Git:

  • gradlew - Unix executable
  • gradlew.bat - Windows script
  • gradle/wrapper/gradle-wrapper.jar - Wrapper JAR
  • gradle/wrapper/gradle-wrapper.properties - Wrapper config (Gradle 9.3.0)

Task 1: Create settings.gradle.kts with Plugin Management

Files:

  • Create: settings.gradle.kts

  • Step 1: Create settings.gradle.kts

pluginManagement {
    plugins {
        id("scala") version "8.7.0"
        id("com.gradleup.shadow") version "8.3.5"
    }
}

rootProject.name = "gitbucket-mcp-plugin"
  • Step 2: Verify settings.gradle.kts syntax

Run: cat settings.gradle.kts
Expected: File contains pluginManagement block and rootProject.name


Task 2: Create build.gradle.kts with Complete Configuration

Files:

  • Create: build.gradle.kts

  • Step 1: Create build.gradle.kts

plugins {
    scala
    id("com.gradleup.shadow")
}

group = "com.newsrx"
version = "0.1.0"

java {
    toolchain {
        languageVersion.set(JavaLanguageVersion.of(21))
    }
}

tasks.withType<JavaCompile>().configureEach {
    sourceCompatibility = "17"
    targetCompatibility = "17"
}

repositories {
    mavenCentral()
    maven { url = uri("https://oss.sonatype.org/content/repositories/releases/") }
}

dependencies {
    implementation("org.scala-lang:scala-library:2.13.18")
    compileOnly("io.github.gitbucket:gitbucket_2.13:4.46.0")
    compileOnly("org.scalatra:scalatra-javax_2.13:3.1.2")
    compileOnly("io.github.json4s:json4s-jackson_2.13:4.1.0")
    compileOnly("javax.servlet:javax.servlet-api:3.1.0")
    
    testImplementation("org.scalatest:scalatest_2.13:3.2.18")
}

scala {
    scalaVersion = "2.13.18"
}

sourceSets {
    main {
        scala {
            setSrcDirs(listOf("src/main/scala", "src/main/java"))
        }
        java {
            setSrcDirs(emptyList<String>())
        }
    }
}

tasks.shadowJar {
    archiveClassifier.set("")
    exclude("META-INF/*.RSA")
    exclude("META-INF/*.SF")
    exclude("META-INF/*.DSA")
}

tasks.build {
    dependsOn(tasks.shadowJar)
}
  • Step 2: Verify build.gradle.kts syntax

Run: cat build.gradle.kts
Expected: File contains all plugins, dependencies, and configuration blocks


Task 3: Update .gitignore for Gradle Wrapper Properties

Files:

  • Modify: .gitignore:4-5

  • Step 1: Update .gitignore

The current .gitignore line 4 is:

!gradle/wrapper/gradle-wrapper.jar

Replace with:

!gradle/wrapper/gradle-wrapper.jar
!gradle/wrapper/gradle-wrapper.properties
  • Step 2: Verify .gitignore changes

Run: cat .gitignore
Expected: Both gradle-wrapper.jar and gradle-wrapper.properties have exception lines


Task 4: Add Gradle Wrapper Files to Git

Files:

  • Track: gradlew

  • Track: gradlew.bat

  • Track: gradle/wrapper/gradle-wrapper.jar

  • Track: gradle/wrapper/gradle-wrapper.properties

  • Step 1: Stage Gradle wrapper files

git add gradlew gradlew.bat gradle/wrapper/
  • Step 2: Verify wrapper files are staged

Run: git status
Expected: All 4 wrapper files show as "new file" or "modified"


Task 5: Remove Old Groovy Gradle Files

Files:

  • Delete: build.gradle

  • Delete: settings.gradle

  • Step 1: Delete old Groovy files

git rm build.gradle settings.gradle
  • Step 2: Verify Groovy files removed

Run: git status
Expected: build.gradle and settings.gradle show as "deleted"


Task 6: Stage New Kotlin DSL Files

Files:

  • Track: settings.gradle.kts

  • Track: build.gradle.kts

  • Step 1: Stage Kotlin DSL files

git add settings.gradle.kts build.gradle.kts
  • Step 2: Verify Kotlin files staged

Run: git status
Expected: Both .kts files show as "new file"


Task 7: Build and Verify

Files:

  • Verify: build/libs/gitbucket-mcp-plugin-0.1.0.jar

  • Step 1: Clean and build

./gradlew clean build

Expected: BUILD SUCCESSFUL, no errors

  • Step 2: Verify JAR exists

Run: ls -la build/libs/
Expected: gitbucket-mcp-plugin-0.1.0.jar exists and is ~5-6MB

  • Step 3: Verify plugin descriptor in JAR
unzip -l build/libs/gitbucket-mcp-plugin-0.1.0.jar | grep gitbucket-plugin.properties

Expected: Shows gitbucket-plugin.properties entry in JAR


Task 8: Commit All Changes

Files:

  • Commit: All staged files

  • Step 1: Verify all changes staged

Run: git status
Expected: 6 files to be committed:

  • build.gradle (deleted)

  • settings.gradle (deleted)

  • build.gradle.kts (new file)

  • settings.gradle.kts (new file)

  • .gitignore (modified)

  • 4 Gradle wrapper files (new files)

  • Step 2: Commit changes

git commit -m "feat: migrate Gradle build to Kotlin DSL

- Convert build.gradle to build.gradle.kts
- Convert settings.gradle to settings.gradle.kts
- Add Gradle wrapper files to version control
- Update .gitignore for wrapper properties
- Configure Java 21 toolchain with Java 17 target
- Use GradleUp shadow plugin 8.3.5 for compatibility"

Acceptance Criteria Verification

After completing all tasks:

  • build.gradle.kts exists and is valid Kotlin DSL
  • settings.gradle.kts exists with plugin management
  • Old Groovy files removed
  • Gradle wrapper files tracked in git
  • Build succeeds with ./gradlew build
  • Fat JAR produced at build/libs/gitbucket-mcp-plugin-0.1.0.jar
  • .gitignore includes Gradle exclusions
  • README.md already has build instructions (verified in spec review)

Notes

  • No tests needed for build configuration changes (no production code)
  • .gitignore already has !gradle/wrapper/gradle-wrapper.jar - just missing properties exception
  • README already documents ./gradlew shadowJar - no changes needed
  • Build configuration produces same output as Groovy DSL, just in Kotlin syntax

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions