Migrate from Travis CI to GitHub Actions

Note that this removes our ability to regression test the Armv8 and
PowerPC SIMD extensions, effectively reverting
a524b9b06be2e0c24d8abc6528cf29316cfe8dc5 and
02227e48a990911a6da35ab8034911a9fbc1055a, but at the moment, there is no
other way.
diff --git a/.gitattributes b/.gitattributes
index 23fbb88..6c9660a 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -1,6 +1,4 @@
-/.travis.yml export-ignore
 /appveyor.yml export-ignore
-/ci export-ignore
 /.gitattributes export-ignore
 /.github export-ignore
 *.ppm binary
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
new file mode 100644
index 0000000..c0a64f3
--- /dev/null
+++ b/.github/workflows/build.yml
@@ -0,0 +1,180 @@
+name: Build
+
+on: [push, pull_request, workflow_dispatch]
+
+jobs:
+  linux:
+    runs-on: ubuntu-latest
+    steps:
+      - name: Set global environment variables
+        run: |
+          echo "BRANCH=${GITHUB_BASE_REF:-${GITHUB_REF#refs/heads/}}" >$GITHUB_ENV
+      - name: Check out code
+        uses: actions/checkout@v2
+      - name: Set up build
+        run: |
+          mkdir -p $HOME/src/ljt.nightly
+          docker pull dcommander/buildljt:$BRANCH
+          git clone --depth=1 https://github.com/libjpeg-turbo/buildscripts.git -b $BRANCH $HOME/src/buildscripts
+          mkdir $HOME/rpmkeys
+          wget --no-check-certificate "http://www.libjpeg-turbo.org/key/LJTPR-GPG-KEY" -O $HOME/rpmkeys/LJTPR-GPG-KEY
+      - name: Configure GPG signing
+        if: ${{github.event_name != 'pull_request'}}
+        run: |
+          sudo apt install -y gnupg1
+          printf "${{secrets.GPG_KEY}}" | base64 --decode | gpg1 --batch --import -
+          chmod 600 $HOME/.gnupg/gpg.conf
+          echo "GPG_KEY_NAME=\"${{secrets.GPG_KEY_NAME}}\"" >$HOME/src/buildscripts/gpgsign
+          echo "GPG_KEY_ID=${{secrets.GPG_KEY_ID}}" >>$HOME/src/buildscripts/gpgsign
+          echo "GPG_KEY_PASS=${{secrets.GPG_KEY_PASS}}" >>$HOME/src/buildscripts/gpgsign
+      - name: Build
+        run: |
+          docker run -v $HOME/src/ljt.nightly:/root/src/ljt.nightly -v $HOME/src/buildscripts:/root/src/buildscripts -v $GITHUB_WORKSPACE:/root/src/libjpeg-turbo -v $HOME/.gnupg:/root/.gnupg -v $HOME/rpmkeys:/rpmkeys -t dcommander/buildljt:$BRANCH bash -c "rpm --import /rpmkeys/LJTPR-GPG-KEY && ~/src/buildscripts/buildljt -d /root/src/libjpeg-turbo -v"
+          sudo chown -R runner:runner $HOME/src/ljt.nightly
+          mv $HOME/src/ljt.nightly/latest/log-${{github.job}}.txt $HOME/src/ljt.nightly/latest/files/
+      - name: Configure AWS
+        if: ${{github.event_name != 'pull_request'}}
+        uses: aws-actions/configure-aws-credentials@v1
+        with:
+          aws-access-key-id: ${{secrets.AWS_ACCESS_KEY_ID}}
+          aws-secret-access-key: ${{secrets.AWS_SECRET_ACCESS_KEY}}
+          aws-region: ${{secrets.AWS_REGION}}
+      - name: Deploy
+        if: ${{github.event_name != 'pull_request'}}
+        run: |
+          aws s3 sync --acl public-read --delete $HOME/src/ljt.nightly/latest/files/ s3://libjpeg-turbo-pr/${{env.BRANCH}}/${{github.job}}/
+  macos:
+    runs-on: macos-latest
+    steps:
+      - name: Set global environment variables
+        run: |
+          echo "BRANCH=${GITHUB_BASE_REF:-${GITHUB_REF#refs/heads/}}" >$GITHUB_ENV
+      - name: Check out code
+        uses: actions/checkout@v2
+      - name: Set up build
+        run: |
+          brew install yasm md5sha1sum
+          mkdir -p $HOME/src/ljt.nightly
+          git clone --depth=1 https://github.com/libjpeg-turbo/buildscripts.git -b $BRANCH $HOME/src/buildscripts
+      - name: Configure GPG signing
+        if: ${{github.event_name != 'pull_request'}}
+        run: |
+          printf "${{secrets.GPG_KEY}}" | base64 --decode | gpg --batch --import -
+          echo "GPG_KEY_NAME=\"${{secrets.GPG_KEY_NAME}}\"" >$HOME/src/buildscripts/gpgsign
+          echo "GPG_KEY_ID=${{secrets.GPG_KEY_ID}}" >>$HOME/src/buildscripts/gpgsign
+          echo "GPG_KEY_PASS=${{secrets.GPG_KEY_PASS}}" >>$HOME/src/buildscripts/gpgsign
+      - name: Build
+        run: |
+          $HOME/src/buildscripts/buildljt -d $GITHUB_WORKSPACE -v
+          mv $HOME/src/ljt.nightly/latest/log-${{github.job}}.txt $HOME/src/ljt.nightly/latest/files/
+      - name: Configure AWS
+        if: ${{github.event_name != 'pull_request'}}
+        uses: aws-actions/configure-aws-credentials@v1
+        with:
+          aws-access-key-id: ${{secrets.AWS_ACCESS_KEY_ID}}
+          aws-secret-access-key: ${{secrets.AWS_SECRET_ACCESS_KEY}}
+          aws-region: ${{secrets.AWS_REGION}}
+      - name: Deploy
+        if: ${{github.event_name != 'pull_request'}}
+        run: |
+          aws s3 sync --acl public-read --delete $HOME/src/ljt.nightly/latest/files/ s3://libjpeg-turbo-pr/${{env.BRANCH}}/${{github.job}}/
+  linux-asan-ubsan:
+    runs-on: ubuntu-latest
+    steps:
+      - name: Check out code
+        uses: actions/checkout@v2
+      - name: Set up build
+        run: |
+          sudo apt install -y nasm
+      - name: Build
+        env:
+          ASAN_OPTIONS: "detect_leaks=1 symbolize=1"
+          CTEST_OUTPUT_ON_FAILURE: 1
+        run: |
+          mkdir build
+          pushd build
+          cmake -G"Unix Makefiles" -DCMAKE_BUILD_TYPE=RelWithDebInfo -DCMAKE_C_COMPILER=clang -DCMAKE_C_FLAGS_RELWITHDEBINFO="-O1 -g -fsanitize=address,undefined -fno-omit-frame-pointer" -DENABLE_SHARED=0 ..
+          export NUMCPUS=`grep -c '^processor' /proc/cpuinfo`
+          make -j$NUMCPUS --load-average=$NUMCPUS
+          make test
+          JSIMD_FORCESSE2=1 make test
+          cmake -DFLOATTEST=no-fp-contract ..
+          JSIMD_FORCENONE=1 make test
+          popd
+  linux-12bit:
+    runs-on: ubuntu-latest
+    steps:
+      - name: Check out code
+        uses: actions/checkout@v2
+      - name: Build
+        env:
+          CTEST_OUTPUT_ON_FAILURE: 1
+        run: |
+          mkdir build
+          pushd build
+          cmake -G"Unix Makefiles" -DWITH_12BIT=1 ..
+          export NUMCPUS=`grep -c '^processor' /proc/cpuinfo`
+          make -j$NUMCPUS --load-average=$NUMCPUS
+          make test
+          popd
+  linux-jpeg7-x32:
+    runs-on: ubuntu-latest
+    steps:
+      - name: Check out code
+        uses: actions/checkout@v2
+      - name: Set up build
+        run: |
+          sudo apt update
+          sudo apt -y --install-recommends install libc6-dev-x32 nasm
+      - name: Build
+        env:
+          CTEST_OUTPUT_ON_FAILURE: 1
+        run: |
+          mkdir build
+          pushd build
+          cmake -G"Unix Makefiles" -DWITH_JPEG7=1 -DCMAKE_C_FLAGS=-mx32 ..
+          export NUMCPUS=`grep -c '^processor' /proc/cpuinfo`
+          make -j$NUMCPUS --load-average=$NUMCPUS
+          make test
+          JSIMD_FORCESSE2=1 make test
+          cmake -DFLOATTEST=no-fp-contract ..
+          JSIMD_FORCENONE=1 make test
+          popd
+  linux-jpeg8:
+    runs-on: ubuntu-latest
+    steps:
+      - name: Check out code
+        uses: actions/checkout@v2
+      - name: Set up build
+        run: |
+          sudo apt -y install nasm
+      - name: Build
+        env:
+          CTEST_OUTPUT_ON_FAILURE: 1
+        run: |
+          mkdir build
+          pushd build
+          cmake -G"Unix Makefiles" -DWITH_JPEG8=1 ..
+          export NUMCPUS=`grep -c '^processor' /proc/cpuinfo`
+          make -j$NUMCPUS --load-average=$NUMCPUS
+          make test
+          JSIMD_FORCESSE2=1 make test
+          cmake -DFLOATTEST=no-fp-contract ..
+          JSIMD_FORCENONE=1 make test
+          popd
+  linux-msan:
+    runs-on: ubuntu-latest
+    steps:
+      - name: Check out code
+        uses: actions/checkout@v2
+      - name: Build
+        env:
+          CTEST_OUTPUT_ON_FAILURE: 1
+        run: |
+          mkdir build
+          pushd build
+          cmake -G"Unix Makefiles" -DCMAKE_BUILD_TYPE=RelWithDebInfo -DCMAKE_C_COMPILER=clang -DCMAKE_C_FLAGS_RELWITHDEBINFO="-O3 -g -fsanitize=memory -fPIE" -DWITH_SIMD=0 ..
+          export NUMCPUS=`grep -c '^processor' /proc/cpuinfo`
+          make -j$NUMCPUS --load-average=$NUMCPUS
+          make test
+          popd
diff --git a/.travis.yml b/.travis.yml
deleted file mode 100644
index 0081a04..0000000
--- a/.travis.yml
+++ /dev/null
@@ -1,165 +0,0 @@
-language: c
-
-branches:
-  except:
-    - /^[0-9]+\.[0-9]+\.[0-9]+/
-    - /^jpeg-.*/
-
-matrix:
-  include:
-    - os: linux
-      env: BUILD_OFFICIAL=1
-      sudo: required
-      services:
-        - docker
-    - os: osx
-      env: BUILD_OFFICIAL=1
-      osx_image: xcode12.2
-    - os: linux
-      compiler: clang
-      env:
-        CMAKE_BUILD_TYPE=RelWithDebInfo
-        CFLAGS_RELWITHDEBINFO="-O1 -g -fsanitize=address,undefined -fno-omit-frame-pointer"
-        CMAKE_FLAGS="-DENABLE_SHARED=0"
-        ASAN_OPTIONS="detect_leaks=1 symbolize=1"
-        CTEST_OUTPUT_ON_FAILURE=1
-      addons:
-        apt:
-          packages:
-            - nasm
-    - os: linux
-      compiler: gcc
-      env:
-        CMAKE_FLAGS="-DWITH_12BIT=1"
-        CTEST_OUTPUT_ON_FAILURE=1
-    - os: linux
-      dist: bionic
-      compiler: gcc
-      env:
-        BUILD_X32=1
-        CMAKE_FLAGS="-DWITH_JPEG7=1 -DCMAKE_C_FLAGS=-mx32"
-        CTEST_OUTPUT_ON_FAILURE=1
-      addons:
-        apt:
-          packages:
-            - nasm
-    - os: linux
-      compiler: gcc
-      arch: ppc64le
-      env:
-        CMAKE_FLAGS="-DWITH_JPEG8=1"
-        CTEST_OUTPUT_ON_FAILURE=1
-    - os: linux
-      compiler: clang
-      env:
-        CMAKE_BUILD_TYPE=RelWithDebInfo
-        CFLAGS_RELWITHDEBINFO="-O3 -g -fsanitize=memory -fPIE"
-        CMAKE_FLAGS="-DWITH_SIMD=0"
-        CTEST_OUTPUT_ON_FAILURE=1
-    - os: linux
-      compiler: gcc
-      arch: arm64
-      env:
-        CTEST_OUTPUT_ON_FAILURE=1
-    - os: linux
-      compiler: clang
-      arch: arm64
-      env:
-        CTEST_OUTPUT_ON_FAILURE=1
-
-before_install:
-  - if [ "$BUILD_X32" = "1" ]; then
-      sudo apt -y --install-recommends install libc6-dev-x32;
-    fi
-  - if [ "$TRAVIS_OS_NAME" = "osx" ]; then
-      curl -LO https://distfiles.macports.org/MacPorts/MacPorts-2.6.4-10.15-Catalina.pkg &&
-      sudo installer -pkg MacPorts-2.6.4-10.15-Catalina.pkg -target / &&
-      rm MacPorts-2.6.4-10.15-Catalina.pkg &&
-      sudo /opt/local/bin/port -N install yasm md5sha1sum &&
-      export PATH=/opt/local/bin:$PATH &&
-      ln -fs /Applications/Xcode.app /Applications/Xcode122.app;
-    fi
-  - if [ "${BUILD_OFFICIAL:-}" != "" ]; then
-      if [ "$TRAVIS_OS_NAME" = "linux" ]; then
-        docker pull dcommander/buildljt:$TRAVIS_BRANCH;
-      fi &&
-      git clone --depth=1 https://github.com/libjpeg-turbo/buildscripts.git -b $TRAVIS_BRANCH ~/src/buildscripts &&
-      if [ -n "$encrypted_f92e8533f6f1_iv" ]; then
-        openssl aes-256-cbc -K $encrypted_f92e8533f6f1_key -iv $encrypted_f92e8533f6f1_iv -in ci/keys.enc -out ci/keys -d &&
-        tar xf ci/keys &&
-        rm ci/keys &&
-        mv ci/gpgsign ~/src/buildscripts &&
-        gpg --batch --import ci/sign_ljt &&
-        rm ci/sign_ljt;
-      fi
-    fi
-
-script:
-  - if [ "${BUILD_OFFICIAL:-}" != "" ]; then
-      mkdir -p ~/src/ljt.nightly &&
-      if [ "$TRAVIS_OS_NAME" = "linux" ]; then
-        mkdir $HOME/rpmkeys &&
-        wget --no-check-certificate "http://www.libjpeg-turbo.org/key/LJTPR-GPG-KEY" -O $HOME/rpmkeys/LJTPR-GPG-KEY &&
-        docker run -v $HOME/src/ljt.nightly:/root/src/ljt.nightly -v $HOME/src/buildscripts:/root/src/buildscripts -v $TRAVIS_BUILD_DIR:/root/src/libjpeg-turbo -v $HOME/.gnupg:/root/.gnupg -v $HOME/rpmkeys:/rpmkeys -t dcommander/buildljt:$TRAVIS_BRANCH bash -c "rpm --import /rpmkeys/LJTPR-GPG-KEY && ~/src/buildscripts/buildljt -d /root/src/libjpeg-turbo -v" &&
-        sudo chown -R travis:travis ~/src/ljt.nightly &&
-        mv ~/src/ljt.nightly/latest/log-$TRAVIS_OS_NAME.txt ~/src/ljt.nightly/latest/files/;
-      else
-        ~/src/buildscripts/buildljt -d $TRAVIS_BUILD_DIR -v &&
-        if [ "$TRAVIS_OS_NAME" = "osx" ]; then
-          mv ~/src/ljt.nightly/latest/log-macos.txt ~/src/ljt.nightly/latest/files/;
-        else
-          mv ~/src/ljt.nightly/latest/log-$TRAVIS_OS_NAME.txt ~/src/ljt.nightly/latest/files/;
-        fi
-      fi
-    fi
-  - if [ "${BUILD_OFFICIAL:-}" == "" ]; then
-      mkdir build &&
-      pushd build &&
-      cmake -G"Unix Makefiles" -DCMAKE_BUILD_TYPE=$CMAKE_BUILD_TYPE "-DCMAKE_C_FLAGS_RELWITHDEBINFO=$CFLAGS_RELWITHDEBINFO" $CMAKE_FLAGS .. &&
-      export NUMCPUS=`grep -c '^processor' /proc/cpuinfo` &&
-      make -j$NUMCPUS --load-average=$NUMCPUS &&
-      make test &&
-      if [[ ! "${CMAKE_FLAGS[0]}" =~ "WITH_12BIT" &&
-            ! "${CMAKE_FLAGS[0]}" =~ "WITH_SIMD" &&
-            "$TRAVIS_CPU_ARCH" = "amd64" ]]; then
-        JSIMD_FORCESSE2=1 make test &&
-        cmake -DFLOATTEST=no-fp-contract .. &&
-        JSIMD_FORCENONE=1 make test;
-      fi &&
-      popd;
-    fi
-
-after_failure:
-  - if [ "${BUILD_OFFICIAL:-}" == "" ]; then
-      if [ -f $TRAVIS_BUILD_DIR/build/config.log ]; then
-        cat $TRAVIS_BUILD_DIR/build/config.log;
-      fi
-    fi
-
-deploy:
-  - provider: s3
-    bucket: libjpeg-turbo-pr
-    access_key_id:
-      secure: bmFEt4H90/oR/LiN9XI+G26Pd6hiyrTw3+Vg3lS4ynwAYk33weApaVM8CyzQTgIhGSPzFStqVm9fTrb3RmrYP/PnNS+/surOeWLkH2DMRxvc0qmetBuNx1+vAN7FUkY8MO/u5uE9WXHAdp4e64pXcLXEbKmh+wgDm72b35WmMxErtHsGbpqy+j47rQkY4BJGi7XQzjjafaamfm4PzitsjkYYsgX8KLI16jyJEIirvyDHCPTn9wKR/jSjelDl+xTlgZGuCqmLCBW8f6JgycIspWjcYfO4WpWvkbnnI2sl3rCMPvOYc4wHe8SwzG0l4tM1PblZZDRcU7vjE15PmNf1Xfq9Vx3RpgBJv+UBNL/Vn0rKdpUCeEcfC12hxrske8DWpV6waBiDivjQJreE+YRXqa5YBhV/EdkoKYCqafnJvRASlOko9evje8F9KXTNsIGTT1HPmU9QM9WoJwLs/Xa3t09EmA2IjhcuAvvUmwCTuBBQVAlDjExiTT3Zhc9IYZDD92JgpAYLgridtzR87ElOxKhTkR4PowdI6UiLYArPjMFTjoz5Rivb9qNpbLaQC8HCYgLWxpWtUTzlW/9rM8izHpF8ySFHjO6E2aA9OJFc0tcbEGwAs2jLGD01OduU+DbBfsIkW0EgfXCPbD3FVgHsn3tkuzgO/bg20SM7uuCEYKQ=
-    secret_access_key:
-      secure: mrkOpEtqd2dEmi/qNJyX9vkME+6xgVBnXaRETKF7jT+flcQCQ0ayQkRkMV7lzGqq44XFg+n6Cpfn6oW0gH9RNdcC8YQvFP+kgzPx6nw6V/M31Vz6ySapJf59HBzVevf0NJkr0/1JoWsp1iq4IoN10WPzsCXZB55Io3Cf7DgpR+yiyBlWOctDfNdjJ97Juw3ENE80MHDf0fVqdUOIknQka1p68yAGkjar9kc2Oe7o94RzzmoqEn8tuFumiBQjIcuVRALsKqz+eIxBNgkL3BF9shVyRjOWLAeBhMPVFxZs5Dgd4ECbvU0i33gfmje3d6qqcw78N2lZaLefoVvWol3pOzVO133ewOSY9/lmpqEiRUU2ohEe8T4aSoS7posBW42itUTO4Y5w+eVOnHsm4sRQaI+/AXWTe7GPel+P8Qbe8Ya10A5gnpoag7o3raRDcHx+/qaZw1Af/u4XiAOYz3be3U90Qc+YMc/kS5i8BH0GXBbSfaWQ00CwRFlZQ3n1xUqmjC2CmjZTki3W/p7mEt0DjhcH9ZIXscK603sCC+mF6pEd9019k5fG/8fr2Y4Ptai9kd3BxZJCX9/jSoMfWOBbgkA5bRgHU0xrAj+p49qD6Ej9Xr8GE3+uebz3sEuhSFRnCKwKoOHOemfgevfO2y/jQXP677WPf3xQX7bVDfTFSHU=
-    acl: public_read
-    local-dir: $HOME/src/ljt.nightly/latest/files
-    upload-dir: $TRAVIS_BRANCH/$TRAVIS_OS_NAME
-    on:
-      repo: libjpeg-turbo/libjpeg-turbo
-      branch: master
-      condition: -n "$BUILD_OFFICIAL"
-  - provider: s3
-    bucket: libjpeg-turbo-pr
-    access_key_id:
-      secure: bmFEt4H90/oR/LiN9XI+G26Pd6hiyrTw3+Vg3lS4ynwAYk33weApaVM8CyzQTgIhGSPzFStqVm9fTrb3RmrYP/PnNS+/surOeWLkH2DMRxvc0qmetBuNx1+vAN7FUkY8MO/u5uE9WXHAdp4e64pXcLXEbKmh+wgDm72b35WmMxErtHsGbpqy+j47rQkY4BJGi7XQzjjafaamfm4PzitsjkYYsgX8KLI16jyJEIirvyDHCPTn9wKR/jSjelDl+xTlgZGuCqmLCBW8f6JgycIspWjcYfO4WpWvkbnnI2sl3rCMPvOYc4wHe8SwzG0l4tM1PblZZDRcU7vjE15PmNf1Xfq9Vx3RpgBJv+UBNL/Vn0rKdpUCeEcfC12hxrske8DWpV6waBiDivjQJreE+YRXqa5YBhV/EdkoKYCqafnJvRASlOko9evje8F9KXTNsIGTT1HPmU9QM9WoJwLs/Xa3t09EmA2IjhcuAvvUmwCTuBBQVAlDjExiTT3Zhc9IYZDD92JgpAYLgridtzR87ElOxKhTkR4PowdI6UiLYArPjMFTjoz5Rivb9qNpbLaQC8HCYgLWxpWtUTzlW/9rM8izHpF8ySFHjO6E2aA9OJFc0tcbEGwAs2jLGD01OduU+DbBfsIkW0EgfXCPbD3FVgHsn3tkuzgO/bg20SM7uuCEYKQ=
-    secret_access_key:
-      secure: mrkOpEtqd2dEmi/qNJyX9vkME+6xgVBnXaRETKF7jT+flcQCQ0ayQkRkMV7lzGqq44XFg+n6Cpfn6oW0gH9RNdcC8YQvFP+kgzPx6nw6V/M31Vz6ySapJf59HBzVevf0NJkr0/1JoWsp1iq4IoN10WPzsCXZB55Io3Cf7DgpR+yiyBlWOctDfNdjJ97Juw3ENE80MHDf0fVqdUOIknQka1p68yAGkjar9kc2Oe7o94RzzmoqEn8tuFumiBQjIcuVRALsKqz+eIxBNgkL3BF9shVyRjOWLAeBhMPVFxZs5Dgd4ECbvU0i33gfmje3d6qqcw78N2lZaLefoVvWol3pOzVO133ewOSY9/lmpqEiRUU2ohEe8T4aSoS7posBW42itUTO4Y5w+eVOnHsm4sRQaI+/AXWTe7GPel+P8Qbe8Ya10A5gnpoag7o3raRDcHx+/qaZw1Af/u4XiAOYz3be3U90Qc+YMc/kS5i8BH0GXBbSfaWQ00CwRFlZQ3n1xUqmjC2CmjZTki3W/p7mEt0DjhcH9ZIXscK603sCC+mF6pEd9019k5fG/8fr2Y4Ptai9kd3BxZJCX9/jSoMfWOBbgkA5bRgHU0xrAj+p49qD6Ej9Xr8GE3+uebz3sEuhSFRnCKwKoOHOemfgevfO2y/jQXP677WPf3xQX7bVDfTFSHU=
-    acl: public_read
-    local-dir: $HOME/src/ljt.nightly/latest/files
-    upload-dir: $TRAVIS_BRANCH/$TRAVIS_OS_NAME
-    on:
-      repo: libjpeg-turbo/libjpeg-turbo
-      branch: dev
-      condition: -n "$BUILD_OFFICIAL"
diff --git a/ci/keys.enc b/ci/keys.enc
deleted file mode 100644
index 4cd333f..0000000
--- a/ci/keys.enc
+++ /dev/null
Binary files differ