Skip to content

Commit

Permalink
Merge pull request #359 from buildkite-plugins/toote_secrets_issue-356
Browse files Browse the repository at this point in the history
Add secrets support
  • Loading branch information
pzeballos authored Nov 16, 2022
2 parents b58a06c + 57a4b01 commit ca2a1d5
Show file tree
Hide file tree
Showing 5 changed files with 92 additions and 35 deletions.
74 changes: 39 additions & 35 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ The following pipeline will run `test.sh` inside a `app` service container using
steps:
- command: test.sh
plugins:
- docker-compose#v4.5.0:
- docker-compose#v4.6.0:
run: app
```
Expand All @@ -28,7 +28,7 @@ through if you need:
steps:
- command: test.sh
plugins:
- docker-compose#v4.5.0:
- docker-compose#v4.6.0:
run: app
config: docker-compose.tests.yml
env:
Expand All @@ -41,7 +41,7 @@ or multiple config files:
steps:
- command: test.sh
plugins:
- docker-compose#v4.5.0:
- docker-compose#v4.6.0:
run: app
config:
- docker-compose.yml
Expand All @@ -56,7 +56,7 @@ env:
steps:
- command: test.sh
plugins:
- docker-compose#v4.5.0:
- docker-compose#v4.6.0:
run: app
```

Expand All @@ -65,7 +65,7 @@ If you want to control how your command is passed to docker-compose, you can use
```yml
steps:
- plugins:
- docker-compose#v4.5.0:
- docker-compose#v4.6.0:
run: app
command: ["custom", "command", "values"]
```
Expand All @@ -79,15 +79,15 @@ steps:
- plugins:
- docker-login#v2.0.1:
username: xyz
- docker-compose#v4.5.0:
- docker-compose#v4.6.0:
build: app
image-repository: index.docker.io/myorg/myrepo
- wait
- command: test.sh
plugins:
- docker-login#v2.0.1:
username: xyz
- docker-compose#v4.5.0:
- docker-compose#v4.6.0:
run: app
```

Expand All @@ -104,7 +104,7 @@ steps:
- command: generate-dist.sh
artifact_paths: "dist/*"
plugins:
- docker-compose#v4.5.0:
- docker-compose#v4.6.0:
run: app
```

Expand All @@ -122,7 +122,7 @@ steps:
- command: generate-dist.sh
artifact_paths: "dist/*"
plugins:
- docker-compose#v4.5.0:
- docker-compose#v4.6.0:
run: app
volumes:
- "./dist:/app/dist"
Expand All @@ -146,7 +146,7 @@ this plugin offers a `environment` block of its own:
steps:
- command: generate-dist.sh
plugins:
- docker-compose#v4.5.0:
- docker-compose#v4.6.0:
run: app
env:
- BUILDKITE_BUILD_NUMBER
Expand All @@ -164,7 +164,7 @@ Alternatively, you can have the plugin add all environment variables defined for
steps:
- command: use-vars.sh
plugins:
- docker-compose#v4.5.0:
- docker-compose#v4.6.0:
run: app
propagate-environment: true
```
Expand All @@ -179,7 +179,7 @@ Alternatively, if you want to set build arguments when pre-building an image, th
steps:
- command: generate-dist.sh
plugins:
- docker-compose#v4.5.0:
- docker-compose#v4.6.0:
build: app
image-repository: index.docker.io/myorg/myrepo
args:
Expand All @@ -196,7 +196,7 @@ If you have multiple steps that use the same service/image (such as steps that r
steps:
- label: ":docker: Build"
plugins:
- docker-compose#v4.5.0:
- docker-compose#v4.6.0:
build: app
image-repository: index.docker.io/myorg/myrepo
Expand All @@ -206,7 +206,7 @@ steps:
command: test.sh
parallelism: 25
plugins:
- docker-compose#v4.5.0:
- docker-compose#v4.6.0:
run: app
```

