vitess.io/vitess@v0.16.2/.github/workflows/upgrade_downgrade_test_backups_manual.yml (about) 1 name: Upgrade Downgrade Testing - Backups - Manual 2 on: 3 push: 4 pull_request: 5 6 concurrency: 7 group: format('{0}-{1}', ${{ github.ref }}, 'Upgrade Downgrade Testing - Backups - Manual') 8 cancel-in-progress: true 9 10 jobs: 11 get_previous_release: 12 if: always() 13 name: Get Previous Release - Backups - Manual 14 runs-on: ubuntu-22.04 15 outputs: 16 previous_release: ${{ steps.output-previous-release-ref.outputs.previous_release_ref }} 17 18 steps: 19 - name: Check out to HEAD 20 uses: actions/checkout@v3 21 with: 22 fetch-depth: 0 23 24 - name: Set output with latest release branch 25 id: output-previous-release-ref 26 run: | 27 previous_release_ref=$(./tools/get_previous_release.sh ${{github.base_ref}} ${{github.ref}}) 28 echo $previous_release_ref 29 echo "previous_release_ref=${previous_release_ref}" >> $GITHUB_OUTPUT 30 31 # This job usually execute in ± 20 minutes 32 upgrade_downgrade_test_manual: 33 timeout-minutes: 40 34 if: always() && (needs.get_previous_release.result == 'success') 35 name: Run Upgrade Downgrade Test - Backups - Manual 36 runs-on: ubuntu-22.04 37 needs: 38 - get_previous_release 39 40 steps: 41 - name: Skip CI 42 run: | 43 if [[ "${{contains( github.event.pull_request.labels.*.name, 'Skip CI')}}" == "true" ]]; then 44 echo "skipping CI due to the 'Skip CI' label" 45 exit 1 46 fi 47 48 - name: Check if workflow needs to be skipped 49 id: skip-workflow 50 run: | 51 skip='false' 52 if [[ "${{github.event.pull_request}}" == "" ]] && [[ "${{github.ref}}" != "refs/heads/main" ]] && [[ ! "${{github.ref}}" =~ ^refs/heads/release-[0-9]+\.[0-9]$ ]] && [[ ! "${{github.ref}}" =~ "refs/tags/.*" ]]; then 53 skip='true' 54 fi 55 echo Skip ${skip} 56 echo "skip-workflow=${skip}" >> $GITHUB_OUTPUT 57 58 # Checkout to this build's commit 59 - name: Checkout to commit's code 60 if: steps.skip-workflow.outputs.skip-workflow == 'false' 61 uses: actions/checkout@v3 62 63 - name: Check for changes in relevant files 64 if: steps.skip-workflow.outputs.skip-workflow == 'false' 65 uses: frouioui/paths-filter@main 66 id: changes 67 with: 68 token: '' 69 filters: | 70 end_to_end: 71 - 'go/**' 72 - 'go/**/*.go' 73 - 'test.go' 74 - 'Makefile' 75 - 'build.env' 76 - 'go.sum' 77 - 'go.mod' 78 - 'proto/*.proto' 79 - 'tools/**' 80 - 'config/**' 81 - 'bootstrap.sh' 82 - '.github/workflows/upgrade_downgrade_test_backups_manual.yml' 83 84 - name: Set up Go 85 if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' 86 uses: actions/setup-go@v3 87 with: 88 go-version: 1.20.3 89 90 - name: Set up python 91 if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' 92 uses: actions/setup-python@v4 93 94 - name: Tune the OS 95 if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' 96 run: | 97 sudo sysctl -w net.ipv4.ip_local_port_range="22768 65535" 98 99 - name: Get base dependencies 100 if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' 101 run: | 102 sudo DEBIAN_FRONTEND="noninteractive" apt-get update 103 # Uninstall any previously installed MySQL first 104 sudo systemctl stop apparmor 105 sudo DEBIAN_FRONTEND="noninteractive" apt-get remove -y --purge mysql-server mysql-client mysql-common 106 sudo apt-get -y autoremove 107 sudo apt-get -y autoclean 108 sudo deluser mysql 109 sudo rm -rf /var/lib/mysql 110 sudo rm -rf /etc/mysql 111 112 # Install MySQL 8.0 113 sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 467B942D3A79BD29 114 wget -c https://dev.mysql.com/get/mysql-apt-config_0.8.24-1_all.deb 115 echo mysql-apt-config mysql-apt-config/select-server select mysql-8.0 | sudo debconf-set-selections 116 sudo DEBIAN_FRONTEND="noninteractive" dpkg -i mysql-apt-config* 117 sudo apt-get update 118 sudo DEBIAN_FRONTEND="noninteractive" apt-get install -y mysql-server mysql-client 119 120 # Install everything else we need, and configure 121 sudo apt-get install -y make unzip g++ etcd curl git wget eatmydata grep 122 sudo service mysql stop 123 sudo service etcd stop 124 sudo bash -c "echo '/usr/sbin/mysqld { }' > /etc/apparmor.d/usr.sbin.mysqld" # https://bugs.launchpad.net/ubuntu/+source/mariadb-10.1/+bug/1806263 125 sudo ln -s /etc/apparmor.d/usr.sbin.mysqld /etc/apparmor.d/disable/ 126 sudo apparmor_parser -R /etc/apparmor.d/usr.sbin.mysqld || echo "could not remove mysqld profile" 127 128 # install JUnit report formatter 129 go install github.com/vitessio/go-junit-report@HEAD 130 131 wget https://repo.percona.com/apt/percona-release_latest.$(lsb_release -sc)_all.deb 132 sudo apt-get install -y gnupg2 133 sudo dpkg -i percona-release_latest.$(lsb_release -sc)_all.deb 134 sudo apt-get update 135 sudo apt-get install percona-xtrabackup-24 136 137 # Checkout to the last release of Vitess 138 - name: Checkout to the other version's code (${{ needs.get_previous_release.outputs.previous_release }}) 139 if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' 140 uses: actions/checkout@v3 141 with: 142 ref: ${{ needs.get_previous_release.outputs.previous_release }} 143 144 - name: Get dependencies for the last release 145 if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' 146 run: | 147 go mod download 148 149 - name: Building last release's binaries 150 if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' 151 timeout-minutes: 5 152 run: | 153 source build.env 154 make build 155 mkdir -p /tmp/vitess-build-other/ 156 cp -R bin /tmp/vitess-build-other/ 157 rm -Rf bin/* 158 159 # Checkout to this build's commit 160 - name: Checkout to commit's code 161 if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' 162 uses: actions/checkout@v3 163 164 - name: Get dependencies for this commit 165 if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' 166 run: | 167 go mod download 168 169 - name: Run make minimaltools 170 if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' 171 run: | 172 make minimaltools 173 174 - name: Building the binaries for this commit 175 if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' 176 timeout-minutes: 5 177 run: | 178 source build.env 179 make build 180 mkdir -p /tmp/vitess-build-current/ 181 cp -R bin /tmp/vitess-build-current/ 182 183 # We create a sharded Vitess cluster following the local example. 184 # We also insert a few rows in our three tables. 185 - name: Create the example Vitess cluster with all components using version N 186 if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' 187 timeout-minutes: 10 188 run: | 189 source build.env ; cd examples/backups 190 ./start_cluster.sh 191 192 # Taking a backup 193 - name: Take a backup of all the shards 194 if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' 195 timeout-minutes: 5 196 run: | 197 source build.env ; cd examples/backups 198 ./take_backups.sh 199 200 # We insert more data in every table after the backup. 201 # When we restore the backup made in the previous step, we do not want to see the rows we are about to insert now. 202 # The initial number of rows for each table is: 203 # - customer: 5 204 # - product: 2 205 # - corder: 5 206 # We shall see the same number of rows after restoring the backup. 207 - name: Insert more data after the backup 208 if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' 209 run: | 210 source build.env ; cd examples; source ./common/env.sh 211 212 echo "insert into customer(email) values('new_user_1@domain.com');" | mysql 213 echo "insert into product(sku, description, price) values('SKU-1009', 'description', 89);" | mysql 214 echo "insert into corder(customer_id, sku, price) values(1, 'SKU-1009', 100);" | mysql 215 216 # Stop all the tablets and remove their data 217 - name: Stop tablets 218 if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' 219 timeout-minutes: 10 220 run: | 221 source build.env ; cd examples/backups 222 ./stop_tablets.sh 223 224 # We downgrade: we use the version N-1 of vttablet 225 - name: Downgrade - Swap binaries, use VTTablet N-1 226 if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' 227 run: | 228 source build.env 229 230 rm -f $PWD/bin/vttablet 231 cp /tmp/vitess-build-other/bin/vttablet $PWD/bin/vttablet 232 vttablet --version 233 234 # Starting the tablets again, they will automatically start restoring the last backup. 235 - name: Start new tablets and restore 236 if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' 237 timeout-minutes: 10 238 run: | 239 source build.env ; cd examples/backups 240 ./restart_tablets.sh 241 # give enough time to the tablets to restore the backup 242 sleep 90 243 244 # Count the number of rows in each table to make sure the restoration is successful. 245 - name: Assert the number of rows in every table 246 if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' 247 run: | 248 source build.env ; cd examples ; source ./common/env.sh 249 250 echo "select count(sku) from product;" | mysql 2>&1| grep 2 251 echo "select count(email) from customer;" | mysql 2>&1| grep 5 252 echo "select count(sku) from corder;" | mysql 2>&1| grep 5 253 254 # We insert one more row in every table. 255 - name: Insert more rows in the tables 256 if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' 257 run: | 258 source build.env ; cd examples ; source ./common/env.sh 259 260 echo "insert into customer(email) values('new_user_2@domain.com');" | mysql 261 echo "insert into product(sku, description, price) values('SKU-1011', 'description', 111);" | mysql 262 echo "insert into corder(customer_id, sku, price) values(1, 'SKU-1011', 111);" | mysql 263 264 # Taking a second backup of the cluster. 265 - name: Take a second backup of all the shards 266 if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' 267 timeout-minutes: 10 268 run: | 269 source build.env ; cd examples/backups 270 ./take_backups.sh 271 272 # Stopping the tablets so we can perform the upgrade. 273 - name: Stop tablets 274 if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' 275 timeout-minutes: 10 276 run: | 277 source build.env ; cd examples/backups 278 ./stop_tablets.sh 279 280 # We upgrade: we swap binaries and use the version N of the tablet. 281 - name: Upgrade - Swap binaries, use VTTablet N 282 if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' 283 run: | 284 source build.env 285 286 rm -f $PWD/bin/vttablet 287 cp /tmp/vitess-build-current/bin/vttablet $PWD/bin/vttablet 288 vttablet --version 289 290 # Starting the tablets again and restoring the previous backup. 291 - name: Start new tablets and restore 292 if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' 293 timeout-minutes: 10 294 run: | 295 source build.env ; cd examples/backups 296 ./restart_tablets.sh 297 # give enough time to the tablets to restore the backup 298 sleep 90 299 300 # We count the number of rows in every table to check that the restore step was successful. 301 - name: Assert the number of rows in every table 302 if: steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' 303 run: | 304 source build.env ; cd examples ; source ./common/env.sh 305 306 echo "select count(sku) from product;" | mysql 2>&1| grep 3 307 echo "select count(email) from customer;" | mysql 2>&1| grep 6 308 echo "select count(sku) from corder;" | mysql 2>&1| grep 6 309 310 - name: Stop the Vitess cluster 311 if: always() && steps.skip-workflow.outputs.skip-workflow == 'false' && steps.changes.outputs.end_to_end == 'true' 312 run: | 313 source build.env ; cd examples/local 314 ./401_teardown.sh || true