diff mbox series

[ovs-dev] github: Add GitHub Actions workflow.

Message ID 20201124155443.382929-1-i.maximets@ovn.org
State Superseded
Headers show
Series [ovs-dev] github: Add GitHub Actions workflow. | expand

Commit Message

Ilya Maximets Nov. 24, 2020, 3:54 p.m. UTC
This is an initial version of GitHub Actions support.  It mostly
mimics our current Travis CI build matrix with slight differences.

The main issue is that we don't have ARM support here.

Minor difference that we can not install 32-bit versions of libunwind
and libunbound since those are not avaialble in repository.

Higher concurrency level allows to finish all tests less than in 20
minutes.  Which is 3 times faster than in Travis.

.travis folder renamed to .ci to highlight that it used not only for
Travis CI.  Travis CI support will be reduced to only test ARM builds
soon and will be completely removed when travis-ci.org will be turned
into read-only mode.

What happened to Travis CI:
https://mail.openvswitch.org/pipermail/ovs-dev/2020-November/377773.html

Signed-off-by: Ilya Maximets <i.maximets@ovn.org>
---

Here is how it looks like:
  https://github.com/igsilya/ovs/actions/runs/381334381

I'll continue to work on preparing similar patches for released branches.

 {.travis => .ci}/linux-build.sh               |   0
 {.travis => .ci}/linux-prepare.sh             |  13 +-
 {.travis => .ci}/osx-build.sh                 |   0
 {.travis => .ci}/osx-prepare.sh               |   0
 .github/workflows/build-and-test.yml          | 197 ++++++++++++++++++
 .travis.yml                                   |   4 +-
 .../contributing/submitting-patches.rst       |   9 +-
 Makefile.am                                   |   9 +-
 NEWS                                          |   2 +
 README.rst                                    |   2 +
 10 files changed, 221 insertions(+), 15 deletions(-)
 rename {.travis => .ci}/linux-build.sh (100%)
 rename {.travis => .ci}/linux-prepare.sh (72%)
 rename {.travis => .ci}/osx-build.sh (100%)
 rename {.travis => .ci}/osx-prepare.sh (100%)
 create mode 100644 .github/workflows/build-and-test.yml

Comments

Numan Siddique Nov. 24, 2020, 5:01 p.m. UTC | #1
On Tue, Nov 24, 2020 at 9:25 PM Ilya Maximets <i.maximets@ovn.org> wrote:
>
> This is an initial version of GitHub Actions support.  It mostly
> mimics our current Travis CI build matrix with slight differences.
>
> The main issue is that we don't have ARM support here.
>
> Minor difference that we can not install 32-bit versions of libunwind
> and libunbound since those are not avaialble in repository.
>
> Higher concurrency level allows to finish all tests less than in 20
> minutes.  Which is 3 times faster than in Travis.
>
> .travis folder renamed to .ci to highlight that it used not only for
> Travis CI.  Travis CI support will be reduced to only test ARM builds
> soon and will be completely removed when travis-ci.org will be turned
> into read-only mode.
>
> What happened to Travis CI:
> https://mail.openvswitch.org/pipermail/ovs-dev/2020-November/377773.html
>
> Signed-off-by: Ilya Maximets <i.maximets@ovn.org>

Acked-by: Numan Siddique <numans@ovn.org>

Numan

