diff --git a/.github/workflows/build-cmake.yml b/.github/workflows/build-cmake.yml
new file mode 100644
index 0000000..ebfd151
--- /dev/null
+++ b/.github/workflows/build-cmake.yml
@@ -0,0 +1,21 @@
+on:
+  push:
+    branches:
+      - master
+  pull_request:
+    branches:
+      - master
+jobs:
+  fedora-cmake-build:
+    runs-on: ubuntu-latest
+    container: fedora:34
+    steps:
+      - uses: actions/checkout@v2
+      - name: install tools and dependencies
+        run: |
+          dnf install -y cmake rpm-build findutils clang-tools-extra 'dnf-command(builddep)'
+          dnf builddep -y mouse_m908.spec
+      - name: build mouse_m908 with cmake
+        run: |
+          cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -Bbuild
+          cmake --build build
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
new file mode 100644
index 0000000..9ece61e
--- /dev/null
+++ b/.github/workflows/build.yml
@@ -0,0 +1,33 @@
+on:
+  push:
+    branches:
+      - master
+  pull_request:
+    branches:
+      - master
+jobs:
+  fedora-rpm-build:
+    runs-on: ubuntu-latest
+    container: fedora:34
+    steps:
+      - uses: actions/checkout@v2
+      - name: install tools and dependencies
+        run: |
+          dnf install -y rpm-build findutils clang-tools-extra 'dnf-command(builddep)'
+          dnf builddep -y mouse_m908.spec
+      - name: build mouse_m908 rpm package
+        run: |
+          make -j4 rpm
+  centos-rpm-build:
+    runs-on: ubuntu-latest
+    container: centos:8
+    steps:
+      - uses: actions/checkout@v2
+      - name: install tools and dependencies
+        run: |
+          dnf install -y rpm-build findutils clang-tools-extra 'dnf-command(builddep)' 'dnf-command(config-manager)'
+          dnf config-manager --set-enabled powertools
+          dnf builddep -y mouse_m908.spec
+      - name: build mouse_m908 rpm package
+        run: |
+          make -j4 rpm
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
new file mode 100644
index 0000000..6f4cdff
--- /dev/null
+++ b/.github/workflows/release.yml
@@ -0,0 +1,155 @@
+on:
+  push:
+    tags:
+      - v*
+
+jobs:
+  create-gh-release:
+    runs-on: ubuntu-latest
+    container: fedora:latest
+    steps:
+      - name: create release
+        id: create_release
+        uses: actions/create-release@v1
+        env:
+          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+        with:
+          tag_name: ${{ github.ref }}
+          release_name: ${{ github.ref }}
+          draft: false
+          prerelease: false
+      - name: put upload_url in artifact
+        run: |
+          echo '${{ steps.create_release.outputs.upload_url }}' > release-upload-url
+      - name: upload artifact
+        uses: actions/upload-artifact@v2
+        with:
+          name: release-upload-url
+          path: release-upload-url
+
+  fedora-release-rpm:
+    runs-on: ubuntu-latest
+    container: fedora:34
+    steps:
+      - uses: actions/checkout@v2
+      - name: get version details
+        run: |
+          echo "RELEASE_VER=${GITHUB_REF#*/*/v}" >> ${GITHUB_ENV}
+          echo "DIST_TAG=$(rpm --eval '%dist')" >> ${GITHUB_ENV}
+          echo "RPM_RELEASE=$(awk '/Release:/{$0 = $2; FS="%"; $0=$0; print $1}' mouse_m908.spec)" >> ${GITHUB_ENV}
+      - name: set output variables
+        run: |
+          echo "RPM_NAME=mouse_m908-${RELEASE_VER}-${RPM_RELEASE}${DIST_TAG}.x86_64.rpm" >> ${GITHUB_ENV}
+          echo "SRPM_NAME=mouse_m908-${RELEASE_VER}-${RPM_RELEASE}${DIST_TAG}.src.rpm" >> ${GITHUB_ENV}
+      - name: install tools and dependencies
+        run: |
+          dnf install -y rpm-build findutils clang-tools-extra 'dnf-command(builddep)'
+          dnf builddep -y mouse_m908.spec
+      - name: build mouse_m908 rpm package
+        run: |
+          make -j4 rpm
+          make -j4 src-rpm
+
+      - name: upload rpm package artifact
+        uses: actions/upload-artifact@v2
+        with:
+          name: ${{ env.RPM_NAME }}
+          path: ${{ env.RPM_NAME }}
+      - name: upload src rpm package artifact
+        uses: actions/upload-artifact@v2
+        with:
+          name: ${{ env.SRPM_NAME }}
+          path: ${{ env.SRPM_NAME }}
+
+      - name: download release-upload-url artifact
+        uses: actions/download-artifact@v2
+        with:
+          name: release-upload-url
+          path: release-upload-url
+      - name: set upload url environment var
+        run: |
+          echo "UPLOAD_URL=$(cat release-upload-url/release-upload-url)" >> ${GITHUB_ENV} 
+      - name: upload rpm package to release page
+        id: upload-release-rpm
+        uses: actions/upload-release-asset@v1
+        env:
+          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+        with:
+          upload_url: ${{ env.UPLOAD_URL }}
+          asset_path: ./${{ env.RPM_NAME }}
+          asset_name: ${{ env.RPM_NAME }}
+          asset_content_type: application/octet-stream
+      - name: upload src rpm package to release page
+        id: upload-release-srpm
+        uses: actions/upload-release-asset@v1
+        env:
+          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+        with:
+          upload_url: ${{ env.UPLOAD_URL }}
+          asset_path: ./${{ env.SRPM_NAME }}
+          asset_name: ${{ env.SRPM_NAME }}
+          asset_content_type: application/octet-stream
+
+  centos-release-rpm:
+    runs-on: ubuntu-latest
+    container: centos:8
+    steps:
+      - uses: actions/checkout@v2
+      - name: get version details
+        run: |
+          echo "RELEASE_VER=${GITHUB_REF#*/*/v}" >> ${GITHUB_ENV}
+          echo "DIST_TAG=$(rpm --eval '%dist')" >> ${GITHUB_ENV}
+          echo "RPM_RELEASE=$(awk '/Release:/{$0 = $2; FS="%"; $0=$0; print $1}' mouse_m908.spec)" >> ${GITHUB_ENV}
+      - name: set output variables
+        run: |
+          echo "RPM_NAME=mouse_m908-${RELEASE_VER}-${RPM_RELEASE}${DIST_TAG}.x86_64.rpm" >> ${GITHUB_ENV}
+          echo "SRPM_NAME=mouse_m908-${RELEASE_VER}-${RPM_RELEASE}${DIST_TAG}.src.rpm" >> ${GITHUB_ENV}
+      - name: install tools and dependencies
+        run: |
+          dnf install -y rpm-build findutils clang-tools-extra 'dnf-command(builddep)' 'dnf-command(config-manager)'
+          dnf config-manager --set-enabled powertools
+          dnf builddep -y mouse_m908.spec
+      - name: build mouse_m908 rpm package
+        run: |
+          make -j4 rpm
+          make -j4 src-rpm
+
+      - name: upload rpm package artifact
+        uses: actions/upload-artifact@v2
+        with:
+          name: ${{ env.RPM_NAME }}
+          path: ${{ env.RPM_NAME }}
+      - name: upload src rpm package artifact
+        uses: actions/upload-artifact@v2
+        with:
+          name: ${{ env.SRPM_NAME }}
+          path: ${{ env.SRPM_NAME }}
+
+      - name: download release-upload-url artifact
+        uses: actions/download-artifact@v2
+        with:
+          name: release-upload-url
+          path: release-upload-url
+      - name: set upload url environment var
+        run: |
+          echo "UPLOAD_URL=$(cat release-upload-url/release-upload-url)" >> ${GITHUB_ENV} 
+      - name: upload rpm package to release page
+        id: upload-release-rpm
+        uses: actions/upload-release-asset@v1
+        env:
+          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+        with:
+          upload_url: ${{ env.UPLOAD_URL }}
+          asset_path: ./${{ env.RPM_NAME }}
+          asset_name: ${{ env.RPM_NAME }}
+          asset_content_type: application/octet-stream
+      - name: upload src rpm package to release page
+        id: upload-release-srpm
+        uses: actions/upload-release-asset@v1
+        env:
+          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+        with:
+          upload_url: ${{ env.UPLOAD_URL }}
+          asset_path: ./${{ env.SRPM_NAME }}
+          asset_name: ${{ env.SRPM_NAME }}
+          asset_content_type: application/octet-stream
diff --git a/makefile b/makefile
index 6d66e14..1b8bc94 100644
--- a/makefile
+++ b/makefile
@@ -52,7 +52,7 @@ upgrade: install
 
 # this builds a .rpm for Fedora/RHEL systems
 rpm:
-	rpmbuild --buildroot $(PWD)/rpmbuild/BUILDROOT --define "_topdir $(PWD)/rpmbuild" -bb mouse_m908.spec
+	+rpmbuild --buildroot $(PWD)/rpmbuild/BUILDROOT --define "_topdir $(PWD)/rpmbuild" -bb mouse_m908.spec
 
 # this builds .src.rpm for Fedora/RHEL systems
 src-rpm:
diff --git a/mouse_m908.spec b/mouse_m908.spec
index 85f4506..80932f1 100644
--- a/mouse_m908.spec
+++ b/mouse_m908.spec
@@ -7,12 +7,12 @@
 
 Name: mouse_m908
 Version: 3.2
-Release: 1
+Release: 1%{?dist}
 Summary: Control Redragon gaming mice from Linux, BSD and Haiku
 
 License: GPL v3
 URL:     https://github.com/dokutan/mouse_m908
-BuildRequires: gcc-c++ libusb libusb-devel
+BuildRequires: gcc-c++ libusb libusb-devel make
 Requires: libusb
 ExclusiveArch: x86_64