0

私はgradleに比較的慣れていません。クラスターで自動化されたデプロイ スクリプトを作成するために、相互に依存する一連のカスタム タスクを作成しました。例えば:

class StartSchedulerTask extends SchedulerTask {
    @TaskAction
    void start() {
        dependsOn env.nodes.name.collect {"startTomcat_$it"}
        println "Starting quartz on node: ${node}"
    }
}

build.gradle で、動的にタスクを作成しました:

project.extensions.environment.nodes.each { TomcatNode n ->
    String name = n.name
    task "nodeInit_$name"(type: DeployToNodeInitTask) {
                node(n)
    }
    task "stopWorker_$name"(type: StopWorkerTask) {
        node(n)
    }
    task "stopTomcat_$name"(type: StopTomcatTask){
        node(n)
    }
    task "updateAppConfigs_$name"(type: UpdateAppConfigsTask){
        node(n)
        apps(V3Application.ALL_APPS)
        buildName('develop')
    }
    task "deployWars_$name"(type: DeployWarsTask){
        node(n)
        apps(V3Application.ALL_APPS)
        buildName('develop')
    }
    task "startTomcat_$name"(type: StartTomcatTask){
        node(n)
    }
    task "startWorker_$name"(type: StartWorkerTask){
        node(n)
    }
    task "terminateNode_$name"(type: DeployToNodeTerminationTask){
        node(n)
    }
}
task stopScheduler(type: StopSchedulerTask) {
    environment(environment)
}
task startScheduler(type: StartSchedulerTask) {
    environment(environment)
}

デフォルトのタスクは、配置プロセスの最後のステップである startScheduler になるように構成されています。これは、タスク グラフが構築されると、タスクの正しい実行順序を処理するという考え方です。

ただし、タスク グラフを印刷すると、リストされているタスクは startScheduler だけです。何か不足していますか?

4

3 に答える 3

3

Peter NiederwieserとJeffreyの発言のおかげで、私は自分が望む完全な解決策を思いつくことができました。完全な答えが以下にあるので、私はピーターを答えとしてマークしませんでしたが、それは正しい解決策への必要なヒントでした:

インターフェイスDependencyAwareを作成しました:

public interface DependencyAware {
    void declareDependencies()
}

依存関係を宣言する方法を知っているすべてのタスクは、このインターフェースを実装します。例えば:

class StartSchedulerTask extends SchedulerTask {

    @TaskAction
    void start() {
        println "Starting quartz on node: ${node}"
    }

    void declareDependencies() {
        dependsOn env.nodes.name.collect {"startTomcat_$it"}
    }
}

私のビルドスクリプトでは:

tasks.each { Task t ->
    if (t instanceof DependencyAware) {
        t.declareDependencies()
    }
}

それでおしまい!

ポインタをありがとうピーターとジェフリー

更新1

task deploy(dependsOn: ['backupWars', 'startScheduler'])

task stopScheduler(type: StopSchedulerTask)

task backupWars(type: BackupWarsTask)

project.extensions.targetEnvironment.nodes.each { TomcatNode n ->
    String name = n.name
    [
        ("nodeInit_$name"): DeployToNodeInitTask,
        ("stopWorker_$name"): StopWorkerTask,
        ("stopTomcat_$name"): StopTomcatTask,
        ("updateAppConfigs_$name"): UpdateAppConfigsTask,
        ("deployWars_$name"): DeployWarsTask,
        ("startTomcat_$name"): StartTomcatTask,
        ("startWorker_$name"): StartWorkerTask,
        ("terminateNode_$name"): DeployToNodeTerminationTask,
    ].each { String taskName, Class taskType ->
        task "$taskName"(type: taskType) {
            node(n)
        }
    }
}

task startScheduler(type: StartSchedulerTask) {
    dryRun(testMode)
}

異なる展開ステップ間の内部依存関係は、タスク自体にあります。次に例を示します。

class StartWorkerTask extends WorkerTask {

    @TaskAction
    void start() {
        println "Starting worker ${node}"
    }

    void declareDependencies() {
        dependsOn tomcatOnThisNodeHasBeenStarted()
    }

    String tomcatOnThisNodeHasBeenStarted() {
        "startTomcat_${node.name}"
    }
}

トポロジーの宣言は次のとおりです。

environments {
    prod {
        nodes {
            (1..2).each { int i ->
                "w${i}_prod" {
                    host = "prod-n$i"
                    userName = "xxxxx"
                    password = "xxxxx"
                    loadBalancer = 'lb_prod'
                    frontendJkManagerUrl = 'http://web01/jkmanager'
                }
            }

            scheduler {
                name = "w1_prod"
            }
        }
    }
    rc {
    //rc topology here
    }
}
于 2012-12-29T11:53:09.730 に答える
3

タスクの依存関係は、実行時ではなく構成時に宣言する必要があります。理論的には、タスクのコンストラクターでこれを行うこともできますが、より良いアプローチは、ビルド スクリプトまたはプラグインで行うことです。

于 2012-12-29T06:40:38.207 に答える
2

@TaskAction メソッド内から依存関係を宣言しているためです。@TaskAction は、依存関係グラフが形成された後にのみ実行されます。

@TaskActions メソッド内で悪用DoFirst()してすべての依存関係を呼び出すことができますが、これは依存関係グラフには表示されません。

于 2012-12-29T01:21:11.293 に答える