-
Notifications
You must be signed in to change notification settings - Fork 2.1k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
CI upgrade/downgrade tests for Online DDL / throttler / vreplication …
…flow (#16017) Signed-off-by: Shlomi Noach <2607934+shlomi-noach@users.noreply.github.com> Co-authored-by: Florent Poinsard <35779988+frouioui@users.noreply.github.com>
- Loading branch information
1 parent
0a905e1
commit 2df3545
Showing
4 changed files
with
940 additions
and
0 deletions.
There are no files selected for viewing
258 changes: 258 additions & 0 deletions
258
.github/workflows/upgrade_downgrade_test_onlineddl_flow.yml
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,258 @@ | ||
name: Online DDL flow - Upgrade Downgrade Testing | ||
on: | ||
push: | ||
pull_request: | ||
|
||
concurrency: | ||
group: format('{0}-{1}', ${{ github.ref }}, 'Upgrade Downgrade Testing Online DDL flow') | ||
cancel-in-progress: true | ||
|
||
permissions: read-all | ||
|
||
# This test ensures that our Online DDL + VReplication + throttler components | ||
# work using primary and replica vttablets built on different versions. | ||
|
||
jobs: | ||
|
||
upgrade_downgrade_test: | ||
name: Run Upgrade Downgrade Test - Online DDL flow | ||
runs-on: gh-hosted-runners-16cores-1 | ||
|
||
steps: | ||
- name: Skip CI | ||
run: | | ||
if [[ "${{contains( github.event.pull_request.labels.*.name, 'Skip CI')}}" == "true" ]]; then | ||
echo "skipping CI due to the 'Skip CI' label" | ||
exit 1 | ||
fi | ||
- name: Check if workflow needs to be skipped | ||
id: skip-workflow | ||
run: | | ||
skip='false' | ||
if [[ "${{github.event.pull_request}}" == "" ]] && [[ "${{github.ref}}" != "refs/heads/main" ]] && [[ ! "${{github.ref}}" =~ ^refs/heads/release-[0-9]+\.[0-9]$ ]] && [[ ! "${{github.ref}}" =~ "refs/tags/.*" ]]; then | ||
skip='true' | ||
fi | ||
echo Skip ${skip} | ||
echo "skip-workflow=${skip}" >> $GITHUB_OUTPUT | ||
- name: Check out commit's code | ||
if: steps.skip-workflow.outputs.skip-workflow == 'false' | ||
uses: actions/checkout@v4 | ||
with: | ||
fetch-depth: 0 | ||
|
||
- name: Check for changes in relevant files | ||
if: steps.skip-workflow.outputs.skip-workflow == 'false' | ||
uses: dorny/paths-filter@v3.0.1 | ||
id: changes | ||
with: | ||
token: '' | ||
filters: | | ||
end_to_end: | ||
- 'go/**' | ||
- 'go/**/*.go' | ||
- 'test.go' | ||
- 'Makefile' | ||
- 'build.env' | ||
- 'go.sum' | ||
- 'go.mod' | ||
- 'proto/*.proto' | ||
- 'tools/**' | ||
- 'config/**' | ||
- 'bootstrap.sh' | ||
- '.github/workflows/upgrade_downgrade_test_onlineddl_flow.yml' | ||
- name: Set output with latest release branch | ||
id: output-previous-release-ref | ||
if: steps.skip-workflow.outputs.skip-workflow == 'false' | ||
run: | | ||
previous_release_ref=$(./tools/get_previous_release.sh ${{github.base_ref}} ${{github.ref}}) | ||
echo $previous_release_ref | ||
echo "previous_release_ref=${previous_release_ref}" >> $GITHUB_OUTPUT | ||
- name: Set output with next release branch | ||
if: steps.skip-workflow.outputs.skip-workflow == 'false' | ||
id: output-next-release-ref | ||
run: | | ||
next_release_ref=$(./tools/get_next_release.sh ${{github.base_ref}} ${{github.ref}}) | ||
echo $next_release_ref | ||
echo "next_release_ref=${next_release_ref}" >> $GITHUB_OUTPUT | ||
- name: Set up Go | ||
if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' | ||
uses: actions/setup-go@v5 | ||
with: | ||
go-version: 1.22.3 | ||
|
||
- name: Set up python | ||
if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' | ||
uses: actions/setup-python@v5 | ||
|
||
- name: Tune the OS | ||
if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' | ||
run: | | ||
sudo sysctl -w net.ipv4.ip_local_port_range="22768 65535" | ||
- name: Get base dependencies | ||
if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' | ||
run: | | ||
sudo DEBIAN_FRONTEND="noninteractive" apt-get update | ||
# Uninstall any previously installed MySQL first | ||
sudo systemctl stop apparmor | ||
sudo DEBIAN_FRONTEND="noninteractive" apt-get remove -y --purge mysql-server mysql-client mysql-common | ||
sudo apt-get -y autoremove | ||
sudo apt-get -y autoclean | ||
sudo deluser mysql | ||
sudo rm -rf /var/lib/mysql | ||
sudo rm -rf /etc/mysql | ||
# Install mysql80 | ||
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys A8D3785C | ||
wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.29-1_all.deb | ||
echo mysql-apt-config mysql-apt-config/select-server select mysql-8.0 | sudo debconf-set-selections | ||
sudo DEBIAN_FRONTEND="noninteractive" dpkg -i mysql-apt-config* | ||
sudo apt-get update | ||
sudo DEBIAN_FRONTEND="noninteractive" apt-get install -y mysql-server mysql-client | ||
# Install everything else we need, and configure | ||
sudo apt-get install -y make unzip g++ etcd curl git wget eatmydata | ||
sudo service mysql stop | ||
sudo service etcd stop | ||
sudo bash -c "echo '/usr/sbin/mysqld { }' > /etc/apparmor.d/usr.sbin.mysqld" # https://bugs.launchpad.net/ubuntu/+source/mariadb-10.1/+bug/1806263 | ||
sudo ln -s /etc/apparmor.d/usr.sbin.mysqld /etc/apparmor.d/disable/ | ||
sudo apparmor_parser -R /etc/apparmor.d/usr.sbin.mysqld || echo "could not remove mysqld profile" | ||
# install JUnit report formatter | ||
go install github.com/vitessio/go-junit-report@HEAD | ||
wget https://repo.percona.com/apt/percona-release_latest.$(lsb_release -sc)_all.deb | ||
sudo apt-get install -y gnupg2 | ||
sudo dpkg -i percona-release_latest.$(lsb_release -sc)_all.deb | ||
sudo apt-get update | ||
sudo apt-get install -y percona-xtrabackup-24 | ||
# Checkout to the last release of Vitess | ||
- name: Check out last version's code (${{ steps.output-previous-release-ref.outputs.previous_release_ref }}) | ||
if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' | ||
uses: actions/checkout@v4 | ||
with: | ||
ref: ${{ steps.output-previous-release-ref.outputs.previous_release_ref }} | ||
|
||
- name: Get dependencies for the last release | ||
if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' | ||
run: | | ||
go mod download | ||
- name: Building last release's binaries | ||
if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' | ||
timeout-minutes: 10 | ||
run: | | ||
source build.env | ||
make build | ||
mkdir -p /tmp/vitess-build-last/ | ||
cp -R bin /tmp/vitess-build-last/ | ||
rm -Rf bin/* | ||
# Checkout to the next release of Vitess | ||
- name: Check out next version's code (${{ steps.output-next-release-ref.outputs.next_release_ref }}) | ||
if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' | ||
uses: actions/checkout@v4 | ||
with: | ||
ref: ${{ steps.output-next-release-ref.outputs.next_release_ref }} | ||
|
||
- name: Get dependencies for the next release | ||
if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' | ||
run: | | ||
go mod download | ||
- name: Building next release's binaries | ||
if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' | ||
timeout-minutes: 10 | ||
run: | | ||
source build.env | ||
NOVTADMINBUILD=1 make build | ||
mkdir -p /tmp/vitess-build-next/ | ||
cp -R bin /tmp/vitess-build-next/ | ||
rm -Rf bin/* | ||
# Checkout to this build's commit | ||
- name: Check out commit's code | ||
if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' | ||
uses: actions/checkout@v4 | ||
|
||
- name: Get dependencies for this commit | ||
if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' | ||
run: | | ||
go mod download | ||
- name: Building the binaries for this commit | ||
if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' | ||
timeout-minutes: 10 | ||
run: | | ||
source build.env | ||
make build | ||
mkdir -p /tmp/vitess-build-current/ | ||
cp -R bin /tmp/vitess-build-current/ | ||
# Copy vttablet and related binaries under new names | ||
- name: Use current version Vtctl, and other version VTTablet | ||
if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' | ||
run: | | ||
source build.env | ||
cp /tmp/vitess-build-last/bin/vttablet $PWD/bin/vttablet-last | ||
cp /tmp/vitess-build-last/bin/mysqlctl $PWD/bin/mysqlctl-last | ||
cp /tmp/vitess-build-last/bin/mysqlctld $PWD/bin/mysqlctld-last | ||
cp /tmp/vitess-build-next/bin/vttablet $PWD/bin/vttablet-next | ||
cp /tmp/vitess-build-next/bin/mysqlctl $PWD/bin/mysqlctl-next | ||
cp /tmp/vitess-build-next/bin/mysqlctld $PWD/bin/mysqlctld-next | ||
$PWD/bin/vttablet-last --version | ||
$PWD/bin/vttablet --version | ||
$PWD/bin/vttablet-next --version | ||
# Running a test with primary tablet at version n (current SHA) and replica vttablet at version n-1 | ||
- name: Run Online DDL tests (primary=N, replica=N-1) | ||
if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' | ||
run: | | ||
rm -rf /tmp/vtdataroot | ||
mkdir -p /tmp/vtdataroot | ||
source build.env | ||
export PRIMARY_TABLET_BINARY_SUFFIX="" | ||
export REPLICA_TABLET_BINARY_SUFFIX="-last" | ||
eatmydata -- go run test.go -skip-build -keep-data=false -docker=false -print-log -follow -tag upgrade_downgrade_onlineddl_flow | ||
# Running a test with primary tablet at version n-1 and replica vttablet at version n (current SHA) | ||
- name: Run Online DDL tests (primary=N-1, replica=N) | ||
if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' | ||
run: | | ||
rm -rf /tmp/vtdataroot | ||
mkdir -p /tmp/vtdataroot | ||
source build.env | ||
export PRIMARY_TABLET_BINARY_SUFFIX="-last" | ||
export REPLICA_TABLET_BINARY_SUFFIX="" | ||
eatmydata -- go run test.go -skip-build -keep-data=false -docker=false -print-log -follow -tag upgrade_downgrade_onlineddl_flow | ||
# Running a test with primary tablet at version n+1 and replica vttablet at version n (current SHA) | ||
- name: Run Online DDL tests (primary=N+1, replica=N) | ||
if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' | ||
run: | | ||
rm -rf /tmp/vtdataroot | ||
mkdir -p /tmp/vtdataroot | ||
source build.env | ||
export PRIMARY_TABLET_BINARY_SUFFIX="-next" | ||
export REPLICA_TABLET_BINARY_SUFFIX="" | ||
eatmydata -- go run test.go -skip-build -keep-data=false -docker=false -print-log -follow -tag upgrade_downgrade_onlineddl_flow | ||
# Running a test with primary tablet at version n (current SHA) and replica vttablet at version n+1 | ||
- name: Run Online DDL tests (primary=N, replica=N+1) | ||
if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' | ||
run: | | ||
rm -rf /tmp/vtdataroot | ||
mkdir -p /tmp/vtdataroot | ||
source build.env | ||
export PRIMARY_TABLET_BINARY_SUFFIX="" | ||
export REPLICA_TABLET_BINARY_SUFFIX="-next" | ||
eatmydata -- go run test.go -skip-build -keep-data=false -docker=false -print-log -follow -tag upgrade_downgrade_onlineddl_flow |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.