> ---
>
> Here is how it looks like:
>   https://github.com/igsilya/ovs/actions/runs/381334381
>
> I'll continue to work on preparing similar patches for released branches.
>
>  {.travis => .ci}/linux-build.sh               |   0
>  {.travis => .ci}/linux-prepare.sh             |  13 +-
>  {.travis => .ci}/osx-build.sh                 |   0
>  {.travis => .ci}/osx-prepare.sh               |   0
>  .github/workflows/build-and-test.yml          | 197 ++++++++++++++++++
>  .travis.yml                                   |   4 +-
>  .../contributing/submitting-patches.rst       |   9 +-
>  Makefile.am                                   |   9 +-
>  NEWS                                          |   2 +
>  README.rst                                    |   2 +
>  10 files changed, 221 insertions(+), 15 deletions(-)
>  rename {.travis => .ci}/linux-build.sh (100%)
>  rename {.travis => .ci}/linux-prepare.sh (72%)
>  rename {.travis => .ci}/osx-build.sh (100%)
>  rename {.travis => .ci}/osx-prepare.sh (100%)
>  create mode 100644 .github/workflows/build-and-test.yml
>
> diff --git a/.travis/linux-build.sh b/.ci/linux-build.sh
> similarity index 100%
> rename from .travis/linux-build.sh
> rename to .ci/linux-build.sh
> diff --git a/.travis/linux-prepare.sh b/.ci/linux-prepare.sh
> similarity index 72%
> rename from .travis/linux-prepare.sh
> rename to .ci/linux-prepare.sh
> index 71eb347e8..fea905a83 100755
> --- a/.travis/linux-prepare.sh
> +++ b/.ci/linux-prepare.sh
> @@ -25,10 +25,15 @@ pip3 install --user --upgrade docutils
>
>  if [ "$M32" ]; then
>      # Installing 32-bit libraries.
> -    # 32-bit and 64-bit libunwind can not be installed at the same time.
> -    # This will remove the 64-bit libunwind and install 32-bit version.
> -    sudo apt-get install -y \
> -        libunwind-dev:i386 libunbound-dev:i386 gcc-multilib
> +    pkgs="gcc-multilib"
> +    if [ -z "$GITHUB_WORKFLOW" ]; then
> +        # 32-bit and 64-bit libunwind can not be installed at the same time.
> +        # This will remove the 64-bit libunwind and install 32-bit version.
> +        # GitHub Actions doesn't have 32-bit versions of these libs.
> +        pkgs=$pkgs" libunwind-dev:i386 libunbound-dev:i386"
> +    fi
> +
> +    sudo apt-get install -y $pkgs
>  fi
>
>  # IPv6 is supported by kernel but disabled in TravisCI images:
> diff --git a/.travis/osx-build.sh b/.ci/osx-build.sh
> similarity index 100%
> rename from .travis/osx-build.sh
> rename to .ci/osx-build.sh
> diff --git a/.travis/osx-prepare.sh b/.ci/osx-prepare.sh
> similarity index 100%
> rename from .travis/osx-prepare.sh
> rename to .ci/osx-prepare.sh
> diff --git a/.github/workflows/build-and-test.yml b/.github/workflows/build-and-test.yml
> new file mode 100644
> index 000000000..af296c1a1
> --- /dev/null
> +++ b/.github/workflows/build-and-test.yml
> @@ -0,0 +1,197 @@
> +name: Build and Test
> +
> +on: [push, pull_request]
> +
> +jobs:
> +  build-linux:
> +    env:
> +      dependencies: |
> +        automake libtool gcc bc libjemalloc1 libjemalloc-dev    \
> +        libssl-dev llvm-dev libelf-dev libnuma-dev libpcap-dev  \
> +        python3-openssl python3-pip python3-sphinx              \
> +        selinux-policy-dev
> +      deb_dependencies: |
> +        linux-headers-$(uname -r) build-essential fakeroot devscripts equivs
> +      DPDK_VER:    19.11.2
> +      AFXDP:       ${{ matrix.afxdp }}
> +      CC:          ${{ matrix.compiler }}
> +      DEB_PACKAGE: ${{ matrix.deb_package }}
> +      DPDK:        ${{ matrix.dpdk }}
> +      DPDK_SHARED: ${{ matrix.dpdk_shared }}
> +      KERNEL:      ${{ matrix.kernel }}
> +      KERNEL_LIST: ${{ matrix.kernel_list }}
> +      LIBS:        ${{ matrix.libs }}
> +      M32:         ${{ matrix.m32 }}
> +      OPTS:        ${{ matrix.opts }}
> +      TESTSUITE:   ${{ matrix.testsuite }}
> +
> +    name: linux ${{ join(matrix.*, ' ') }}
> +    runs-on: ubuntu-latest
> +    timeout-minutes: 30
> +
> +    strategy:
> +      fail-fast: false
> +      matrix:
> +        include:
> +          - compiler:     gcc
> +            opts:         --disable-ssl
> +          - compiler:     clang
> +            opts:         --disable-ssl
> +
> +          - compiler:     gcc
> +            testsuite:    test
> +            kernel:       3.16
> +          - compiler:     clang
> +            testsuite:    test
> +            kernel:       3.16
> +
> +          - compiler:     gcc
> +            testsuite:    test
> +            opts:         --enable-shared
> +          - compiler:     clang
> +            testsuite:    test
> +            opts:         --enable-shared
> +
> +          - compiler:     gcc
> +            testsuite:    test
> +            dpdk:         dpdk
> +          - compiler:     clang
> +            testsuite:    test
> +            dpdk:         dpdk
> +
> +          - compiler:     gcc
> +            testsuite:    test
> +            libs:         -ljemalloc
> +          - compiler:     clang
> +            testsuite:    test
> +            libs:         -ljemalloc
> +
> +          - compiler:     gcc
> +            kernel_list:  5.8 5.5 5.4 4.19
> +          - compiler:     clang
> +            kernel_list:  5.8 5.5 5.4 4.19
> +
> +          - compiler:     gcc
> +            kernel_list:  4.14 4.9 4.4 3.16
> +          - compiler:     clang
> +            kernel_list:  4.14 4.9 4.4 3.16
> +
> +          - compiler:     gcc
> +            afxdp:        afxdp
> +            kernel:       5.3
> +          - compiler:     clang
> +            afxdp:        afxdp
> +            kernel:       5.3
> +
> +          - compiler:     gcc
> +            dpdk:         dpdk
> +            opts:         --enable-shared
> +          - compiler:     clang
> +            dpdk:         dpdk
> +            opts:         --enable-shared
> +
> +          - compiler:     gcc
> +            dpdk_shared:  dpdk-shared
> +          - compiler:     clang
> +            dpdk_shared:  dpdk-shared
> +
> +          - compiler:     gcc
> +            dpdk_shared:  dpdk-shared
> +            opts:         --enable-shared
> +          - compiler:     clang
> +            dpdk_shared:  dpdk-shared
> +            opts:         --enable-shared
> +
> +          - compiler:     gcc
> +            m32:          m32
> +            opts:         --disable-ssl
> +
> +          - compiler:     gcc
> +            deb_package:  deb
> +
> +    steps:
> +    - name: checkout
> +      uses: actions/checkout@v2
> +
> +    - name: create cache key ref
> +      id:   key_ref
> +      if:   github.base_ref == ''
> +      run:  echo "::set-output name=ref_key::${{ github.ref }}"
> +
> +    - name: create cache key ref for pull request
> +      id:   key_ref_pull
> +      if:   github.base_ref != ''
> +      run:  echo "::set-output name=ref_key::${{ github.base_ref }}"
> +
> +    - name: cache
> +      if:   matrix.dpdk != '' || matrix.dpdk_shared != ''
> +      uses: actions/cache@v2
> +      env:
> +        matrix_key: ${{ matrix.dpdk }}${{ matrix.dpdk_shared }}
> +        ref_key:    ${{ join(steps.*.outputs.ref_key) }}
> +      with:
> +        path: dpdk-dir
> +        key:  dpdk-${{ env.DPDK_VER }}-${{ env.matrix_key }}-${{ env.ref_key }}
> +        restore-keys: |
> +          dpdk-${{ env.DPDK_VER }}-${{ env.matrix_key }}-refs/heads/master
> +
> +    - name: install common dependencies
> +      if:   matrix.deb_package == ''
> +      run:  sudo apt install -y ${{ env.dependencies }}
> +    - name: install dependencies for debian packages
> +      if:   matrix.deb_package != ''
> +      run:  sudo apt install -y ${{ env.deb_dependencies }}
> +    - name: install libunbound libunwind
> +      if:   matrix.m32 == ''
> +      run:  sudo apt install -y libunbound-dev libunwind-dev
> +
> +    - name: prepare
> +      run:  ./.ci/linux-prepare.sh
> +
> +    - name: build
> +      run:  PATH="$PATH:$HOME/bin" ./.ci/linux-build.sh
> +
> +    - name: upload deb packages
> +      if:   matrix.deb_package != ''
> +      uses: actions/upload-artifact@v2
> +      with:
> +        name: deb-packages
> +        path: '/home/runner/work/ovs/*.deb'
> +
> +    - name: upload logs on failure
> +      if: failure()
> +      uses: actions/upload-artifact@v2
> +      with:
> +        name: logs-linux-${{ join(matrix.*, '-') }}
> +        path: |
> +          config.log
> +          '*/_build/sub/tests/testsuite.log'
> +          '*/_build/sub/tests/testsuite.dir'
> +
> +  build-osx:
> +    env:
> +      CC:    clang
> +      OPTS:  --disable-ssl
> +
> +    name:    osx clang --disable-ssl
> +    runs-on: macos-latest
> +    timeout-minutes: 30
> +
> +    strategy:
> +      fail-fast: false
> +
> +    steps:
> +    - name: checkout
> +      uses: actions/checkout@v2
> +    - name: install dependencies
> +      run:  brew install automake libtool
> +    - name: prepare
> +      run:  ./.ci/osx-prepare.sh
> +    - name: build
> +      run:  PATH="$PATH:$HOME/bin" ./.ci/osx-build.sh
> +    - name: upload logs on failure
> +      if: failure()
> +      uses: actions/upload-artifact@v2
> +      with:
> +        name: logs-osx-clang---disable-ssl
> +        path: config.log
> diff --git a/.travis.yml b/.travis.yml
> index 9fd8bbe01..34ef16aa7 100644
> --- a/.travis.yml
> +++ b/.travis.yml
> @@ -28,7 +28,7 @@ addons:
>        - libunbound-dev
>        - libunwind-dev
>
> -before_install: ./.travis/${TRAVIS_OS_NAME}-prepare.sh
> +before_install: ./.ci/${TRAVIS_OS_NAME}-prepare.sh
>
>  before_script: export PATH=$PATH:$HOME/bin
>
> @@ -76,7 +76,7 @@ matrix:
>              - devscripts
>              - equivs
>
> -script: ./.travis/${TRAVIS_OS_NAME}-build.sh $OPTS
> +script: ./.ci/${TRAVIS_OS_NAME}-build.sh $OPTS
>
>  notifications:
>    email:
> diff --git a/Documentation/internals/contributing/submitting-patches.rst b/Documentation/internals/contributing/submitting-patches.rst
> index 5a314cc60..4a6780371 100644
> --- a/Documentation/internals/contributing/submitting-patches.rst
> +++ b/Documentation/internals/contributing/submitting-patches.rst
> @@ -68,11 +68,10 @@ Testing is also important:
>    feature.  A bug fix patch should preferably add a test that would
>    fail if the bug recurs.
>
> -If you are using GitHub, then you may utilize the travis-ci.org CI build system
> -by linking your GitHub repository to it. This will run some of the above tests
> -automatically when you push changes to your repository.  See the "Continuous
> -Integration with Travis-CI" in :doc:`/topics/testing` for details on how to set
> -it up.
> +If you are using GitHub, then you may utilize the travis-ci.org and the GitHub
> +Actions CI build systems.  They will run some of the above tests automatically
> +when you push changes to your repository.  See the "Continuous Integration with
> +Travis-CI" in :doc:`/topics/testing` for details on how to set it up.
>
>  Email Subject
>  -------------
> diff --git a/Makefile.am b/Makefile.am
> index a3fbb15e2..691a005ad 100644
> --- a/Makefile.am
> +++ b/Makefile.am
> @@ -76,12 +76,13 @@ EXTRA_DIST = \
>         MAINTAINERS.rst \
>         README.rst \
>         NOTICE \
> +       .ci/linux-build.sh \
> +       .ci/linux-prepare.sh \
> +       .ci/osx-build.sh \
> +       .ci/osx-prepare.sh \
>         .cirrus.yml \
> +       .github/workflows/build-and-test.yml \
>         .travis.yml \
> -       .travis/linux-build.sh \
> -       .travis/linux-prepare.sh \
> -       .travis/osx-build.sh \
> -       .travis/osx-prepare.sh \
>         appveyor.yml \
>         boot.sh \
>         poc/builders/Vagrantfile \
> diff --git a/NEWS b/NEWS
> index 185555848..7e291a180 100644
> --- a/NEWS
> +++ b/NEWS
> @@ -25,6 +25,8 @@ Post-v2.14.0
>         "secondary", respectively, for OpenFlow connection roles.
>       * The term "slave" has been replaced by "member", for bonds, LACP, and
>         OpenFlow bundle actions.
> +   - Support for GitHub Actions based continuous integration builds has been
> +     added.
>
>
>  v2.14.0 - 17 Aug 2020
> diff --git a/README.rst b/README.rst
> index e06ddf267..319f70515 100644
> --- a/README.rst
> +++ b/README.rst
> @@ -6,6 +6,8 @@
>  Open vSwitch
>  ============
>
> +.. image:: https://github.com/openvswitch/ovs/workflows/Build%20and%20Test/badge.svg
> +    :target: https://github.com/openvswitch/ovs/actions
>  .. image:: https://travis-ci.org/openvswitch/ovs.png
>      :target: https://travis-ci.org/openvswitch/ovs
>  .. image:: https://ci.appveyor.com/api/projects/status/github/openvswitch/ovs?branch=master&svg=true&retina=true
> --
> 2.25.4
>
> _______________________________________________
> dev mailing list
> dev@openvswitch.org
> https://mail.openvswitch.org/mailman/listinfo/ovs-dev
>
Ilya Maximets Nov. 25, 2020, 3:09 p.m. UTC | #2
On 11/24/20 6:01 PM, Numan Siddique wrote:
> On Tue, Nov 24, 2020 at 9:25 PM Ilya Maximets <i.maximets@ovn.org> wrote:
>>
>> This is an initial version of GitHub Actions support.  It mostly
>> mimics our current Travis CI build matrix with slight differences.
>>
>> The main issue is that we don't have ARM support here.
>>
>> Minor difference that we can not install 32-bit versions of libunwind
>> and libunbound since those are not avaialble in repository.
>>
>> Higher concurrency level allows to finish all tests less than in 20
>> minutes.  Which is 3 times faster than in Travis.
>>
>> .travis folder renamed to .ci to highlight that it used not only for
>> Travis CI.  Travis CI support will be reduced to only test ARM builds
>> soon and will be completely removed when travis-ci.org will be turned
>> into read-only mode.
>>
>> What happened to Travis CI:
>> https://mail.openvswitch.org/pipermail/ovs-dev/2020-November/377773.html
>>
>> Signed-off-by: Ilya Maximets <i.maximets@ovn.org>
> 
> Acked-by: Numan Siddique <numans@ovn.org>

