diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 11b3af7962a96d3fe7cec1228d052e4601689fbf..27e744f79c3f1c0ade43f7ba58ad6dab73c7c170 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -109,4 +109,21 @@ release:
     assets:
       links:
         - name: 'Linux (amd64)'
-          url: "${PACKAGE_REGISTRY_URL}/${LINUX_AMD64_BINARY}"
\ No newline at end of file
+          url: "${PACKAGE_REGISTRY_URL}/${LINUX_AMD64_BINARY}"
+
+fedora:
+  stage: release
+    #  rules:
+    #    - if: '$CI_COMMIT_TAG =~ /^\d+\.\d+\.\d+$/'
+  needs:
+    - job: rust-nightly
+  image: docker.io/library/fedora:37
+  script:
+    - dnf install -y rust cargo rpm-build rpmdevtools rust-packaging dnf-plugins-core curl
+    - rpmdev-setuptree
+    - cp ./rust-nm-reactor.spec ~/rpmbuild/SPECS/
+    - spectool -g -R ~/rpmbuild/SPECS/rust-nm-reactor.spec
+    - dnf builddep -y ~/rpmbuild/SPECS/rust-nm-reactor.spec
+    - rpmbuild -ba ~/rpmbuild/SPECS/rust-nm-reactor.spec
+    - |
+      for file in ~/rpmbuild/RPMS/**/*.rpm; curl --header "JOB-TOKEN: ${CI_JOB_TOKEN}" --upload-file ${file} ${PACKAGE_REGISTRY_URL}/$(basename $file); done
diff --git a/rust-nm-reactor.spec b/rust-nm-reactor.spec
new file mode 100644
index 0000000000000000000000000000000000000000..ec1913f32e4fcc4c9b4c6192dbbf574fa0716264
--- /dev/null
+++ b/rust-nm-reactor.spec
@@ -0,0 +1,78 @@
+# Initially generated by rust2rpm 23. Manually modified to support building
+# using crates not available from crates.io. As a result, this package cannot
+# be built offline. It is primarily intended for CI builds.
+%bcond_without check
+
+%global crate nm-reactor
+
+Name:           rust-nm-reactor
+Version:        0.1.1
+Release:        %autorelease
+Summary:        NetworkManager reactor
+
+License:        BSD-3-Clause
+URL:            https://gitlab.chromabits.com/etcinit/nm-reactor
+Source:         https://gitlab.chromabits.com/etcinit/nm-reactor/-/archive/%{version}/nm-reactor-%{version}.tar.gz
+
+BuildRequires:  rust-packaging >= 21
+BuildRequires:  dbus-devel
+
+%global _description %{expand:
+NetworkManager reactor. If-this-then-that for NetworkManager.}
+
+%description %{_description}
+
+%package     -n %{crate}
+Summary:        %{summary}
+
+%description -n %{crate} %{_description}
+
+%files       -n %{crate}
+%license LICENSE
+%doc README.md
+%{_bindir}/nm-reactor
+
+%prep
+%autosetup -n %{crate}-%{version_no_tilde} -p1
+set -eu
+%{__mkdir} -p .cargo
+	
+cat > .cargo/config << EOF
+[build]
+rustc = "%{__rustc}"
+rustdoc = "%{__rustdoc}"
+	
+[env]
+CFLAGS = "%{build_cflags}"
+CXXFLAGS = "%{build_cxxflags}"
+LDFLAGS = "%{build_ldflags}"
+	
+[install]
+root = "%{buildroot}%{_prefix}"
+	
+[term]
+verbose = true
+	
+[source]
+	
+[source.local-registry]
+directory = "%{cargo_registry}"
+EOF
+
+%{__rm} -f Cargo.lock
+%{__rm} -f Cargo.toml.orig
+
+%build
+%cargo_build
+
+%install
+%cargo_install
+
+%if %{with check}
+%check
+%cargo_test
+%endif
+
+%changelog
+%autochangelog
+