首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有发布顺序的分级发布复合构建

带有发布顺序的分级发布复合构建
EN

Stack Overflow用户
提问于 2022-10-31 08:09:03
回答 1查看 59关注 0票数 2

我在下面的目录结构中有一个gradle 复合建筑

代码语言:javascript
复制
.
├── component-1
├── component-2
├── component-3
└── composite-build

在这里,所有组件都是多项目构建。每个组件都实现了释放插件,可以单独发布。composite-build跟踪settings.gradle

代码语言:javascript
复制
rootProject.name = 'composite-build'

includeBuild '../component-1'
includeBuild '../component-2'
includeBuild '../component-3'

我想以特定的顺序执行每个组件的release任务,但是我找不到合适的方法。以下是我尝试并失败的一些案例。在这些情况下,由于发布插件完成的git标记提交冲突,单个release任务也失败了。

案例1:

build.gradle

代码语言:javascript
复制
task releaseAll {
    dependsOn gradle.includedBuild('component-1').task(':release')
    dependsOn gradle.includedBuild('component-2').task(':release')
    dependsOn gradle.includedBuild('component-3').task(':release')
}

案例2:

build.gradle

代码语言:javascript
复制
task releaseComponent1 {
    dependsOn gradle.includedBuild('component-1').task(':release')
}

task releaseComponent2 {
    dependsOn gradle.includedBuild('component-2').task(':release')
}

task releaseComponent3 {
    dependsOn gradle.includedBuild('component-3').task(':release')
}

releaseComponent2.configure {
    mustRunAfter releaseComponent1
}

releaseComponent3.configure {
    mustRunAfter releaseComponent2
}

task releaseAll {
    dependsOn releaseComponent1
    dependsOn releaseComponent2
    dependsOn releaseComponent3
}

示例错误消息:

代码语言:javascript
复制
> Task :component-1:component-1-release:preTagCommit FAILED
Running [git, commit, -m,  [Gradle Release Plugin] - pre tag commit:  'component-1-0.1.10'., -a] produced an error: []
Running [git, push, --porcelain, origin, main] produced an error: [error: failed to push some refs to 'https://github.com/<username>/<repo-name>.git']

> Task :component-1:release FAILED
Release process failed, reverting back any changes made by Release Plugin.
Running [git, checkout, gradle.properties] produced an error: [error: pathspec 'gradle.properties' did not match any file(s) known to git]

1: Task failed with an exception.
-----------
* What went wrong:
Execution failed for task ':component-1:component-1-release:preTagCommit'.
> Failed to push to remote - [To https://github.com/<username>/<repo-name>.git
  !     refs/heads/main:refs/heads/main [remote rejected] (cannot lock ref 'refs/heads/main': is at <xxxx> but expected <yyyy>)
  Done
  ][error: failed to push some refs to 'https://github.com/<username>/<repo-name>.git'
  ]
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-10-31 08:54:54

在gradle中始终有一个选项,您可以使用finalizedBy自动化并链接任务执行,并且可以测试这段简单的代码以检查它是如何工作的:

代码语言:javascript
复制
task A() {
    println 'taskA'
}
task B() {
    println 'taskB'
}
tasks.named("B") { finalizedBy("A") }

task C() {
    println 'taskC'
}
tasks.named("C") { finalizedBy("B") }

这样,通过调用gradle C,它将回溯到执行A然后是B然后是C

同样,您可以执行3项任务来获得所需的有序执行,如下所示

代码语言:javascript
复制
task c1release(type:Exec) {
  workingDir '.\\component-1'
  commandLine("cmd", "/c", "gradle", "release")
     doLast {
         println "component-1 release is being excuted"
     }
}
tasks.named("c1release") { finalizedBy("c2release") }

task c2release(type:Exec) {
  workingDir '.\\component-2'
  commandLine("cmd", "/c", "gradle", "release")
     doLast {
         println "component-2 release is being excuted"
     }
}
tasks.named("c2release") { finalizedBy("c3release") }


task c3release(type:Exec) {
  workingDir '.\\component-3'
  commandLine("cmd", "/c", "gradle", "release")
     doLast {
         println "component-3 release is being excuted"
     }
}
tasks.named("releaseAll") { finalizedBy("c1release") }

task releaseAll() {
    println "Start releasing"
}

通过调用gradle releaseAll,它将首先执行c1release,然后执行c2release,然后执行c3release

但是我仍然希望我知道你在你的问题中所包含的案例中有什么样的错误。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74260361

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档