Thanks, Numan.

There were few issues with this version.  I fixed them and sent v2:
https://patchwork.ozlabs.org/project/openvswitch/list/?series=216666

Best regards, Ilya Maximets.
diff mbox series

Patch

diff --git a/.travis/linux-build.sh b/.ci/linux-build.sh
similarity index 100%
rename from .travis/linux-build.sh
rename to .ci/linux-build.sh
diff --git a/.travis/linux-prepare.sh b/.ci/linux-prepare.sh
similarity index 72%
rename from .travis/linux-prepare.sh
rename to .ci/linux-prepare.sh
index 71eb347e8..fea905a83 100755
--- a/.travis/linux-prepare.sh
+++ b/.ci/linux-prepare.sh
@@ -25,10 +25,15 @@  pip3 install --user --upgrade docutils
 
 if [ "$M32" ]; then
     # Installing 32-bit libraries.
-    # 32-bit and 64-bit libunwind can not be installed at the same time.
-    # This will remove the 64-bit libunwind and install 32-bit version.
-    sudo apt-get install -y \
-        libunwind-dev:i386 libunbound-dev:i386 gcc-multilib
+    pkgs="gcc-multilib"
+    if [ -z "$GITHUB_WORKFLOW" ]; then
+        # 32-bit and 64-bit libunwind can not be installed at the same time.
+        # This will remove the 64-bit libunwind and install 32-bit version.
+        # GitHub Actions doesn't have 32-bit versions of these libs.
+        pkgs=$pkgs" libunwind-dev:i386 libunbound-dev:i386"
+    fi
+
+    sudo apt-get install -y $pkgs
 fi
 
 # IPv6 is supported by kernel but disabled in TravisCI images:
diff --git a/.travis/osx-build.sh b/.ci/osx-build.sh
similarity index 100%
rename from .travis/osx-build.sh
rename to .ci/osx-build.sh
diff --git a/.travis/osx-prepare.sh b/.ci/osx-prepare.sh
similarity index 100%
rename from .travis/osx-prepare.sh
rename to .ci/osx-prepare.sh
diff --git a/.github/workflows/build-and-test.yml b/.github/workflows/build-and-test.yml
new file mode 100644
index 000000000..af296c1a1
--- /dev/null
+++ b/.github/workflows/build-and-test.yml
@@ -0,0 +1,197 @@ 
+name: Build and Test
+
+on: [push, pull_request]
+
+jobs:
+  build-linux:
+    env:
+      dependencies: |
+        automake libtool gcc bc libjemalloc1 libjemalloc-dev    \
+        libssl-dev llvm-dev libelf-dev libnuma-dev libpcap-dev  \
+        python3-openssl python3-pip python3-sphinx              \
+        selinux-policy-dev
+      deb_dependencies: |
+        linux-headers-$(uname -r) build-essential fakeroot devscripts equivs
+      DPDK_VER:    19.11.2
+      AFXDP:       ${{ matrix.afxdp }}
+      CC:          ${{ matrix.compiler }}
+      DEB_PACKAGE: ${{ matrix.deb_package }}
+      DPDK:        ${{ matrix.dpdk }}
+      DPDK_SHARED: ${{ matrix.dpdk_shared }}
+      KERNEL:      ${{ matrix.kernel }}
+      KERNEL_LIST: ${{ matrix.kernel_list }}
+      LIBS:        ${{ matrix.libs }}
+      M32:         ${{ matrix.m32 }}
+      OPTS:        ${{ matrix.opts }}
+      TESTSUITE:   ${{ matrix.testsuite }}
+
+    name: linux ${{ join(matrix.*, ' ') }}
+    runs-on: ubuntu-latest
+    timeout-minutes: 30
+
+    strategy:
+      fail-fast: false
+      matrix:
+        include:
+          - compiler:     gcc
+            opts:         --disable-ssl
+          - compiler:     clang
+            opts:         --disable-ssl
+
+          - compiler:     gcc
+            testsuite:    test
+            kernel:       3.16
+          - compiler:     clang
+            testsuite:    test
+            kernel:       3.16
+
+          - compiler:     gcc
+            testsuite:    test
+            opts:         --enable-shared
+          - compiler:     clang
+            testsuite:    test
+            opts:         --enable-shared
+
+          - compiler:     gcc
+            testsuite:    test
+            dpdk:         dpdk
+          - compiler:     clang
+            testsuite:    test
+            dpdk:         dpdk
+
+          - compiler:     gcc
+            testsuite:    test
+            libs:         -ljemalloc
+          - compiler:     clang
+            testsuite:    test
+            libs:         -ljemalloc
+
+          - compiler:     gcc
+            kernel_list:  5.8 5.5 5.4 4.19
+          - compiler:     clang
+            kernel_list:  5.8 5.5 5.4 4.19
+
+          - compiler:     gcc
+            kernel_list:  4.14 4.9 4.4 3.16
+          - compiler:     clang
+            kernel_list:  4.14 4.9 4.4 3.16
+
+          - compiler:     gcc
+            afxdp:        afxdp
+            kernel:       5.3
+          - compiler:     clang
+            afxdp:        afxdp
+            kernel:       5.3
+
+          - compiler:     gcc
+            dpdk:         dpdk
+            opts:         --enable-shared
+          - compiler:     clang
+            dpdk:         dpdk
+            opts:         --enable-shared
+
+          - compiler:     gcc
+            dpdk_shared:  dpdk-shared
+          - compiler:     clang
+            dpdk_shared:  dpdk-shared
+
+          - compiler:     gcc
+            dpdk_shared:  dpdk-shared
+            opts:         --enable-shared
+          - compiler:     clang
+            dpdk_shared:  dpdk-shared
+            opts:         --enable-shared
+
+          - compiler:     gcc
+            m32:          m32
+            opts:         --disable-ssl
+
+          - compiler:     gcc
+            deb_package:  deb
+
+    steps:
+    - name: checkout
+      uses: actions/checkout@v2
+
+    - name: create cache key ref
+      id:   key_ref
+      if:   github.base_ref == ''
+      run:  echo "::set-output name=ref_key::${{ github.ref }}"
+
+    - name: create cache key ref for pull request
+      id:   key_ref_pull
+      if:   github.base_ref != ''
+      run:  echo "::set-output name=ref_key::${{ github.base_ref }}"
+
+    - name: cache
+      if:   matrix.dpdk != '' || matrix.dpdk_shared != ''
+      uses: actions/cache@v2
+      env:
+        matrix_key: ${{ matrix.dpdk }}${{ matrix.dpdk_shared }}
+        ref_key:    ${{ join(steps.*.outputs.ref_key) }}
+      with:
+        path: dpdk-dir
+        key:  dpdk-${{ env.DPDK_VER }}-${{ env.matrix_key }}-${{ env.ref_key }}
+        restore-keys: |
+          dpdk-${{ env.DPDK_VER }}-${{ env.matrix_key }}-refs/heads/master
+
+    - name: install common dependencies
+      if:   matrix.deb_package == ''
+      run:  sudo apt install -y ${{ env.dependencies }}
+    - name: install dependencies for debian packages
+      if:   matrix.deb_package != ''
+      run:  sudo apt install -y ${{ env.deb_dependencies }}
+    - name: install libunbound libunwind
+      if:   matrix.m32 == ''
+      run:  sudo apt install -y libunbound-dev libunwind-dev
+
+    - name: prepare
+      run:  ./.ci/linux-prepare.sh
+
+    - name: build
+      run:  PATH="$PATH:$HOME/bin" ./.ci/linux-build.sh
+
+    - name: upload deb packages
+      if:   matrix.deb_package != ''
+      uses: actions/upload-artifact@v2
+      with:
+        name: deb-packages
+        path: '/home/runner/work/ovs/*.deb'
+
+    - name: upload logs on failure
+      if: failure()
+      uses: actions/upload-artifact@v2
+      with:
+        name: logs-linux-${{ join(matrix.*, '-') }}
+        path: |
+          config.log
+          '*/_build/sub/tests/testsuite.log'
+          '*/_build/sub/tests/testsuite.dir'
+
+  build-osx:
+    env:
+      CC:    clang
+      OPTS:  --disable-ssl
+
+    name:    osx clang --disable-ssl
+    runs-on: macos-latest
+    timeout-minutes: 30
+
+    strategy:
+      fail-fast: false
+
+    steps:
+    - name: checkout
+      uses: actions/checkout@v2
+    - name: install dependencies
+      run:  brew install automake libtool
+    - name: prepare
+      run:  ./.ci/osx-prepare.sh
+    - name: build
+      run:  PATH="$PATH:$HOME/bin" ./.ci/osx-build.sh
+    - name: upload logs on failure
+      if: failure()
+      uses: actions/upload-artifact@v2
+      with:
+        name: logs-osx-clang---disable-ssl
+        path: config.log
diff --git a/.travis.yml b/.travis.yml
index 9fd8bbe01..34ef16aa7 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -28,7 +28,7 @@  addons:
       - libunbound-dev
       - libunwind-dev
 