Expand All @@ -222,7 +222,7 @@ steps:
agents:
queue: docker-builder
plugins:
- docker-compose#v4.5.0:
- docker-compose#v4.6.0:
build:
- app
- tests
Expand All @@ -234,7 +234,7 @@ steps:
command: test.sh
parallelism: 25
plugins:
- docker-compose#v4.5.0:
- docker-compose#v4.6.0:
run: tests
```

Expand All @@ -246,7 +246,7 @@ If you want to push your Docker images ready for deployment, you can use the `pu
steps:
- label: ":docker: Push"
plugins:
- docker-compose#v4.5.0:
- docker-compose#v4.6.0:
push: app
```

Expand All @@ -256,7 +256,7 @@ To push multiple images, you can use a list:
steps:
- label: ":docker: Push"
plugins:
- docker-compose#v4.5.0:
- docker-compose#v4.6.0:
push:
- first-service
- second-service
Expand All @@ -268,7 +268,7 @@ If you want to push to a specific location (that's not defined as the `image` in
steps:
- label: ":docker: Push"
plugins:
- docker-compose#v4.5.0:
- docker-compose#v4.6.0:
push:
- app:index.docker.io/myorg/myrepo/myapp
- app:index.docker.io/myorg/myrepo/myapp:latest
Expand All @@ -282,14 +282,14 @@ A newly spawned agent won't contain any of the docker caches for the first run w
steps:
- label: ":docker: Build an image"
plugins:
- docker-compose#v4.5.0:
- docker-compose#v4.6.0:
build: app
image-repository: index.docker.io/myorg/myrepo
cache-from: app:index.docker.io/myorg/myrepo/myapp:latest
- wait
- label: ":docker: Push to final repository"
plugins:
- docker-compose#v4.5.0:
- docker-compose#v4.6.0:
push:
- app:index.docker.io/myorg/myrepo/myapp
- app:index.docker.io/myorg/myrepo/myapp:latest
Expand All @@ -303,7 +303,7 @@ This plugin allows for the value of `cache-from` to be a string or a list. If it
steps:
- label: ":docker Build an image"
plugins:
- docker-compose#v4.5.0:
- docker-compose#v4.6.0:
build: app
image-repository: index.docker.io/myorg/myrepo
cache-from:
Expand All @@ -312,7 +312,7 @@ steps:
- wait
- label: ":docker: Push to final repository"
plugins:
- docker-compose#v4.5.0:
- docker-compose#v4.6.0:
push:
- app:index.docker.io/myorg/myrepo/myapp
- app:index.docker.io/myorg/myrepo/myapp:my-branch
Expand All @@ -326,7 +326,7 @@ Adding a grouping tag to the end of a cache-from list item allows this plugin to
steps:
- label: ":docker: Build Intermediate Image"
plugins:
- docker-compose#v4.5.0:
- docker-compose#v4.6.0:
build: myservice_intermediate # docker-compose.yml is the same as myservice but has `target: intermediate`
image-name: buildkite-build-${BUILDKITE_BUILD_NUMBER}
image-repository: index.docker.io/myorg/myrepo/myservice_intermediate
Expand All @@ -336,7 +336,7 @@ steps:
- wait
- label: ":docker: Build Final Image"
plugins:
- docker-compose#v4.5.0:
- docker-compose#v4.6.0:
build: myservice
image-name: buildkite-build-${BUILDKITE_BUILD_NUMBER}
image-repository: index.docker.io/myorg/myrepo
Expand Down Expand Up @@ -380,7 +380,7 @@ A basic pipeline similar to the following:
steps:
- label: ":docker: Run & Push"
plugins:
- docker-compose#v4.5.0:
- docker-compose#v4.6.0:
run: myservice
push: myservice
```
Expand All @@ -395,7 +395,7 @@ A basic pipeline similar to the following:
steps:
- label: ":docker: Build & Push"
plugins:
- docker-compose#v4.5.0:
- docker-compose#v4.6.0:
build: myservice
push: myservice
```
Expand Down Expand Up @@ -620,14 +620,6 @@ The default is `on-error`.

If set to `2`, plugin will use `docker compose` to execute commands; otherwise it will default to version `1` using `docker-compose` instead.

## Developing

To run the tests:

```bash
docker-compose run --rm tests bats tests tests/v2
```

### `buildkit` (optional, build only, boolean)

Assuming you have a compatible docker installation and configuration in the agent, activating this option would setup the environment for the `docker-compose build` call to use BuildKit. Note that if you are using `cli-version` 2, you are already using buildkit by default.
Expand All @@ -638,6 +630,18 @@ You may want to also add `BUILDKIT_INLINE_CACHE=1` to your build arguments (`arg

When enabled, it will add the `--ssh` option to the build command. Note that it assumes you have a compatible docker installation and configuration in the agent (meaning you are using BuildKit and it is correctly setup).

