diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 19832a09cf6a1ad97880bdaf16d2bf7452d162da..d9f76757ee802abc53b912258620b3a92c1318af 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -1,8 +1,15 @@
 stages:
   - test
   - build
+  - upload
   - release
 
+variables:
+  BINARY_NAME: "freva-ingest"
+  VERSION: "${CI_COMMIT_TAG}"
+  LINUX_AMD64_BINARY: "${BINARY_NAME}-linux-amd64-${VERSION}"
+  PACKAGE_REGISTRY_URL: "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/freva/freva-ingest/${PACKAGE_VERSION}"
+
 default:
   image: rust:latest
   tags:
@@ -27,8 +34,8 @@ test:
   script:
     - cargo test
 
-build:
-  stage: release
+build-linux:
+  stage: build
   script:
     - cargo build --release
   artifacts:
@@ -36,3 +43,23 @@ build:
       - target/release/freva-ingest
   rules:
     - if: $CI_COMMIT_TAG
+
+upload:
+  stage: upload
+  image: curlimages/curl:latest
+  rules:
+    - if: $CI_COMMIT_TAG
+  script:
+    - |
+      curl --header "JOB-TOKEN: ${CI_JOB_TOKEN}" \
+      --upload-file target/release/${BINARY_NAME} "${PACKAGE_REGISTRY_URL}/${LINUX_AMD64_BINARY}"
+
+release:
+  stage: release
+  image: registry.gitlab.com/gitlab-org/release-cli:latest
+  rules:
+    - if: $CI_COMMIT_TAG
+  script:
+    - |
+      release-cli create --name "Release $CI_COMMIT_TAG" --tag-name $CI_COMMIT_TAG \
+        --assets-link "{\"name\":\"${LINUX_AMD64_BINARY}\",\"url\":\"${PACKAGE_REGISTRY_URL}/${LINUX_AMD64_BINARY}\"}"