-before_install: ./.travis/${TRAVIS_OS_NAME}-prepare.sh
+before_install: ./.ci/${TRAVIS_OS_NAME}-prepare.sh
 
 before_script: export PATH=$PATH:$HOME/bin
 
@@ -76,7 +76,7 @@  matrix:
             - devscripts
             - equivs
 
-script: ./.travis/${TRAVIS_OS_NAME}-build.sh $OPTS
+script: ./.ci/${TRAVIS_OS_NAME}-build.sh $OPTS
 
 notifications:
   email:
diff --git a/Documentation/internals/contributing/submitting-patches.rst b/Documentation/internals/contributing/submitting-patches.rst
index 5a314cc60..4a6780371 100644
--- a/Documentation/internals/contributing/submitting-patches.rst
+++ b/Documentation/internals/contributing/submitting-patches.rst
@@ -68,11 +68,10 @@  Testing is also important:
   feature.  A bug fix patch should preferably add a test that would
   fail if the bug recurs.
 
-If you are using GitHub, then you may utilize the travis-ci.org CI build system
-by linking your GitHub repository to it. This will run some of the above tests
-automatically when you push changes to your repository.  See the "Continuous
-Integration with Travis-CI" in :doc:`/topics/testing` for details on how to set
-it up.
+If you are using GitHub, then you may utilize the travis-ci.org and the GitHub
+Actions CI build systems.  They will run some of the above tests automatically
+when you push changes to your repository.  See the "Continuous Integration with
+Travis-CI" in :doc:`/topics/testing` for details on how to set it up.
 
 Email Subject
 -------------
