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