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