-
Notifications
You must be signed in to change notification settings - Fork 20
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add support for running tests with docker-compose #300
Changes from 5 commits
a080ca8
44e3dcb
40e996e
3a19ef9
9e339fd
9cfc4ad
e5fff3e
d8a3f52
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,16 @@ | ||
name: MySQL 8.0 Build and Run /w docker-compose | ||
on: | ||
push: | ||
branches: [ main ] | ||
pull_request: | ||
branches: [ main ] | ||
jobs: | ||
build: | ||
runs-on: ubuntu-latest | ||
steps: | ||
- name: Checkout code | ||
uses: actions/checkout@v4 | ||
|
||
- name: Build and Run Spirit | ||
run: docker compose up mysql buildandrun --abort-on-container-exit | ||
working-directory: compose |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,16 @@ | ||
name: MySQL 8.0.33 (with replicas) /w docker-compose | ||
on: | ||
push: | ||
branches: [ main ] | ||
pull_request: | ||
branches: [ main ] | ||
jobs: | ||
build: | ||
runs-on: ubuntu-latest | ||
steps: | ||
- name: Checkout code | ||
uses: actions/checkout@v4 | ||
|
||
- name: Test | ||
run: docker compose -f compose.yml up mysql mysql_replica test --abort-on-container-exit | ||
working-directory: compose/replication |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,16 @@ | ||
name: MySQL 8.0.28 (Aurora version) /w docker-compose | ||
on: | ||
push: | ||
branches: [ main ] | ||
pull_request: | ||
branches: [ main ] | ||
jobs: | ||
build: | ||
runs-on: ubuntu-latest | ||
steps: | ||
- name: Checkout code | ||
uses: actions/checkout@v4 | ||
|
||
- name: Test | ||
run: docker compose -f compose.yml -f 8.0.28.yml up mysql test --abort-on-container-exit | ||
working-directory: compose |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,16 @@ | ||
name: MySQL 8.4 GA /w docker-compose | ||
on: | ||
push: | ||
branches: [ main ] | ||
pull_request: | ||
branches: [ main ] | ||
jobs: | ||
build: | ||
runs-on: ubuntu-latest | ||
steps: | ||
- name: Checkout code | ||
uses: actions/checkout@v4 | ||
|
||
- name: Test | ||
run: docker compose -f compose.yml -f 8.4.yml up mysql mysql_replica test --abort-on-container-exit | ||
working-directory: compose/replication |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,16 @@ | ||
name: MySQL 8.0.33 (RBR minimal) /w docker-compose | ||
on: | ||
push: | ||
branches: [ main ] | ||
pull_request: | ||
branches: [ main ] | ||
jobs: | ||
build: | ||
runs-on: ubuntu-latest | ||
steps: | ||
- name: Checkout code | ||
uses: actions/checkout@v4 | ||
|
||
- name: Test | ||
run: docker compose -f compose.yml -f 8.0.33-rbr-minimal.yml up mysql test --abort-on-container-exit | ||
working-directory: compose |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,6 @@ | ||
FROM golang:1.21 | ||
|
||
WORKDIR /app | ||
COPY ../go.mod go.sum ./ | ||
RUN go mod download | ||
COPY .. . |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
services: | ||
mysql: | ||
image: mysql:8.0.28 | ||
platform: linux/amd64 | ||
ports: [ '8028:3306' ] |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
services: | ||
mysql: | ||
image: mysql:8.0.33 | ||
ports: [ '8033:3306' ] | ||
command: --binlog-row-image=MINIMAL |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,37 @@ | ||
use mysql; | ||
|
||
create role if not exists R_MIGRATOR; | ||
grant alter, create, delete, drop, index, insert, lock tables, select, trigger, update on *.* to R_MIGRATOR; | ||
create role if not exists R_REPLICATION; | ||
grant REPLICATION SLAVE, REPLICATION CLIENT on *.* to R_REPLICATION; | ||
create role if not exists R_THROTTLER; | ||
grant SELECT on performance_schema.replication_applier_status_by_worker to R_THROTTLER; | ||
grant SELECT on performance_schema.replication_connection_status to R_THROTTLER; | ||
|
||
create user if not exists msandbox@'%' identified with caching_sha2_password by 'msandbox'; | ||
grant R_MIGRATOR, R_REPLICATION to msandbox@'%' ; | ||
set default role R_MIGRATOR, R_REPLICATION to msandbox@'%'; | ||
|
||
create user if not exists rsandbox@'%' identified with caching_sha2_password by 'rsandbox'; | ||
grant R_REPLICATION, R_THROTTLER to rsandbox@'%'; | ||
set default role R_REPLICATION, R_THROTTLER to rsandbox@'%'; | ||
|
||
-- unfortunately the password for tsandbox must be the same as the password for root because in tests we switch to root | ||
-- using the same password. | ||
create user if not exists tsandbox@'%' identified with caching_sha2_password by 'msandbox'; | ||
grant R_MIGRATOR, R_REPLICATION to tsandbox@'%' ; | ||
grant references, super, process on *.* to tsandbox@'%'; -- used in tests | ||
set default role R_MIGRATOR, R_REPLICATION to tsandbox@'%'; | ||
|
||
flush privileges; | ||
|
||
create database if not exists test; | ||
|
||
use test; | ||
|
||
create table t1 | ||
( | ||
id int not null primary key auto_increment, | ||
b int not null, | ||
c int not null | ||
); |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,46 @@ | ||
services: | ||
mysql: | ||
image: mysql:8.0.33 | ||
ports: [ '8033:3306' ] | ||
# to supress mbind: Operation not permitted in CI | ||
# https://stackoverflow.com/a/55706057 | ||
cap_add: | ||
- SYS_NICE | ||
environment: | ||
MYSQL_ROOT_PASSWORD: msandbox | ||
healthcheck: | ||
test: mysqladmin ping -h 127.0.0.1 -u root --password=$$MYSQL_ROOT_PASSWORD | ||
start_period: 1s | ||
interval: 1s | ||
timeout: 2s | ||
retries: 60 | ||
volumes: | ||
- mysql-standalone-data-dir:/var/lib/mysql | ||
- ./bootstrap.sql:/docker-entrypoint-initdb.d/bootstrap.sql | ||
|
||
test: | ||
build: | ||
context: ../ | ||
command: go test -race -v ./... | ||
depends_on: | ||
mysql: | ||
condition: service_healthy | ||
environment: | ||
MYSQL_DSN: tsandbox:msandbox@tcp(mysql)/test | ||
|
||
buildandrun: | ||
build: | ||
context: ../ | ||
command: scripts/buildandrun.sh | ||
depends_on: | ||
mysql: | ||
condition: service_healthy | ||
environment: | ||
HOST: mysql:3306 | ||
USERNAME: msandbox | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. We run |
||
PASSWORD: msandbox | ||
DATABASE: test | ||
TABLE: t1 | ||
|
||
volumes: | ||
mysql-standalone-data-dir: |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,9 @@ | ||
services: | ||
mysql: | ||
image: mysql:8.0.28 | ||
platform: linux/amd64 | ||
ports: [ '8028:3306' ] | ||
mysql_replica: | ||
image: mysql:8.0.28 | ||
platform: linux/amd64 | ||
ports: [ '8128:3306' ] |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,8 @@ | ||
services: | ||
mysql: | ||
image: mysql:8.0.33 | ||
ports: [ '8033:3306' ] | ||
command: --binlog-row-image=MINIMAL --server-id=1 --log-bin=mysql-bin --gtid-mode=on --enforce-gtid-consistency=on | ||
mysql_replica: | ||
image: mysql:8.0.33 | ||
ports: [ '8133:3306' ] |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
services: | ||
mysql: | ||
image: mysql:8.4 | ||
ports: [ '8040:3306' ] | ||
mysql_replica: | ||
image: mysql:8.4 | ||
ports: [ '8141:3306' ] |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
change replication source to source_host='mysql',source_user='rsandbox',source_password='rsandbox',source_auto_position=1,get_source_public_key=1; |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,77 @@ | ||
services: | ||
mysql: | ||
image: mysql:8.0.33 | ||
ports: [ '8033:3306' ] | ||
# to supress mbind: Operation not permitted in CI | ||
# https://stackoverflow.com/a/55706057 | ||
cap_add: | ||
- SYS_NICE | ||
environment: | ||
MYSQL_ROOT_PASSWORD: msandbox | ||
healthcheck: | ||
test: mysqladmin ping -h 127.0.0.1 -u root --password=$$MYSQL_ROOT_PASSWORD | ||
start_period: 1s | ||
interval: 1s | ||
timeout: 2s | ||
retries: 60 | ||
volumes: | ||
- mysql-data-dir:/var/lib/mysql | ||
- ../bootstrap.sql:/docker-entrypoint-initdb.d/bootstrap.sql | ||
command: --server-id=1 --log-bin=mysql-bin --gtid-mode=on --enforce-gtid-consistency=on | ||
|
||
mysql_replica: | ||
image: mysql:8.0.33 | ||
ports: [ '8133:3306' ] | ||
# to supress mbind: Operation not permitted in CI | ||
# https://stackoverflow.com/a/55706057 | ||
cap_add: | ||
- SYS_NICE | ||
environment: | ||
MYSQL_ROOT_PASSWORD: msandbox | ||
healthcheck: | ||
test: ["CMD", "./replication_health_check.sh"] | ||
start_period: 1s | ||
interval: 1s | ||
timeout: 2s | ||
retries: 60 | ||
volumes: | ||
- mysql-replica-data-dir:/var/lib/mysql | ||
- ./bootstrap_replica.sql:/docker-entrypoint-initdb.d/bootstrap_replica.sql | ||
- ./replication_health_check.sh:/replication_health_check.sh | ||
command: --server-id=2 --relay-log=mysql-relay-bin --gtid-mode=on --enforce-gtid-consistency=on | ||
depends_on: | ||
mysql: | ||
condition: service_healthy | ||
test: | ||
build: | ||
context: ../../. | ||
command: go test -race -v ./... | ||
depends_on: | ||
mysql: | ||
condition: service_healthy | ||
mysql_replica: | ||
condition: service_healthy | ||
environment: | ||
MYSQL_DSN: tsandbox:msandbox@tcp(mysql)/test | ||
REPLICA_DSN: rsandbox:rsandbox@tcp(mysql_replica)/ | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Must leave the database name in |
||
|
||
buildandrun: | ||
build: | ||
context: ../../. | ||
command: scripts/buildandrun.sh | ||
depends_on: | ||
mysql: | ||
condition: service_healthy | ||
mysql_replica: | ||
condition: service_healthy | ||
environment: | ||
HOST: mysql:3306 | ||
USERNAME: msandbox | ||
PASSWORD: msandbox | ||
DATABASE: test | ||
TABLE: t1 | ||
REPLICA_DSN: rsandbox:rsandbox@tcp(mysql_replica)/ | ||
|
||
volumes: | ||
mysql-data-dir: | ||
mysql-replica-data-dir: |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,19 @@ | ||
#!/usr/bin/env bash | ||
set -euxo pipefail | ||
|
||
replica_status=$(mysql -hmysql_replica -uroot -p"$MYSQL_ROOT_PASSWORD" -e "show replica status\G") | ||
|
||
if ! echo "$replica_status" | grep -q 'Replica_IO_Running: Yes'; then | ||
echo "replica IO not running..." | ||
exit 1 | ||
fi | ||
|
||
if ! echo "$replica_status" | grep -q 'Replica_SQL_Running: Yes'; then | ||
echo "replica SQL not running..." | ||
exit 1 | ||
fi | ||
|
||
if ! echo "$replica_status" | grep -q 'Seconds_Behind_Source: 0'; then | ||
echo "unexpected replication lag..." | ||
exit 1 | ||
fi |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
#!/usr/bin/env sh | ||
set -e | ||
|
||
go build ./cmd/spirit | ||
|
||
if [ -n "$REPLICA_DSN" ]; then | ||
./spirit --replica-dsn "$REPLICA_DSN" --host $HOST --username $USERNAME --password $PASSWORD --database=$DATABASE --table=$TABLE | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Can we consider supporting There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I'd prefer not having spirit behave specially in the presence of bizarre environment variables when we have command-line options that do the job just fine. |
||
else | ||
./spirit --replica-dsn "$REPLICA_DSN" --host $HOST --username $USERNAME --password $PASSWORD --database=$DATABASE --table=$TABLE | ||
fi |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Must create this user with these additional privilege because they're used in tests.Still should be much better than using
root
or the earliermsandbox
which was effectively root.