diff --git a/Jenkinsfile b/Jenkinsfile
index 9212ba6039704c09c1fe0469c1ee737bc21b3288..8e4ecf0afb0912607d7cec82666ff4ac85e54ff1 100644
--- a/Jenkinsfile
+++ b/Jenkinsfile
@@ -10,6 +10,12 @@
 
 // Configuration globals.
 def SUBMODULES = ['daemon', 'lrc', 'client-gnome', 'client-qt']
+def TARGETS = [:]
+def SSH_PRIVATE_KEY = '/var/lib/jenkins/.ssh/gplpriv'
+def REMOTE_HOST = env.SSH_HOST_DL_RING_CX
+def REMOTE_BASE_DIR = '/srv/repository/ring'
+def RING_PUBLIC_KEY_FINGERPRINT = 'A295D773307D25A33AE72F2F64CD5FA175348F84'
+def SNAPCRAFT_KEY = '/var/lib/jenkins/.snap/key'
 
 pipeline {
     agent {
@@ -32,12 +38,18 @@ pipeline {
         booleanParam(name: 'BUILD_ARM',
                      defaultValue: false,
                      description: 'Whether to build ARM packages.')
+        booleanParam(name: 'DEPLOY',
+                     defaultValue: false,
+                     description: 'Whether and where to deploy packages.')
+        choice(name: 'CHANNEL',
+               choices: 'internal\nnightly\nstable',
+               description: 'The repository channel to deploy to. ' +
+               'Defaults to "internal".')
         string(name: 'PACKAGING_TARGETS',
                defaultValue: '',
                description: 'A whitespace-separated list of packaging ' +
                'targets, e.g. "package-debian_10 package-snap". ' +
                'When left unspecified, all the packaging targets are built.')
-
     }
 
     environment {
@@ -119,6 +131,8 @@ See https://wiki.savoirfairelinux.com/wiki/Jenkins.jami.net#Configuration"
                                        tar xf *.tar.gz --strip-components=1
                                        make ${target}
                                        """
+                                    stash(includes: 'packages/**',
+                                          name: target)
                                 }
                             }
                         }
@@ -127,5 +141,34 @@ See https://wiki.savoirfairelinux.com/wiki/Jenkins.jami.net#Configuration"
                 }
             }
         }
+        stage('Sign & deploy packages') {
+            agent {
+                label 'ring-buildmachine-02.mtl.sfl'
+            }
+
+            when {
+                expression {
+                    params.DEPLOY
+                }
+            }
+
+            steps {
+                script {
+                    TARGETS.each { target ->
+                        unstash target
+                        def distribution = target - ~/^package-/
+                        echo "Deploying packages for ${distribution}..."
+                        sh """scripts/deploy-packages.sh \
+  --distribution=${distribution} \
+  --keyid="${RING_PUBLIC_KEY_FINGERPRINT}" \
+  --snapcraft-login="${SNAPCRAFT_KEY}" \
+  --remote-ssh-identity-file="${SSH_PRIVATE_KEY}" \
+  --remote-repository-location="${REMOTE_HOST}:${REMOTE_BASE_DIR}/${params.CHANNEL}" \
+  --remote-manual-download-location="${REMOTE_HOST}:${REMOTE_BASE_DIR}/manual-${params.CHANNEL}"
+"""
+                    }
+                }
+            }
+        }
     }
 }