From 554e50855b70a49fbe7de3b4c242bdddda91d87e Mon Sep 17 00:00:00 2001 From: Benoit Moriceau Date: Fri, 5 Nov 2021 18:55:15 -0700 Subject: [PATCH] Revert "Bmoric/remove docker compose for build (#7500)" (#7698) This reverts commit 4e17fa21a5a4571cf25407e2423c8b59af615cca. --- .bumpversion.cfg | 2 - .github/workflows/gradle.yml | 4 +- airbyte-cli/build.gradle | 6 +- airbyte-config/init/.dockerignore | 3 + airbyte-config/init/Dockerfile | 2 +- airbyte-config/init/build.gradle | 11 ---- airbyte-db/lib/.dockerignore | 2 + airbyte-db/lib/Dockerfile | 2 +- airbyte-db/lib/build.gradle | 13 ---- airbyte-migration/.dockerignore | 3 + airbyte-migration/Dockerfile | 2 +- airbyte-migration/build.gradle | 13 ---- .../java/io/airbyte/oauth/BaseOAuthFlow.java | 1 + airbyte-scheduler/app/.dockerignore | 3 + airbyte-scheduler/app/Dockerfile | 2 +- airbyte-scheduler/app/build.gradle | 14 ----- airbyte-server/.dockerignore | 3 + airbyte-server/Dockerfile | 2 +- airbyte-server/build.gradle | 14 ----- airbyte-webapp/.dockerignore | 4 ++ airbyte-webapp/Dockerfile | 8 ++- airbyte-webapp/build.gradle | 31 +--------- airbyte-workers/Dockerfile | 2 +- airbyte-workers/build.gradle | 14 ----- build.gradle | 59 ++++++++++++------- docs/SUMMARY.md | 1 - .../developing-on-docker.md | 43 -------------- docs/project-overview/changelog/README.md | 3 +- .../acceptance_test_kube_gke.sh | 2 +- tools/bin/release_version.sh | 2 +- 30 files changed, 77 insertions(+), 194 deletions(-) create mode 100644 airbyte-config/init/.dockerignore create mode 100644 airbyte-db/lib/.dockerignore create mode 100644 airbyte-migration/.dockerignore create mode 100644 airbyte-scheduler/app/.dockerignore create mode 100644 airbyte-server/.dockerignore create mode 100644 airbyte-webapp/.dockerignore delete mode 100644 docs/contributing-to-airbyte/developing-on-docker.md diff --git a/.bumpversion.cfg b/.bumpversion.cfg index e9bda52d54a9..5b463ca898be 100644 --- a/.bumpversion.cfg +++ b/.bumpversion.cfg @@ -10,8 +10,6 @@ serialize = [bumpversion:file:.env] -[bumpversion:file:airbyte-migration/Dockerfile] - [bumpversion:file:airbyte-server/Dockerfile] [bumpversion:file:airbyte-workers/Dockerfile] diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml index 174a134cca29..87ff147195de 100644 --- a/.github/workflows/gradle.yml +++ b/.github/workflows/gradle.yml @@ -339,7 +339,7 @@ jobs: EOF - name: Build Platform Docker Images - run: SUB_BUILD=PLATFORM ./gradlew --no-daemon assemble --scan + run: SUB_BUILD=PLATFORM ./gradlew --no-daemon composebuild --scan - name: Run End-to-End Frontend Tests run: ./tools/bin/e2e_test.sh @@ -457,7 +457,7 @@ jobs: HOME: /home/runner - name: Build Platform Docker Images - run: SUB_BUILD=PLATFORM ./gradlew assemble --scan + run: SUB_BUILD=PLATFORM ./gradlew composeBuild --scan - name: Run Kubernetes End-to-End Acceptance Tests env: diff --git a/airbyte-cli/build.gradle b/airbyte-cli/build.gradle index 4cccd9d4f401..3388338f60a7 100644 --- a/airbyte-cli/build.gradle +++ b/airbyte-cli/build.gradle @@ -1,3 +1,3 @@ -Task dockerBuildTask = getDockerBuildTask("cli", "$project.projectDir") -dockerBuildTask.dependsOn(copyDocker) -assemble.dependsOn(dockerBuildTask) +plugins { + id "airbyte-docker" +} diff --git a/airbyte-config/init/.dockerignore b/airbyte-config/init/.dockerignore new file mode 100644 index 000000000000..5ad9d43099b6 --- /dev/null +++ b/airbyte-config/init/.dockerignore @@ -0,0 +1,3 @@ +* +!src +!scripts diff --git a/airbyte-config/init/Dockerfile b/airbyte-config/init/Dockerfile index c62cb080d822..89bd5491e53a 100644 --- a/airbyte-config/init/Dockerfile +++ b/airbyte-config/init/Dockerfile @@ -5,4 +5,4 @@ WORKDIR /app # the sole purpose of this image is to seed the data volume with the default data # that the app should have when it is first installed. -COPY bin/scripts scripts +COPY scripts scripts diff --git a/airbyte-config/init/build.gradle b/airbyte-config/init/build.gradle index 05bfa389043c..c7117fd16ea7 100644 --- a/airbyte-config/init/build.gradle +++ b/airbyte-config/init/build.gradle @@ -11,14 +11,3 @@ dependencies { implementation project(':airbyte-commons-docker') implementation project(':airbyte-json-validation') } - -task copyScripts(type: Copy) { - dependsOn copyDocker - - from('scripts') - into 'build/docker/bin/scripts' -} - -Task dockerBuildTask = getDockerBuildTask("init", "$project.projectDir") -dockerBuildTask.dependsOn(copyScripts) -assemble.dependsOn(dockerBuildTask) diff --git a/airbyte-db/lib/.dockerignore b/airbyte-db/lib/.dockerignore new file mode 100644 index 000000000000..7a1eba35d5be --- /dev/null +++ b/airbyte-db/lib/.dockerignore @@ -0,0 +1,2 @@ +* +!src diff --git a/airbyte-db/lib/Dockerfile b/airbyte-db/lib/Dockerfile index a9f42ce521ba..a2feafc85de8 100644 --- a/airbyte-db/lib/Dockerfile +++ b/airbyte-db/lib/Dockerfile @@ -1,3 +1,3 @@ FROM postgres:13-alpine -COPY bin/init.sql /docker-entrypoint-initdb.d/000_init.sql +COPY src/main/resources/init.sql /docker-entrypoint-initdb.d/000_init.sql diff --git a/airbyte-db/lib/build.gradle b/airbyte-db/lib/build.gradle index 5be6ca9a1e8e..1d3d5dd2d331 100644 --- a/airbyte-db/lib/build.gradle +++ b/airbyte-db/lib/build.gradle @@ -69,16 +69,3 @@ task(dumpJobsSchema, dependsOn: 'classes', type: JavaExec) { classpath = sourceSets.main.runtimeClasspath args 'jobs', 'dump_schema' } - -task copyInitSql(type: Copy) { - dependsOn copyDocker - - from('src/main/resources') { - include 'init.sql' - } - into 'build/docker/bin' -} - -Task dockerBuildTask = getDockerBuildTask("db", "$project.projectDir") -dockerBuildTask.dependsOn(copyInitSql) -assemble.dependsOn(dockerBuildTask) diff --git a/airbyte-migration/.dockerignore b/airbyte-migration/.dockerignore new file mode 100644 index 000000000000..65c7d0ad3e73 --- /dev/null +++ b/airbyte-migration/.dockerignore @@ -0,0 +1,3 @@ +* +!Dockerfile +!build diff --git a/airbyte-migration/Dockerfile b/airbyte-migration/Dockerfile index 1fe50c4560c6..8a657e07ee5b 100644 --- a/airbyte-migration/Dockerfile +++ b/airbyte-migration/Dockerfile @@ -6,7 +6,7 @@ ENV APPLICATION airbyte-migration WORKDIR /app # Move and run scheduler -COPY bin/${APPLICATION}-0.30.31-alpha.tar ${APPLICATION}.tar +COPY build/distributions/${APPLICATION}*.tar ${APPLICATION}.tar RUN tar xf ${APPLICATION}.tar --strip-components=1 diff --git a/airbyte-migration/build.gradle b/airbyte-migration/build.gradle index 1a9504dec522..ac752cf739c7 100644 --- a/airbyte-migration/build.gradle +++ b/airbyte-migration/build.gradle @@ -15,16 +15,3 @@ application { mainClass = 'io.airbyte.migrate.MigrationRunner' } -task copyGeneratedTar(type: Copy) { - dependsOn distTar - dependsOn copyDocker - - from('build/distributions') { - include 'airbyte-migration-*.tar' - } - into 'build/docker/bin' -} - -Task dockerBuildTask = getDockerBuildTask("migration", "$project.projectDir") -dockerBuildTask.dependsOn(copyGeneratedTar) -assemble.dependsOn(dockerBuildTask) diff --git a/airbyte-oauth/src/main/java/io/airbyte/oauth/BaseOAuthFlow.java b/airbyte-oauth/src/main/java/io/airbyte/oauth/BaseOAuthFlow.java index 7e03902ce078..917711f944a8 100644 --- a/airbyte-oauth/src/main/java/io/airbyte/oauth/BaseOAuthFlow.java +++ b/airbyte-oauth/src/main/java/io/airbyte/oauth/BaseOAuthFlow.java @@ -25,6 +25,7 @@ import java.util.function.Function; import java.util.function.Supplier; import org.apache.commons.lang3.RandomStringUtils; +import org.apache.http.client.utils.URIBuilder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/airbyte-scheduler/app/.dockerignore b/airbyte-scheduler/app/.dockerignore new file mode 100644 index 000000000000..65c7d0ad3e73 --- /dev/null +++ b/airbyte-scheduler/app/.dockerignore @@ -0,0 +1,3 @@ +* +!Dockerfile +!build diff --git a/airbyte-scheduler/app/Dockerfile b/airbyte-scheduler/app/Dockerfile index c603b3d9e803..f4cb9b7d537a 100644 --- a/airbyte-scheduler/app/Dockerfile +++ b/airbyte-scheduler/app/Dockerfile @@ -5,7 +5,7 @@ ENV APPLICATION airbyte-scheduler WORKDIR /app -ADD bin/${APPLICATION}-0.30.31-alpha.tar /app +ADD build/distributions/${APPLICATION}-0.30.31-alpha.tar /app # wait for upstream dependencies to become available before starting server ENTRYPOINT ["/bin/bash", "-c", "${APPLICATION}-0.30.31-alpha/bin/${APPLICATION}"] diff --git a/airbyte-scheduler/app/build.gradle b/airbyte-scheduler/app/build.gradle index 371137316379..d40206efb3ae 100644 --- a/airbyte-scheduler/app/build.gradle +++ b/airbyte-scheduler/app/build.gradle @@ -57,17 +57,3 @@ run { environment "TEMPORAL_HOST", "localhost:7233" } - -task copyGeneratedTar(type: Copy) { - dependsOn copyDocker - dependsOn distTar - - from('build/distributions') { - include 'airbyte-scheduler-*.tar' - } - into 'build/docker/bin' -} - -Task dockerBuildTask = getDockerBuildTask("scheduler", "$project.projectDir") -dockerBuildTask.dependsOn(copyGeneratedTar) -assemble.dependsOn(dockerBuildTask) diff --git a/airbyte-server/.dockerignore b/airbyte-server/.dockerignore new file mode 100644 index 000000000000..65c7d0ad3e73 --- /dev/null +++ b/airbyte-server/.dockerignore @@ -0,0 +1,3 @@ +* +!Dockerfile +!build diff --git a/airbyte-server/Dockerfile b/airbyte-server/Dockerfile index 56ccd6192bcd..ec7aefe8c4c1 100644 --- a/airbyte-server/Dockerfile +++ b/airbyte-server/Dockerfile @@ -7,7 +7,7 @@ ENV APPLICATION airbyte-server WORKDIR /app -ADD bin/${APPLICATION}-0.30.31-alpha.tar /app +ADD build/distributions/${APPLICATION}-0.30.31-alpha.tar /app # wait for upstream dependencies to become available before starting server ENTRYPOINT ["/bin/bash", "-c", "${APPLICATION}-0.30.31-alpha/bin/${APPLICATION}"] diff --git a/airbyte-server/build.gradle b/airbyte-server/build.gradle index a5ce58eb7946..a38db0edc5db 100644 --- a/airbyte-server/build.gradle +++ b/airbyte-server/build.gradle @@ -127,17 +127,3 @@ run { environment "AIRBYTE_ROLE", System.getenv('AIRBYTE_ROLE') environment "TEMPORAL_HOST", "localhost:7233" } - -task copyGeneratedTar(type: Copy) { - dependsOn copyDocker - dependsOn distTar - - from('build/distributions') { - include 'airbyte-server-*.tar' - } - into 'build/docker/bin' -} - -Task dockerBuildTask = getDockerBuildTask("server", "$project.projectDir") -dockerBuildTask.dependsOn(copyGeneratedTar) -assemble.dependsOn(dockerBuildTask) diff --git a/airbyte-webapp/.dockerignore b/airbyte-webapp/.dockerignore new file mode 100644 index 000000000000..b284b9daeb6c --- /dev/null +++ b/airbyte-webapp/.dockerignore @@ -0,0 +1,4 @@ +* +!Dockerfile +!build +!nginx diff --git a/airbyte-webapp/Dockerfile b/airbyte-webapp/Dockerfile index 1eead5631b6f..e1054ff5154f 100644 --- a/airbyte-webapp/Dockerfile +++ b/airbyte-webapp/Dockerfile @@ -2,6 +2,8 @@ FROM nginx:1.19-alpine as webapp EXPOSE 80 -COPY bin/docs docs/ -COPY bin/build /usr/share/nginx/html -COPY bin/nginx/default.conf.template /etc/nginx/templates/default.conf.template +COPY build/docs docs/ +# docs get copied twice because npm gradle plugin ignores output dir. +COPY build /usr/share/nginx/html +RUN rm -rf /usr/share/nginx/html/docs +COPY nginx/default.conf.template /etc/nginx/templates/default.conf.template diff --git a/airbyte-webapp/build.gradle b/airbyte-webapp/build.gradle index 886827b84494..1ea5a0ed0dbc 100644 --- a/airbyte-webapp/build.gradle +++ b/airbyte-webapp/build.gradle @@ -32,38 +32,11 @@ task test(type: NpmTask) { assemble.dependsOn npm_run_build build.finalizedBy test -task copyBuild(type: Copy) { - dependsOn copyDocker - - from "${project.projectDir}/build" - into "build/docker/bin/build" - exclude ".docker" - exclude "docker" -} - task copyDocs(type: Copy) { - dependsOn copyDocker - - from "${project.rootProject.projectDir}/docs/integrations" - into "build/docker/bin/docs/integrations" + from "${System.getProperty("user.dir")}/docs/integrations" + into "${buildDir}/docs/integrations" duplicatesStrategy DuplicatesStrategy.INCLUDE } -task copyNginx(type: Copy) { - dependsOn copyDocker - - from "${project.projectDir}/nginx" - into "build/docker/bin/nginx" -} - -copyBuild.dependsOn npm_run_build -copyNginx.dependsOn npm_run_build copyDocs.dependsOn npm_run_build assemble.dependsOn copyDocs -copyDocker.dependsOn(npm_run_build) - -Task dockerBuildTask = getDockerBuildTask("webapp", "$project.projectDir") -dockerBuildTask.dependsOn(copyBuild) -dockerBuildTask.dependsOn(copyNginx) -dockerBuildTask.dependsOn(copyDocs) -assemble.dependsOn(dockerBuildTask) diff --git a/airbyte-workers/Dockerfile b/airbyte-workers/Dockerfile index 3e06d45c6bd9..09cbbe5c8990 100644 --- a/airbyte-workers/Dockerfile +++ b/airbyte-workers/Dockerfile @@ -23,7 +23,7 @@ ENV APPLICATION airbyte-workers WORKDIR /app # Move worker app -ADD bin/${APPLICATION}-0.30.31-alpha.tar /app +ADD build/distributions/${APPLICATION}-0.30.31-alpha.tar /app # wait for upstream dependencies to become available before starting server ENTRYPOINT ["/bin/bash", "-c", "${APPLICATION}-0.30.31-alpha/bin/${APPLICATION}"] diff --git a/airbyte-workers/build.gradle b/airbyte-workers/build.gradle index f461116ce2d7..b1a2f9a38afd 100644 --- a/airbyte-workers/build.gradle +++ b/airbyte-workers/build.gradle @@ -62,17 +62,3 @@ application { mainClass = mainClassName applicationDefaultJvmArgs = ['-XX:MaxRAMPercentage=75.0'] } - -task copyGeneratedTar(type: Copy) { - dependsOn copyDocker - dependsOn distTar - - from('build/distributions') { - include 'airbyte-workers-*.tar' - } - into 'build/docker/bin' -} - -Task dockerBuildTask = getDockerBuildTask("worker", "$project.projectDir") -dockerBuildTask.dependsOn(copyGeneratedTar) -assemble.dependsOn(dockerBuildTask) diff --git a/build.gradle b/build.gradle index 03433bf46f52..e45384dd0a55 100644 --- a/build.gradle +++ b/build.gradle @@ -1,16 +1,3 @@ -import com.bmuschko.gradle.docker.tasks.image.DockerBuildImage - -buildscript { - repositories { - maven { - url "https://plugins.gradle.org/m2/" - } - } - dependencies { - classpath 'com.bmuschko:gradle-docker-plugin:7.1.0' - } -} - plugins { id 'base' id 'pmd' @@ -146,19 +133,26 @@ def Task getDockerBuildTask(String artifactName, String projectDir) { } allprojects { - apply plugin: 'com.bmuschko.docker-remote-api' - - task copyDocker(type: Copy) { - delete "build/docker" + apply plugin: 'base' - from "${project.projectDir}/Dockerfile" - into "build/docker/" + afterEvaluate { project -> + def composeDeps = [ + ":airbyte-config:init", + ":airbyte-db:lib", + ":airbyte-migration", + ":airbyte-scheduler:app", + ":airbyte-workers", + ":airbyte-server", + ":airbyte-webapp", + ].toSet().asImmutable() + + if (project.getPath() in composeDeps) { + composeBuild.dependsOn(project.getPath() + ':assemble') + } } } allprojects { - apply plugin: 'base' - // by default gradle uses directory as the project name. That works very well in a single project environment but // projects clobber each other in an environments with subprojects when projects are in directories named identically. def sub = rootDir.relativePath(projectDir.parentFile).replace('/', '.') @@ -260,7 +254,6 @@ subprojects { testImplementation 'org.junit.jupiter:junit-jupiter-params:5.7.2' testImplementation 'org.mockito:mockito-junit-jupiter:3.12.4' testImplementation 'org.assertj:assertj-core:3.21.0' - } tasks.withType(Tar) { @@ -272,6 +265,28 @@ subprojects { } } +task composeBuild { + def buildTag = System.getenv('VERSION') ?: 'dev' + def buildPlatform = System.getenv('DOCKER_BUILD_PLATFORM') ?: 'linux/amd64' + def buildArch = System.getenv('DOCKER_BUILD_ARCH') ?: 'amd64' + def jdkVersion = System.getenv('JDK_VERSION') ?: '14.0.2' + def dockerComposeFile = buildArch == 'arm64' ? 'docker-compose.build-m1.yaml' : 'docker-compose.build.yaml' + doFirst { + exec { + workingDir rootDir + commandLine 'docker-compose', '-f', dockerComposeFile, 'build', '--parallel', '--quiet' + environment 'VERSION', buildTag + environment 'DOCKER_BUILD_PLATFORM', buildPlatform + environment 'DOCKER_BUILD_ARCH', buildArch + environment 'JDK_VERSION', jdkVersion + } + } +} + +if (!System.getenv().containsKey("SUB_BUILD") || System.getenv().get("SUB_BUILD") == "PLATFORM") { + build.dependsOn(composeBuild) +} + task('generate') { dependsOn subprojects.collect { it.getTasksByName('generateProtocolClassFiles', true) } dependsOn subprojects.collect { it.getTasksByName('generateJsonSchema2Pojo', true) } diff --git a/docs/SUMMARY.md b/docs/SUMMARY.md index 9ad3de71305a..f3f371e43201 100644 --- a/docs/SUMMARY.md +++ b/docs/SUMMARY.md @@ -199,7 +199,6 @@ * [Contributing to Airbyte](contributing-to-airbyte/README.md) * [Code of Conduct](contributing-to-airbyte/code-of-conduct.md) * [Developing Locally](contributing-to-airbyte/developing-locally.md) - * [Developing on Docker](contributing-to-airbyte/developing-on-docker.md) * [Developing on Kubernetes](contributing-to-airbyte/developing-on-kubernetes.md) * [Monorepo Python Development](contributing-to-airbyte/monorepo-python-development.md) * [Code Style](contributing-to-airbyte/code-style.md) diff --git a/docs/contributing-to-airbyte/developing-on-docker.md b/docs/contributing-to-airbyte/developing-on-docker.md deleted file mode 100644 index 34f225c8b017..000000000000 --- a/docs/contributing-to-airbyte/developing-on-docker.md +++ /dev/null @@ -1,43 +0,0 @@ -# Developing on docker - -## Incrementality - -The docker build is fully incremental for the platform build, which means that it will only build an image if it is needed. We need to keep it that -way. -A task generator, `getDockerBuildTask`, is available for building a docker image for any given module. Behind the scene, it will generate a -task which will run the build of a docker image in a specific folder. The goal is to make sure that we have an isolated -context which helps with incrementality. All files that need to be present in the docker image will need to be copy into this folder. The generate -method takes 2 arguments: -- The image name, for example if `foo` is given as an image name, the image `airbyte/foo` will be created -- The project directory folder. It is needed because the `getDockerBuildTask` is declared in the rootProject - -## Adding a new docker build - -Once you have a `Dockerfile`, generating the docker image is done in the following way: -- specify the artifact name and the project directory, -- make sure that the Dockerfile is properly copied to the docker context dir before building the image -- make the build docker task to depend on the `assemble` task. - -For example: -```groovy -Task dockerBuildTask = getDockerBuildTask("cli", project.projectDir) -dockerBuildTask.dependsOn(copyDocker) -assemble.dependsOn(dockerBuildTask) -``` - -If you need to add files in your image you need to copy them in `build/docker/bin` first. The need to happen after the `copyDocker` task. -The `copyDocker` task clean up the `build/docker` folder as a first step. - -For example: -```groovy -task copyScripts(type: Copy) { - dependsOn copyDocker - - from('scripts') - into 'build/docker/bin/scripts' -} - -Task dockerBuildTask = getDockerBuildTask("init", project.projectDir) -dockerBuildTask.dependsOn(copyScripts) -assemble.dependsOn(dockerBuildTask) -``` diff --git a/docs/project-overview/changelog/README.md b/docs/project-overview/changelog/README.md index 6729332c0004..86c8266c239b 100644 --- a/docs/project-overview/changelog/README.md +++ b/docs/project-overview/changelog/README.md @@ -257,8 +257,7 @@ Airbyte is comprised of 2 parts: The "production" version of Airbyte is the version of the app specified in `.env`. With each production release, we update the version in the `.env` file. This version will always be available for download on DockerHub. It is the version of the app that runs when a user runs `docker-compose up`. -The "development" version of Airbyte is the head of master branch. It is the version of the app that runs when a user runs `./gradlew build && -VERSION=dev docker compose up`. +The "development" version of Airbyte is the head of master branch. It is the version of the app that runs when a user runs `./gradlew composeBuild && VERSION=dev docker compose up`. ### Production Release Schedule diff --git a/tools/bin/gke-kube-acceptance-test/acceptance_test_kube_gke.sh b/tools/bin/gke-kube-acceptance-test/acceptance_test_kube_gke.sh index 85ee8e4c517b..f796e94bb5fa 100755 --- a/tools/bin/gke-kube-acceptance-test/acceptance_test_kube_gke.sh +++ b/tools/bin/gke-kube-acceptance-test/acceptance_test_kube_gke.sh @@ -14,7 +14,7 @@ TAG=$(openssl rand -hex 12) echo "Tag" $TAG docker login -u airbytebot -p $DOCKER_PASSWORD -VERSION=$TAG ./gradlew build +VERSION=$TAG ./gradlew composeBuild VERSION=$TAG docker-compose -f docker-compose.build.yaml push # For running on Mac diff --git a/tools/bin/release_version.sh b/tools/bin/release_version.sh index 1ae49cddacc1..5cc3d245fcd1 100755 --- a/tools/bin/release_version.sh +++ b/tools/bin/release_version.sh @@ -38,7 +38,7 @@ GIT_REVISION=$(git rev-parse HEAD) echo "Bumped version from ${PREV_VERSION} to ${NEW_VERSION}" echo "Building and publishing version $NEW_VERSION for git revision $GIT_REVISION..." -SUB_BUILD=PLATFORM ./gradlew clean build +SUB_BUILD=PLATFORM ./gradlew clean composeBuild SUB_BUILD=PLATFORM ./gradlew publish VERSION=$NEW_VERSION GIT_REVISION=$GIT_REVISION docker-compose -f docker-compose.build.yaml build VERSION=$NEW_VERSION GIT_REVISION=$GIT_REVISION docker-compose -f docker-compose.build.yaml push