Пользовательские задачи Gradle exec не будут выполняться параллельно - PullRequest
0 голосов
/ 02 июня 2019

Моя цель состоит в том, чтобы я мог запустить ./gradlew deployStaging, и он выполняет buildDockerStatic и buildDockerBackend параллельно, и после того, как обе задачи завершатся, будет запущен deployStaging. С помощью приведенного ниже кода задачи выполняются последовательно. Я пробовал несколько вещей, но buildDockerStatic и buildDockerBackend всегда запускаются последовательно.

tasks.register("buildDockerStatic", BuildDockerStatic) {
    workingDir rootDir
}

tasks.register("buildDockerBackend", BuildDockerBackend) {
    workingDir rootDir
}

//noinspection GroovyAssignabilityCheck
task deployStaging() {
    dependsOn tasks.buildDockerStatic
    dependsOn tasks.buildDockerBackend

    doLast {
        exec {
            workingDir rootDir
            commandLine 'sh', './scripts/build_deploy_staging.sh'
        }
    }
}

class BuildDockerStatic extends AbstractExecTask<BuildDockerStatic> {
    BuildDockerStatic() {
        //noinspection GroovyAssignabilityCheck
        super(BuildDockerStatic)

        commandLine 'sh', './scripts/build_static.sh'
    }
}

class BuildDockerBackend extends AbstractExecTask<BuildDockerBackend> {
    BuildDockerBackend() {
        //noinspection GroovyAssignabilityCheck
        super(BuildDockerBackend)

        commandLine 'sh', './scripts/build_backend.sh'
    }
}

1 Ответ

0 голосов
/ 02 июня 2019

Для параллельного запуска задачи сборки должны быть размещены в подпроектах.

Они должны содержать doLast;в противном случае они будут выполнены при вызове, например.gradle clean.И, вероятно, будет достаточно определения с использованием простого значения task {..}.


Параллельно: из документов по Gradle: параллельное выполнение

Используя ключ --parallel, вы можете заставить Gradle выполнять задачи параллельно, если эти задачи находятся в разных проектах.


См. Модифицированный пример ниже;он будет запускать две подзадачи (для сна и входа в систему) параллельно.

Может быть запущен с gradle clean deployStaging --parallel

Многопроектная структура

build-backend
  +--build.gradle
build-static
  +--build.gradle
build.gradle
settings.gradle

build-backend/build.gradle:

apply plugin: 'base'
task buildDockerBackend {
  doLast{
    exec {
      println 'BuildDockerBackend: started at ' + new java.util.Date()
      workingDir rootDir
      sleep 4000
      //commandLine 'sh', './scripts/build_backend.sh'
      commandLine 'echo', 'task: build-backend'
      println 'BuildDockerBackend: done at    ' + new java.util.Date()
    }
  }
}

build-static/build.gradle

apply plugin: 'base'
task buildDockerStatic {
  doLast{
    exec {
      println 'BuildDockerStatic: started at ' + new java.util.Date()
      workingDir rootDir
      sleep 8000
      //commandLine 'sh', './scripts/build_static.sh'
      commandLine 'echo', 'task: build-static'
      println 'BuildDockerStatic: done at    ' + new java.util.Date()
    }
  }
}

build.gradle

apply plugin: 'base'
task deployStaging {
  doLast {
    exec {
      workingDir rootDir
      //commandLine 'sh', './scripts/build_deploy_staging.sh'
      commandLine 'echo', 'task: deploy-staging'
    }
  }
}
deployStaging.dependsOn ':build-static:buildDockerStatic'
deployStaging.dependsOn ':build-backend:buildDockerBackend'

settings.gradle

include 'build-static'
include 'build-backend'
...