integration: re-add docker-compose.yml

overloading the outer docker-compose.yml for both dev and test started
to feel more confusing than just keeping them separate.

namely, it's impossible to un-set 'build:' in an override file, so I
split that out into a docker-compose.override.yml file, symlinked under
hack/overrides/ to keep ./hack/dc working, but then having the tests
*not* use it, even though they use the docker-compose.yml right next to
it, and even though it's normally respected by 'docker-compose'
commands.

Signed-off-by: Alex Suraci <suraci.alex@gmail.com>
This commit is contained in:
Alex Suraci 2021-01-26 22:34:35 -05:00
parent 43d37e27a7
commit d76b5923eb
11 changed files with 151 additions and 94 deletions

1
.gitignore vendored
View File

@ -10,6 +10,7 @@ web/public/elm.min.js
web/public/bundle.js
web/public/*.bundle.js
web/public/main.css
docker-compose.override.yml
*.coverprofile
*.coverprofile.*
*.test

View File

@ -1 +0,0 @@
./hack/overrides/dev.yml

View File

@ -4,7 +4,7 @@ services:
db:
image: postgres:${POSTGRES_TAG:-latest}
shm_size: 1gb
ports: [5432]
ports: [6543:5432]
environment:
POSTGRES_DB: concourse
POSTGRES_USER: dev
@ -15,8 +15,10 @@ services:
image: concourse/concourse:local
command: web
depends_on: [db]
ports: [8080]
volumes: ["./hack/keys:/concourse-keys"]
ports: [8080:8080]
volumes:
- .:/src
- "./hack/keys:/concourse-keys"
environment:
CONCOURSE_SESSION_SIGNING_KEY: /concourse-keys/session_signing_key
CONCOURSE_TSA_AUTHORIZED_KEYS: /concourse-keys/authorized_worker_keys
@ -40,6 +42,9 @@ services:
command: worker
privileged: true
depends_on: [web]
ports:
- 7777:7777
- 7788:7788
volumes: ["./hack/keys:/concourse-keys"]
stop_signal: SIGUSR2
environment:
@ -49,6 +54,9 @@ services:
CONCOURSE_LOG_LEVEL: debug
CONCOURSE_TSA_HOST: web:2222
CONCOURSE_BIND_IP: 0.0.0.0
CONCOURSE_BAGGAGECLAIM_BIND_IP: 0.0.0.0
# avoid using loopbacks
CONCOURSE_BAGGAGECLAIM_DRIVER: overlay

View File

@ -1,18 +0,0 @@
version: '3'
services:
db:
ports: [6543:5432]
web:
ports: [8080:8080]
volumes:
- .:/src
worker:
ports:
- 7777:7777
- 7788:7788
environment:
CONCOURSE_BIND_IP: 0.0.0.0
CONCOURSE_BAGGAGECLAIM_BIND_IP: 0.0.0.0

View File

@ -3,7 +3,7 @@ version: '3'
services:
web:
volumes:
- ./hack/vault/certs:/vault-certs
- ../hack/vault/certs:/vault-certs
environment:
CONCOURSE_VAULT_URL: https://vault:8200
CONCOURSE_VAULT_AUTH_BACKEND: cert
@ -16,8 +16,8 @@ services:
cap_add: [IPC_LOCK]
ports: [8200]
volumes:
- ./hack/vault/certs:/vault/certs
- ./hack/vault/config:/vault/config
- ../hack/vault/certs:/vault/certs
- ../hack/vault/config:/vault/config
command: server
environment:
# for running the 'vault' CLI

View File

@ -14,7 +14,7 @@ import (
func TestVault(t *testing.T) {
t.Parallel()
dc := dctest.Init(t, "../../docker-compose.yml", "overrides/vault.yml")
dc := dctest.Init(t, "../docker-compose.yml", "overrides/vault.yml")
require.NoError(t, dc.Run("up", "-d"))
vault := vaulttest.Init(t, dc)

View File

@ -0,0 +1,57 @@
version: '3'
services:
db:
image: ${TEST_POSTGRES_IMAGE:-postgres}
shm_size: 1gb
ports: [5432]
environment:
POSTGRES_DB: concourse
POSTGRES_USER: dev
POSTGRES_PASSWORD: dev
web:
image: ${TEST_CONCOURSE_DEV_IMAGE:-concourse/concourse:local}
command: web
depends_on: [db]
ports: [8080]
volumes:
- ..:/src
- ../hack/keys:/concourse-keys
environment:
CONCOURSE_SESSION_SIGNING_KEY: /concourse-keys/session_signing_key
CONCOURSE_TSA_AUTHORIZED_KEYS: /concourse-keys/authorized_worker_keys
CONCOURSE_TSA_HOST_KEY: /concourse-keys/tsa_host_key
CONCOURSE_LOG_LEVEL: debug
CONCOURSE_POSTGRES_HOST: db
CONCOURSE_POSTGRES_USER: dev
CONCOURSE_POSTGRES_PASSWORD: dev
CONCOURSE_POSTGRES_DATABASE: concourse
CONCOURSE_EXTERNAL_URL: http://localhost:8080
CONCOURSE_ADD_LOCAL_USER: test:test,guest:guest
CONCOURSE_MAIN_TEAM_LOCAL_USER: test
CONCOURSE_CLUSTER_NAME: test
CONCOURSE_ENABLE_PIPELINE_INSTANCES: "true"
CONCOURSE_ENABLE_ACROSS_STEP: "true"
worker:
image: ${TEST_CONCOURSE_DEV_IMAGE:-concourse/concourse:local}
command: worker
privileged: true
depends_on: [web]
ports: [7777, 7788]
volumes: ["../hack/keys:/concourse-keys"]
stop_signal: SIGUSR2
environment:
CONCOURSE_TSA_PUBLIC_KEY: /concourse-keys/tsa_host_key.pub
CONCOURSE_TSA_WORKER_PRIVATE_KEY: /concourse-keys/worker_key
CONCOURSE_LOG_LEVEL: debug
CONCOURSE_TSA_HOST: web:2222
# avoid using loopbacks
CONCOURSE_BAGGAGECLAIM_DRIVER: overlay
# work with docker-compose's dns
CONCOURSE_GARDEN_DNS_PROXY_ENABLE: "true"

View File

@ -19,9 +19,11 @@ type Cmd struct {
cmdtest.Cmd
}
func Init(t *testing.T, files ...string) Cmd {
func Init(t *testing.T, composeFile string, overrides ...string) Cmd {
name := filepath.Base(t.Name())
files := append([]string{composeFile}, overrides...)
dc := cmdtest.Cmd{
Path: "docker-compose",
Env: []string{

View File

@ -12,87 +12,41 @@ import (
func TestDowngrade(t *testing.T) {
t.Parallel()
dc := dctest.Init(t, "../../docker-compose.yml")
devDC := dctest.Init(t, "../docker-compose.yml")
t.Run("deploy dev", func(t *testing.T) {
require.NoError(t, dc.Run("up", "-d"))
require.NoError(t, devDC.Run("up", "-d"))
})
fly := flytest.Init(t, dc)
fly := flytest.Init(t, devDC)
setupUpgradeDowngrade(t, fly)
latestDC := dctest.Init(t, "../../docker-compose.yml", "overrides/latest.yml")
latestDC := dctest.Init(t, "../docker-compose.yml", "overrides/latest.yml")
latest, err := latestDC.Output("run", "web", "migrate", "--supported-db-version")
require.NoError(t, err)
latest = strings.TrimRight(latest, "\n")
t.Run("down migrations", func(t *testing.T) {
t.Run("migrate down to latest from clean deploy", func(t *testing.T) {
// just to see what it was before
err := dc.Run("run", "web", "migrate", "--current-db-version")
err := devDC.Run("run", "web", "migrate", "--current-db-version")
require.NoError(t, err)
err = dc.Run("run", "web", "migrate", "--migrate-db-to-version", latest)
latest, err := latestDC.Output("run", "web", "migrate", "--supported-db-version")
require.NoError(t, err)
latest = strings.TrimRight(latest, "\n")
err = devDC.Run("run", "web", "migrate", "--migrate-db-to-version", latest)
require.NoError(t, err)
})
t.Run("downgrade to latest", func(t *testing.T) {
t.Run("deploy latest", func(t *testing.T) {
require.NoError(t, latestDC.Run("up", "-d"))
})
fly = flytest.Init(t, latestDC)
verifyUpgradeDowngrade(t, fly)
t.Run("upgrading after downgrade", func(t *testing.T) {
require.NoError(t, dc.Run("up", "-d"))
t.Run("migrate up to dev and deploy dev", func(t *testing.T) {
require.NoError(t, devDC.Run("up", "-d"))
})
fly = flytest.Init(t, dc)
fly = flytest.Init(t, devDC)
verifyUpgradeDowngrade(t, fly)
}
func setupUpgradeDowngrade(t *testing.T, fly flytest.Cmd) {
t.Run("set up test pipeline", func(t *testing.T) {
err := fly.Run("set-pipeline", "-p", "test", "-c", "pipelines/smoke-pipeline.yml", "-n")
require.NoError(t, err)
err = fly.Run("unpause-pipeline", "-p", "test")
require.NoError(t, err)
err = fly.Run("trigger-job", "-j", "test/say-hello", "-w")
require.NoError(t, err)
})
}
func verifyUpgradeDowngrade(t *testing.T, fly flytest.Cmd) {
t.Run("pipeline and build still exists", func(t *testing.T) {
err := fly.Run("get-pipeline", "-p", "test")
require.NoError(t, err)
out, err := fly.Output("watch", "-j", "test/say-hello")
require.NoError(t, err)
require.Contains(t, out, "Hello, world!")
})
t.Run("can still run pipeline builds", func(t *testing.T) {
err := fly.Run("trigger-job", "-j", "test/say-hello", "-w")
require.NoError(t, err)
})
t.Run("can still run checks", func(t *testing.T) {
err := fly.Run("check-resource", "-r", "test/mockery")
require.NoError(t, err)
})
t.Run("can still reach the internet", func(t *testing.T) {
out, err := fly.Output("trigger-job", "-j", "test/use-the-internet", "-w")
require.NoError(t, err)
require.Contains(t, out, "Example Domain")
})
t.Run("can still run one-off builds", func(t *testing.T) {
out, err := fly.Output("execute", "-c", "tasks/hello.yml")
require.NoError(t, err)
require.Contains(t, out, "hello")
})
}

View File

@ -0,0 +1,54 @@
package ops_test
import (
"testing"
"github.com/concourse/concourse/integration/internal/flytest"
"github.com/stretchr/testify/require"
)
func setupUpgradeDowngrade(t *testing.T, fly flytest.Cmd) {
t.Run("set up test pipeline", func(t *testing.T) {
err := fly.Run("set-pipeline", "-p", "test", "-c", "pipelines/smoke-pipeline.yml", "-n")
require.NoError(t, err)
err = fly.Run("unpause-pipeline", "-p", "test")
require.NoError(t, err)
err = fly.Run("trigger-job", "-j", "test/say-hello", "-w")
require.NoError(t, err)
})
}
func verifyUpgradeDowngrade(t *testing.T, fly flytest.Cmd) {
t.Run("pipeline and build still exists", func(t *testing.T) {
err := fly.Run("get-pipeline", "-p", "test")
require.NoError(t, err)
out, err := fly.Output("watch", "-j", "test/say-hello")
require.NoError(t, err)
require.Contains(t, out, "Hello, world!")
})
t.Run("can still run pipeline builds", func(t *testing.T) {
err := fly.Run("trigger-job", "-j", "test/say-hello", "-w")
require.NoError(t, err)
})
t.Run("can still run checks", func(t *testing.T) {
err := fly.Run("check-resource", "-r", "test/mockery")
require.NoError(t, err)
})
t.Run("can still reach the internet", func(t *testing.T) {
out, err := fly.Output("trigger-job", "-j", "test/use-the-internet", "-w")
require.NoError(t, err)
require.Contains(t, out, "Example Domain")
})
t.Run("can still run one-off builds", func(t *testing.T) {
out, err := fly.Output("execute", "-c", "tasks/hello.yml")
require.NoError(t, err)
require.Contains(t, out, "hello")
})
}

View File

@ -11,21 +11,21 @@ import (
func TestUpgrade(t *testing.T) {
t.Parallel()
dc := dctest.Init(t, "../../docker-compose.yml", "overrides/latest.yml")
latestDC := dctest.Init(t, "../docker-compose.yml", "overrides/latest.yml")
t.Run("deploy latest", func(t *testing.T) {
require.NoError(t, dc.Run("up", "-d"))
require.NoError(t, latestDC.Run("up", "-d"))
})
fly := flytest.Init(t, dc)
fly := flytest.Init(t, latestDC)
setupUpgradeDowngrade(t, fly)
dc = dctest.Init(t)
devDC := dctest.Init(t, "../docker-compose.yml")
t.Run("upgrade to dev", func(t *testing.T) {
require.NoError(t, dc.Run("up", "-d"))
require.NoError(t, devDC.Run("up", "-d"))
})
fly = flytest.Init(t, dc)
fly = flytest.Init(t, devDC)
verifyUpgradeDowngrade(t, fly)
}