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