diff --git a/Makefile.am b/Makefile.am
index a3fbb15e2..691a005ad 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -76,12 +76,13 @@  EXTRA_DIST = \
 	MAINTAINERS.rst \
 	README.rst \
 	NOTICE \
+	.ci/linux-build.sh \
+	.ci/linux-prepare.sh \
+	.ci/osx-build.sh \
+	.ci/osx-prepare.sh \
 	.cirrus.yml \
+	.github/workflows/build-and-test.yml \
 	.travis.yml \
-	.travis/linux-build.sh \
-	.travis/linux-prepare.sh \
-	.travis/osx-build.sh \
-	.travis/osx-prepare.sh \
 	appveyor.yml \
 	boot.sh \
 	poc/builders/Vagrantfile \
diff --git a/NEWS b/NEWS
index 185555848..7e291a180 100644
--- a/NEWS
+++ b/NEWS
@@ -25,6 +25,8 @@  Post-v2.14.0
        "secondary", respectively, for OpenFlow connection roles.
      * The term "slave" has been replaced by "member", for bonds, LACP, and
        OpenFlow bundle actions.
+   - Support for GitHub Actions based continuous integration builds has been
+     added.
 
 
 v2.14.0 - 17 Aug 2020
diff --git a/README.rst b/README.rst
index e06ddf267..319f70515 100644
--- a/README.rst
+++ b/README.rst
@@ -6,6 +6,8 @@ 
 Open vSwitch
 ============
 
+.. image:: https://github.com/openvswitch/ovs/workflows/Build%20and%20Test/badge.svg
+    :target: https://github.com/openvswitch/ovs/actions
 .. image:: https://travis-ci.org/openvswitch/ovs.png
     :target: https://travis-ci.org/openvswitch/ovs
 .. image:: https://ci.appveyor.com/api/projects/status/github/openvswitch/ovs?branch=master&svg=true&retina=true