diff --git a/README.md b/README.md index 388ebb7f..146362d6 100644 --- a/README.md +++ b/README.md @@ -606,6 +606,18 @@ If set to true, docker compose will remove the primary container after run. Equi The default is `true`. +### `compatibility` (optional, run only) + +If set to true, all docker compose commands will rum with compatibility mode. Equivalent to `--compatibility` in docker-compose. + +The default is `false`. + +Note that [the effect of this option changes depending on your docker compose CLI version](https://docs.docker.com/compose/cli-command-compatibility/#flags-that-will-not-be-implemented): +* in v1 it translates (composefile) v3 deploy keys to their non-swarm (composefile) v2 equivalents +* in v2 it will revert some behaviour to v1 as well, including (but not limited to): + - [Character separator for container names](https://github.com/docker/compose/blob/a0acc20d883ce22b8b0c65786e3bea1328809bbd/cmd/compose/compose.go#L181) + - [Not normalizing compose models (when running `config`)](https://github.com/docker/compose/blob/2e7644ff21f9ca0ea6fb5e8d41d4f6af32cd7e20/cmd/compose/convert.go#L69) + ### `entrypoint` (optional, run only) Sets the `--entrypoint` argument when running `docker-compose`. diff --git a/lib/push.bash b/lib/push.bash index d69ee8fa..1025c974 100644 --- a/lib/push.bash +++ b/lib/push.bash @@ -22,7 +22,7 @@ default_compose_image_for_service() { local service="$1" local separator="_" - if [[ "$(plugin_read_config CLI_VERSION "1")" == "2" ]] ; then + if [[ "$(plugin_read_config CLI_VERSION "1")" == "2" ]] && [[ "$(plugin_read_config COMPATIBILITY "false")" != "true" ]] ; then separator="-" fi diff --git a/lib/shared.bash b/lib/shared.bash index 583cb122..986eaf9a 100644 --- a/lib/shared.bash +++ b/lib/shared.bash @@ -200,6 +200,11 @@ function run_docker_compose() { command+=(--no-ansi) fi + # Enable compatibility mode for v3 files + if [[ "$(plugin_read_config COMPATIBILITY "false")" == "true" ]]; then + command+=(--compatibility) + fi + for file in $(docker_compose_config_files) ; do command+=(-f "$file") done diff --git a/plugin.yml b/plugin.yml index f96af54f..938b958b 100644 --- a/plugin.yml +++ b/plugin.yml @@ -27,6 +27,8 @@ configuration: cache-from: type: [ string, array ] minimum: 1 + compatibility: + type: boolean cli-version: type: string enum: diff --git a/tests/run.bats b/tests/run.bats index 3cd4b623..199660c7 100644 --- a/tests/run.bats +++ b/tests/run.bats @@ -638,6 +638,33 @@ export BUILDKITE_JOB_ID=1111 unstub buildkite-agent } +@test "Run with compatibility mode" { + export BUILDKITE_BUILD_NUMBER=1 + export BUILDKITE_COMMAND=pwd + export BUILDKITE_JOB_ID=1111 + export BUILDKITE_PIPELINE_SLUG=test + + export BUILDKITE_PLUGIN_DOCKER_COMPOSE_RUN=myservice + export BUILDKITE_PLUGIN_DOCKER_COMPOSE_CLEANUP=false + export BUILDKITE_PLUGIN_DOCKER_COMPOSE_COMPATIBILITY=true + + stub docker-compose \ + "--compatibility -f docker-compose.yml -p buildkite1111 -f docker-compose.buildkite-1-override.yml pull myservice : echo pulled myservice" \ + "--compatibility -f docker-compose.yml -p buildkite1111 -f docker-compose.buildkite-1-override.yml up -d --scale myservice=0 myservice : echo started dependencies for myservice" \ + "--compatibility -f docker-compose.yml -p buildkite1111 -f docker-compose.buildkite-1-override.yml run --name buildkite1111_myservice_build_1 --rm myservice /bin/sh -e -c 'pwd' : echo ran myservice with use aliases output" + + stub buildkite-agent \ + "meta-data exists docker-compose-plugin-built-image-tag-myservice : exit 0" \ + "meta-data get docker-compose-plugin-built-image-tag-myservice : echo myimage" + + run "$PWD"/hooks/command + + assert_success + assert_output --partial "ran myservice with use aliases output" + unstub docker-compose + unstub buildkite-agent +} + @test "Run with a volumes option" { export BUILDKITE_JOB_ID=1111 export BUILDKITE_PLUGIN_DOCKER_COMPOSE_RUN=myservice diff --git a/tests/v2/push.bats b/tests/v2/push.bats index d0ef5ae1..f6d109af 100644 --- a/tests/v2/push.bats +++ b/tests/v2/push.bats @@ -96,6 +96,36 @@ setup_file() { unstub buildkite-agent } +@test "Push a prebuilt image with a repository and a tag in compatibility mode" { + export BUILDKITE_BUILD_NUMBER=1 + export BUILDKITE_JOB_ID=1111 + export BUILDKITE_PIPELINE_SLUG=test + + export BUILDKITE_PLUGIN_DOCKER_COMPOSE_PUSH=myservice:my.repository/myservice:llamas + export BUILDKITE_PLUGIN_DOCKER_COMPOSE_COMPATIBILITY=true + + stub docker \ + "compose --compatibility -f docker-compose.yml -p buildkite1111 config : echo blah" \ + "pull myimage : echo pulled prebuilt image" \ + "tag myimage buildkite1111_myservice : echo " \ + "tag buildkite1111_myservice my.repository/myservice:llamas : echo tagged image" \ + "push my.repository/myservice:llamas : echo pushed myservice" + + + stub buildkite-agent \ + "meta-data exists docker-compose-plugin-built-image-tag-myservice : exit 0" \ + "meta-data get docker-compose-plugin-built-image-tag-myservice : echo myimage" + + run $PWD/hooks/command + + assert_success + assert_output --partial "pulled prebuilt image" + assert_output --partial "tagged image" + assert_output --partial "pushed myservice" + unstub docker + unstub buildkite-agent +} + @test "Push a prebuilt image with an invalid tag" { export BUILDKITE_JOB_ID=1111 export BUILDKITE_PLUGIN_DOCKER_COMPOSE_PUSH=myservice:my.repository/myservice:-llamas diff --git a/tests/v2/run.bats b/tests/v2/run.bats index b2349b66..fe85c769 100644 --- a/tests/v2/run.bats +++ b/tests/v2/run.bats @@ -613,6 +613,34 @@ export BUILDKITE_JOB_ID=1111 unstub buildkite-agent } + +@test "Run with compatibility mode" { + export BUILDKITE_BUILD_NUMBER=1 + export BUILDKITE_COMMAND=pwd + export BUILDKITE_JOB_ID=1111 + export BUILDKITE_PIPELINE_SLUG=test + + export BUILDKITE_PLUGIN_DOCKER_COMPOSE_RUN=myservice + export BUILDKITE_PLUGIN_DOCKER_COMPOSE_CLEANUP=false + export BUILDKITE_PLUGIN_DOCKER_COMPOSE_COMPATIBILITY=true + + stub docker \ + "compose --compatibility -f docker-compose.yml -p buildkite1111 -f docker-compose.buildkite-1-override.yml pull myservice : echo pulled myservice" \ + "compose --compatibility -f docker-compose.yml -p buildkite1111 -f docker-compose.buildkite-1-override.yml up -d --scale myservice=0 myservice : echo started dependencies for myservice" \ + "compose --compatibility -f docker-compose.yml -p buildkite1111 -f docker-compose.buildkite-1-override.yml run --name buildkite1111_myservice_build_1 --rm myservice /bin/sh -e -c 'pwd' : echo ran myservice with use aliases output" + + stub buildkite-agent \ + "meta-data exists docker-compose-plugin-built-image-tag-myservice : exit 0" \ + "meta-data get docker-compose-plugin-built-image-tag-myservice : echo myimage" + + run "$PWD"/hooks/command + + assert_success + assert_output --partial "ran myservice with use aliases output" + unstub docker + unstub buildkite-agent +} + @test "Run with a volumes option" { export BUILDKITE_JOB_ID=1111 export BUILDKITE_PLUGIN_DOCKER_COMPOSE_RUN=myservice