2
0

build.gradle.kts 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. /*
  2. * Copyright 2019-2023 Mamoe Technologies and contributors.
  3. *
  4. * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.
  5. * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.
  6. *
  7. * https://github.com/mamoe/mirai/blob/dev/LICENSE
  8. */
  9. import keys.SecretKeys
  10. import kotlinx.validation.sourceSets
  11. import java.io.ByteArrayOutputStream
  12. plugins {
  13. id("io.codearte.nexus-staging") version "0.22.0"
  14. kotlin("jvm")
  15. kotlin("plugin.serialization")
  16. }
  17. tasks.register<JavaExec>("runcihelper") {
  18. this.classpath = sourceSets["main"].runtimeClasspath
  19. this.mainClass.set("cihelper.CiHelperKt")
  20. this.workingDir = rootProject.projectDir
  21. fun Project.findPublishingExt(): PublishingExtension? {
  22. val exts = (this@findPublishingExt as ExtensionAware).extensions
  23. return exts.findByName("publishing") as PublishingExtension?
  24. }
  25. doFirst {
  26. @Suppress("USELESS_CAST")
  27. environment("PROJ_VERSION", (project.version as Any?).toString())
  28. rootProject.allprojects.asSequence()
  29. .mapNotNull { it.findPublishingExt() }
  30. .flatMap { it.publications.asSequence() }
  31. .mapNotNull { it as? MavenPublication }
  32. .map { it.artifactId }
  33. .joinToString("|")
  34. .let { environment("PROJ_ARTIFACTS", it) }
  35. rootProject.allprojects.asSequence()
  36. .mapNotNull { it.findPublishingExt() }
  37. .flatMap { it.repositories.asSequence() }
  38. .mapNotNull { it as? MavenArtifactRepository }
  39. .filter { it.name == "MiraiStageRepo" }
  40. .first().url
  41. .let { environment("PROJ_MiraiStageRepo", it.toString()) }
  42. val additionProperties = rootProject.properties.asSequence()
  43. .filter { (k, _) -> k.startsWith("cihelper.") }
  44. .map { (k, v) -> "-D$k=$v" }
  45. .toList()
  46. if (additionProperties.isNotEmpty()) {
  47. val currentJvmArgs = jvmArgs ?: emptyList()
  48. jvmArgs = currentJvmArgs + additionProperties
  49. }
  50. }
  51. }
  52. description = "Mirai CI Methods for Releasing"
  53. nexusStaging {
  54. packageGroup = rootProject.group.toString()
  55. val keys = SecretKeys.getCache(project).loadKey("sonatype")
  56. username = keys.user
  57. password = keys.password
  58. }
  59. dependencies {
  60. implementation(`ktor-client-okhttp`)
  61. implementation(`kotlinx-serialization-json`)
  62. implementation("org.jetbrains.kotlinx", "kotlinx-datetime-jvm", "0.4.0")
  63. }
  64. tasks.register("updateSnapshotVersion") {
  65. group = "mirai"
  66. dependsOn(tasks.compileKotlin)
  67. dependsOn(tasks.compileJava)
  68. doLast {
  69. val out = ByteArrayOutputStream()
  70. val sha = getSha()
  71. val branch = getCurrentGitBranch()
  72. val result = javaexec {
  73. standardOutput = out
  74. classpath(sourceSets.main.get().runtimeClasspath)
  75. mainClass.set("cihelper.buildIndex.GetNextSnapshotIndex")
  76. args(branch, sha)
  77. environment(
  78. "mirai.build.index.auth.username",
  79. System.getenv("MIRAI_BUILD_INDEX_AUTH_USERNAME")
  80. ?: project.property("mirai.build.index.auth.username")
  81. )
  82. environment(
  83. "mirai.build.index.auth.password",
  84. System.getenv("MIRAI_BUILD_INDEX_AUTH_PASSWORD")
  85. ?: project.property("mirai.build.index.auth.password")
  86. )
  87. }
  88. result.assertNormalExitValue()
  89. val resultString = out.toByteArray().decodeToString()
  90. val branchAndIndex = resultString
  91. .substringAfter("<SNAPSHOT_VERSION_START>", "")
  92. .substringBefore("<SNAPSHOT_VERSION_END>", "")
  93. logger.info("Exec result:")
  94. logger.info(resultString)
  95. if (branchAndIndex.isEmpty()) {
  96. throw GradleException("Failed to find version.")
  97. }
  98. logger.info("Snapshot version index is '$branchAndIndex'")
  99. val versionName = "${Versions.project}-${branchAndIndex}"
  100. // Add annotation on GitHub Actions build
  101. // https://docs.github.com/en/actions/using-workflows/workflow-commands-for-github-actions#setting-a-notice-message
  102. println("::notice ::本 commit 的预览版本号: $versionName 在 https://github.com/mamoe/mirai/blob/dev/docs/UsingSnapshots.md 查看如何使用预览版本")
  103. setProjectVersionForFutureBuilds(versionName)
  104. }
  105. }
  106. tasks.register("publishSnapshotPage") {
  107. doLast {
  108. val sha = getSha()
  109. logger.info("CommitRef is $sha")
  110. UpdateSnapshotPage.run(project, sha)
  111. }
  112. }
  113. fun getSnapshotVersionImpl(): String {
  114. val branch = getCurrentGitBranch()
  115. logger.info("Current branch name is '$branch'")
  116. val sha = getSha().trim().take(8)
  117. return "${Versions.project}-$branch-${sha}".also {
  118. logger.info("Snapshot version is '$it'")
  119. }
  120. }
  121. //tasks.register("createTagOnGitHub") {
  122. // group = "mirai"
  123. // dependsOn(gradle.includedBuild("snapshots-publishing").task(":check"))
  124. //
  125. // doLast {
  126. // val token = System.getenv("MAMOE_TOKEN")
  127. // require(!token.isNullOrBlank()) { "" }
  128. //
  129. // val out = ByteArrayOutputStream()
  130. // exec {
  131. // commandLine("git")
  132. // args("rev-parse", "HEAD")
  133. // standardOutput = out
  134. // workingDir = rootProject.projectDir
  135. // }
  136. // val sha = out.toString()
  137. // logger.info("Current sha is $sha")
  138. //
  139. // runBlocking {
  140. // val resp = HttpClient().post<String>("https://api.github.com/repos/mamoe/mirai/git/refs") {
  141. // header("Authorization", "token $token")
  142. // header("Accept", "application/vnd.github.v3+json")
  143. // body = Gson().toJson(
  144. // mapOf(
  145. // "ref" to "refs/tags/build-$nextVersion",
  146. // "sha" to sha,
  147. // )
  148. // )
  149. // }
  150. // logger.info(resp)
  151. // }
  152. // }
  153. //}
  154. fun getSha(): String {
  155. val out = ByteArrayOutputStream()
  156. exec {
  157. commandLine("git")
  158. args("rev-parse", "HEAD")
  159. standardOutput = out
  160. workingDir = rootProject.projectDir
  161. }
  162. val sha = out.toString().trim()
  163. logger.info("Current commit sha is '$sha'")
  164. return sha
  165. }
  166. fun getCurrentGitBranch(): String {
  167. val out = ByteArrayOutputStream()
  168. exec {
  169. commandLine("git")
  170. args("rev-parse", "--abbrev-ref", "HEAD")
  171. standardOutput = out
  172. workingDir = rootProject.projectDir
  173. }
  174. val sha = out.toString().trim()
  175. logger.info("Current branch is '$sha'")
  176. return sha
  177. }