جی بی کیک اور جگٹ کے ساتھ کنفیگریبل کوتلن گریڈل پلاگین کا TDD
Publié le 09 July 2025
یہ پوسٹ Kotlin DSL میں لکھے ہوئے Gradle پلاگ人の مکمل ڈیزائن اور ٹیسٹنگ (TDD) عمل پیش کرتا ہے۔ یہ پلاگإن JBake کے ساتھ static سائٹس کی پیداوری خودکار بناتا ہے اور JGit کے ذریعے Git ڈپلویمنٹ کرتا ہے، تمام شيء ایک YAML تنظیم فائل سے۔
هدف
ایک گرائیڈل پلاگین بنائیں :
-
قابل تنظیم میں Kotlin DSL ;
-
قابَل کا :
-
JBake سے ایک ستاتک سائٹ بنائیں ;
-
JGit کے ذریعے دور گِٹ ریپوزٹری پر ڈپلوی کریں ;
-
CI/CD ورک فلو میں شامل کرنے کے قابل ;
-
TDD کے عمل کے مطابق ٹیسٹ کیا گیا۔
اعلانی تنظیم
یہ YAML کنفیگریشن کا ایک مثال ہے جو ہمارے DSL میں ماڈل کرنے کے لیے ہے :
bake:
srcPath: "./site/jbake"
destDirPath: "bake"
pushPage:
from: "bake"
to: "cvs"
repo:
name: "trainings"
repository: "https://github.com/pages-content/trainings.git"
credentials:
username: "USERNAME"
password: "SECRET_TOKEN"
branch: "main"
message: "cheroliv.com"
یہ کنفیگری Gradle ایکسٹنشن کے ذریعے منعکس ہوتی ہے جو Kotlin DSL میں تعریف قابل ہے۔
پلاگین کی معماری
DSL کی إمتداد کی تعریف
open class WorkspaceEngineExtension {
var outputDir: String = "build/site"
var template: String = "freemarker"
var repoUrl: String = ""
var branch: String = "main"
var message: String = "Generated by engine"
}
مخصوص کام کی تعریف
abstract class GenerateSiteTask : DefaultTask() {
lateinit var gitAdapter: GitAdapter
@get:Input abstract val repoUrl: Property<String>
@get:InputDirectory abstract val outputDir: DirectoryProperty
@get:Input abstract val branch: Property<String>
@get:Input abstract val message: Property<String>
@TaskAction
fun run() {
val repo = gitAdapter.cloneRepository(repoUrl.get(), outputDir.get().asFile)
gitAdapter.commitAndPush(repo, branch.get(), message.get())
}
}
اینٹرفیس GitAdapter
interface GitAdapter {
fun cloneRepository(uri: String, directory: File): Repository
fun commitAndPush(repo: Repository, branch: String, message: String)
}
JGit کے ساتھ مختص تنفیذ
class JGitAdapter : GitAdapter {
override fun cloneRepository(uri: String, directory: File): Repository {
return Git.cloneRepository()
.setURI(uri)
.setDirectory(directory)
.call()
.repository
}
override fun commitAndPush(repo: Repository, branch: String, message: String) {
Git(repo).use {
it.add().addFilepattern(".").call()
it.commit().setMessage(message).call()
it.push().call()
}
}
}
Kotlin DSL کی تنظیم
workspaceEngine {
outputDir = "build/out"
template = "freemarker"
repoUrl = "https://github.com/cheroliv/trainings.git"
branch = "main"
message = "deploy from plugin"
}
یونٹ ٹسٹس Mockito کے ساتھ
ذمامات
testImplementation("org.mockito:mockito-core:5.12.0")
testImplementation("org.mockito.kotlin:mockito-kotlin:5.2.1")
testImplementation("org.junit.jupiter:junit-jupiter:5.10.0")
گیٹ کے سلوک کا ٹیسٹ
class GenerateSiteTaskMockitoTest {
@TempDir
lateinit var tempDir: File
@Test
fun `task should call clone and commitAndPush`() {
val project = ProjectBuilder.builder().build()
val task = project.tasks.create("generateSite", GenerateSiteTask::class.java)
val mockGitAdapter = mock<GitAdapter>()
val mockRepo = mock<Repository>()
whenever(mockGitAdapter.cloneRepository(any(), any())).thenReturn(mockRepo)
task.gitAdapter = mockGitAdapter
task.repoUrl.set("https://github.com/cheroliv/test.git")
task.outputDir.set(project.layout.projectDirectory.dir(tempDir.name))
task.branch.set("main")
task.message.set("test commit")
task.run()
verify(mockGitAdapter).cloneRepository(eq("https://github.com/cheroliv/test.git"), any())
verify(mockGitAdapter).commitAndPush(eq(mockRepo), eq("main"), eq("test commit"))
}
}
نتیجہ
ذمہ داریوں کا انقسام کے ذریعے`GitAdapter`یہ گرائیڈل پلاگین کی ترقی میں TDD کو پوری شکل سے لگو کرنے کی اجازت دیتا ہے :
-
گیٹ کالز ابسٹریٹ اور قابلِ امتحان ہیں ;
-
DSL کنفیگری صاف اور واضح ہے ;
-
پلاگین اصل نفاذ سے بیگانہ رہا ہے۔
یہ رویہ زیادہ قابلِ امتحان اور قابلِ توسیع (گیت هب API، گیٹ لاب وغیرہ) کو یقینی بناتا ہے۔
اگلے قدم
-
JBake کی جنریشن کو ایک کے طور پر شامل کریں`BakeAdapter`
-
ایntegral ٹیسٹس شامل کرنے کے ساتھ`GradleRunner`
-
خودکار فائل بارگیری کی حمایت`site.yml`کے ذریعے SnakeYAML