### `secrets` (optional, build only, array of strings)

All elements in this array will be passed literally to the `build` command as parameters of the [`--secrets` option](https://docs.docker.com/engine/reference/commandline/buildx_build/#secret). Note that you must have BuildKit enabled for this option to have any effect and special `RUN` stanzas in your Dockerfile to actually make use of them.

## Developing

To run the tests:

```bash
docker-compose run --rm tests bats tests tests/v2
```

## License

MIT (see [LICENSE](LICENSE))
5 changes: 5 additions & 0 deletions commands/build.sh
Original file line number Diff line number Diff line change
Expand Up @@ -157,6 +157,11 @@ if [[ "$(plugin_read_config BUILD_PARALLEL "false")" == "true" ]] ; then
build_params+=(--parallel)
fi

# Parse the list of secrets to pass on to build command
while read -r line ; do
[[ -n "$line" ]] && build_params+=("--secret" "$line")
done <<< "$(plugin_read_list SECRETS)"

if [[ "$(plugin_read_config SSH "false")" == "true" ]] ; then
if [[ "${DOCKER_BUILDKIT:-}" != "1" && "${BUILDKITE_PLUGIN_DOCKER_COMPOSE_CLI_VERSION:-}" != "2" ]]; then
echo "🚨 You can not use the ssh option if you are not using buildkit"
Expand Down
5 changes: 5 additions & 0 deletions plugin.yml
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,10 @@ configuration:
type: boolean
ssh:
type: boolean
secrets:
type: array
items:
type: string
target:
type: string
tty:
Expand Down Expand Up @@ -122,6 +126,7 @@ configuration:
pull: [ run ]
push-retries: [ push ]
skip-pull: [ run ]
secrets: [ buildkit, build ]
ssh: [ buildkit ]
target: [ build ]
tty: [ run ]
Expand Down
21 changes: 21 additions & 0 deletions tests/build.bats
Original file line number Diff line number Diff line change
Expand Up @@ -793,5 +793,26 @@ load '../lib/shared'
assert_output --partial "built myservice"
assert_output --partial "with ssh"

unstub docker-compose
}

@test "Build with secrets" {
export BUILDKITE_BUILD_NUMBER=1
export BUILDKITE_JOB_ID=1111
export BUILDKITE_PIPELINE_SLUG=test

export BUILDKITE_PLUGIN_DOCKER_COMPOSE_BUILD=myservice
export BUILDKITE_PLUGIN_DOCKER_COMPOSE_SECRETS_0='id=test,file=~/.test'
export BUILDKITE_PLUGIN_DOCKER_COMPOSE_SECRETS_1='id=SECRET_VAR'

stub docker-compose \
"-f docker-compose.yml -p buildkite1111 -f docker-compose.buildkite-1-override.yml build --pull --secret \* --secret \* \* : echo built \${13} with secrets \${10} and \${12}"

run "$PWD"/hooks/command

assert_success
assert_output --partial "built myservice"
assert_output --partial "with secrets id=test,file=~/.test and id=SECRET_VAR"

unstub docker-compose
}
22 changes: 22 additions & 0 deletions tests/v2/build.bats
Original file line number Diff line number Diff line change
Expand Up @@ -627,5 +627,27 @@ setup_file() {
assert_output --partial "built myservice"
assert_output --partial "with ssh"

unstub docker
}


@test "Build with secrets" {
export BUILDKITE_BUILD_NUMBER=1
export BUILDKITE_JOB_ID=1111
export BUILDKITE_PIPELINE_SLUG=test

export BUILDKITE_PLUGIN_DOCKER_COMPOSE_BUILD=myservice
export BUILDKITE_PLUGIN_DOCKER_COMPOSE_SECRETS_0='id=test,file=~/.test'
export BUILDKITE_PLUGIN_DOCKER_COMPOSE_SECRETS_1='id=SECRET_VAR'

stub docker \
"compose -f docker-compose.yml -p buildkite1111 -f docker-compose.buildkite-1-override.yml build --pull --secret \* --secret \* \* : echo built \${14} with secrets \${11} and \${13}"

run "$PWD"/hooks/command

assert_success
assert_output --partial "built myservice"
assert_output --partial "with secrets id=test,file=~/.test and id=SECRET_VAR"

unstub docker
}

0 comments on commit ca2a1d5

Please sign in to comment.