یہ پوسٹ 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 میں تعریف قابل ہے۔

پلاگین کی معماری

jbake asciidoctor class diagram

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"))
    }
}
jbake asciidoctor sequence diagram

نتیجہ

ذمہ داریوں کا انقسام کے ذریعے`GitAdapter`یہ گرائیڈل پلاگین کی ترقی میں TDD کو پوری شکل سے لگو کرنے کی اجازت دیتا ہے :

  • گیٹ کالز ابسٹریٹ اور قابلِ امتحان ہیں ;

  • DSL کنفیگری صاف اور واضح ہے ;

  • پلاگین اصل نفاذ سے بیگانہ رہا ہے۔

یہ رویہ زیادہ قابلِ امتحان اور قابلِ توسیع (گیت هب API، گیٹ لاب وغیرہ) کو یقینی بناتا ہے۔

اگلے قدم

  • JBake کی جنریشن کو ایک کے طور پر شامل کریں`BakeAdapter`

  • ایntegral ٹیسٹس شامل کرنے کے ساتھ`GradleRunner`

  • خودکار فائل بارگیری کی حمایت`site.yml`کے ذریعے SnakeYAML

Articles connexes